Re: [RFC 2/4] mm/balloon: apply driver page migratable into balloon driver
On Tue, Jun 2, 2015 at 10:27 AM, Gioh Kim gioh@lge.com wrote: Apply driver page migration into balloon driver. Signed-off-by: Gioh Kim gioh@lge.com --- drivers/virtio/virtio_balloon.c| 2 ++ fs/proc/page.c | 4 +-- include/linux/balloon_compaction.h | 42 --- include/linux/mm.h | 19 --- include/uapi/linux/kernel-page-flags.h | 2 +- mm/balloon_compaction.c| 61 -- 6 files changed, 94 insertions(+), 36 deletions(-) diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 6a356e3..cdd0038 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -496,6 +496,8 @@ static int virtballoon_probe(struct virtio_device *vdev) balloon_devinfo_init(vb-vb_dev_info); #ifdef CONFIG_BALLOON_COMPACTION vb-vb_dev_info.migratepage = virtballoon_migratepage; + vb-vb_dev_info.mapping = balloon_mapping_alloc(vb-vb_dev_info, + balloon_aops); #endif err = init_vqs(vb); diff --git a/fs/proc/page.c b/fs/proc/page.c index 7eee2d8..e741307 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c @@ -143,8 +143,8 @@ u64 stable_page_flags(struct page *page) if (PageBuddy(page)) u |= 1 KPF_BUDDY; - if (PageBalloon(page)) - u |= 1 KPF_BALLOON; + if (PageMigratable(page)) + u |= 1 KPF_MIGRATABLE; u |= kpf_copy_bit(k, KPF_LOCKED,PG_locked); diff --git a/include/linux/balloon_compaction.h b/include/linux/balloon_compaction.h index 9b0a15d..0989e96 100644 --- a/include/linux/balloon_compaction.h +++ b/include/linux/balloon_compaction.h @@ -48,6 +48,7 @@ #include linux/migrate.h #include linux/gfp.h #include linux/err.h +#include linux/fs.h /* * Balloon device information descriptor. @@ -62,6 +63,7 @@ struct balloon_dev_info { struct list_head pages; /* Pages enqueued handled to Host */ int (*migratepage)(struct balloon_dev_info *, struct page *newpage, struct page *page, enum migrate_mode mode); + struct address_space *mapping; }; extern struct page *balloon_page_enqueue(struct balloon_dev_info *b_dev_info); @@ -73,24 +75,37 @@ static inline void balloon_devinfo_init(struct balloon_dev_info *balloon) spin_lock_init(balloon-pages_lock); INIT_LIST_HEAD(balloon-pages); balloon-migratepage = NULL; + balloon-mapping = NULL; } #ifdef CONFIG_BALLOON_COMPACTION -extern bool balloon_page_isolate(struct page *page); +extern const struct address_space_operations balloon_aops; +extern bool balloon_page_isolate(struct page *page, +isolate_mode_t mode); extern void balloon_page_putback(struct page *page); -extern int balloon_page_migrate(struct page *newpage, +extern int balloon_page_migrate(struct address_space *mapping, + struct page *newpage, struct page *page, enum migrate_mode mode); +extern struct address_space +*balloon_mapping_alloc(struct balloon_dev_info *b_dev_info, + const struct address_space_operations *a_ops); + +static inline void balloon_mapping_free(struct address_space *balloon_mapping) +{ + kfree(balloon_mapping); +} + /* - * __is_movable_balloon_page - helper to perform @page PageBalloon tests + * __is_movable_balloon_page - helper to perform @page PageMigratable tests */ static inline bool __is_movable_balloon_page(struct page *page) { - return PageBalloon(page); + return PageMigratable(page); } /* - * balloon_page_movable - test PageBalloon to identify balloon pages + * balloon_page_movable - test PageMigratable to identify balloon pages * and PagePrivate to check that the page is not * isolated and can be moved by compaction/migration. * @@ -99,7 +114,7 @@ static inline bool __is_movable_balloon_page(struct page *page) */ static inline bool balloon_page_movable(struct page *page) { - return PageBalloon(page) PagePrivate(page); + return PageMigratable(page) PagePrivate(page); } /* @@ -108,7 +123,7 @@ static inline bool balloon_page_movable(struct page *page) */ static inline bool isolated_balloon_page(struct page *page) { - return PageBalloon(page); + return PageMigratable(page); } /* @@ -123,7 +138,8 @@ static inline bool isolated_balloon_page(struct page *page) static inline void balloon_page_insert(struct balloon_dev_info *balloon, struct page *page) { - __SetPageBalloon(page); + page-mapping = balloon-mapping; + __SetPageMigratable(page);
[RFC 2/4] mm/balloon: apply driver page migratable into balloon driver
Apply driver page migration into balloon driver. Signed-off-by: Gioh Kim gioh@lge.com --- drivers/virtio/virtio_balloon.c| 2 ++ fs/proc/page.c | 4 +-- include/linux/balloon_compaction.h | 42 --- include/linux/mm.h | 19 --- include/uapi/linux/kernel-page-flags.h | 2 +- mm/balloon_compaction.c| 61 -- 6 files changed, 94 insertions(+), 36 deletions(-) diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 6a356e3..cdd0038 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -496,6 +496,8 @@ static int virtballoon_probe(struct virtio_device *vdev) balloon_devinfo_init(vb-vb_dev_info); #ifdef CONFIG_BALLOON_COMPACTION vb-vb_dev_info.migratepage = virtballoon_migratepage; + vb-vb_dev_info.mapping = balloon_mapping_alloc(vb-vb_dev_info, + balloon_aops); #endif err = init_vqs(vb); diff --git a/fs/proc/page.c b/fs/proc/page.c index 7eee2d8..e741307 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c @@ -143,8 +143,8 @@ u64 stable_page_flags(struct page *page) if (PageBuddy(page)) u |= 1 KPF_BUDDY; - if (PageBalloon(page)) - u |= 1 KPF_BALLOON; + if (PageMigratable(page)) + u |= 1 KPF_MIGRATABLE; u |= kpf_copy_bit(k, KPF_LOCKED,PG_locked); diff --git a/include/linux/balloon_compaction.h b/include/linux/balloon_compaction.h index 9b0a15d..0989e96 100644 --- a/include/linux/balloon_compaction.h +++ b/include/linux/balloon_compaction.h @@ -48,6 +48,7 @@ #include linux/migrate.h #include linux/gfp.h #include linux/err.h +#include linux/fs.h /* * Balloon device information descriptor. @@ -62,6 +63,7 @@ struct balloon_dev_info { struct list_head pages; /* Pages enqueued handled to Host */ int (*migratepage)(struct balloon_dev_info *, struct page *newpage, struct page *page, enum migrate_mode mode); + struct address_space *mapping; }; extern struct page *balloon_page_enqueue(struct balloon_dev_info *b_dev_info); @@ -73,24 +75,37 @@ static inline void balloon_devinfo_init(struct balloon_dev_info *balloon) spin_lock_init(balloon-pages_lock); INIT_LIST_HEAD(balloon-pages); balloon-migratepage = NULL; + balloon-mapping = NULL; } #ifdef CONFIG_BALLOON_COMPACTION -extern bool balloon_page_isolate(struct page *page); +extern const struct address_space_operations balloon_aops; +extern bool balloon_page_isolate(struct page *page, +isolate_mode_t mode); extern void balloon_page_putback(struct page *page); -extern int balloon_page_migrate(struct page *newpage, +extern int balloon_page_migrate(struct address_space *mapping, + struct page *newpage, struct page *page, enum migrate_mode mode); +extern struct address_space +*balloon_mapping_alloc(struct balloon_dev_info *b_dev_info, + const struct address_space_operations *a_ops); + +static inline void balloon_mapping_free(struct address_space *balloon_mapping) +{ + kfree(balloon_mapping); +} + /* - * __is_movable_balloon_page - helper to perform @page PageBalloon tests + * __is_movable_balloon_page - helper to perform @page PageMigratable tests */ static inline bool __is_movable_balloon_page(struct page *page) { - return PageBalloon(page); + return PageMigratable(page); } /* - * balloon_page_movable - test PageBalloon to identify balloon pages + * balloon_page_movable - test PageMigratable to identify balloon pages * and PagePrivate to check that the page is not * isolated and can be moved by compaction/migration. * @@ -99,7 +114,7 @@ static inline bool __is_movable_balloon_page(struct page *page) */ static inline bool balloon_page_movable(struct page *page) { - return PageBalloon(page) PagePrivate(page); + return PageMigratable(page) PagePrivate(page); } /* @@ -108,7 +123,7 @@ static inline bool balloon_page_movable(struct page *page) */ static inline bool isolated_balloon_page(struct page *page) { - return PageBalloon(page); + return PageMigratable(page); } /* @@ -123,7 +138,8 @@ static inline bool isolated_balloon_page(struct page *page) static inline void balloon_page_insert(struct balloon_dev_info *balloon, struct page *page) { - __SetPageBalloon(page); + page-mapping = balloon-mapping; + __SetPageMigratable(page); SetPagePrivate(page); set_page_private(page, (unsigned long)balloon); list_add(page-lru, balloon-pages); @@ -139,7 +155,8 @@ static inline void balloon_page_insert(struct
Re: [RFC 2/4] mm/balloon: apply driver page migratable into balloon driver
On Tue, Jun 2, 2015 at 10:27 AM, Gioh Kim gioh@lge.com wrote: Apply driver page migration into balloon driver. Signed-off-by: Gioh Kim gioh@lge.com --- drivers/virtio/virtio_balloon.c| 2 ++ fs/proc/page.c | 4 +-- include/linux/balloon_compaction.h | 42 --- include/linux/mm.h | 19 --- include/uapi/linux/kernel-page-flags.h | 2 +- mm/balloon_compaction.c| 61 -- 6 files changed, 94 insertions(+), 36 deletions(-) diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 6a356e3..cdd0038 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -496,6 +496,8 @@ static int virtballoon_probe(struct virtio_device *vdev) balloon_devinfo_init(vb-vb_dev_info); #ifdef CONFIG_BALLOON_COMPACTION vb-vb_dev_info.migratepage = virtballoon_migratepage; + vb-vb_dev_info.mapping = balloon_mapping_alloc(vb-vb_dev_info, + balloon_aops); #endif err = init_vqs(vb); diff --git a/fs/proc/page.c b/fs/proc/page.c index 7eee2d8..e741307 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c @@ -143,8 +143,8 @@ u64 stable_page_flags(struct page *page) if (PageBuddy(page)) u |= 1 KPF_BUDDY; - if (PageBalloon(page)) - u |= 1 KPF_BALLOON; + if (PageMigratable(page)) + u |= 1 KPF_MIGRATABLE; u |= kpf_copy_bit(k, KPF_LOCKED,PG_locked); diff --git a/include/linux/balloon_compaction.h b/include/linux/balloon_compaction.h index 9b0a15d..0989e96 100644 --- a/include/linux/balloon_compaction.h +++ b/include/linux/balloon_compaction.h @@ -48,6 +48,7 @@ #include linux/migrate.h #include linux/gfp.h #include linux/err.h +#include linux/fs.h /* * Balloon device information descriptor. @@ -62,6 +63,7 @@ struct balloon_dev_info { struct list_head pages; /* Pages enqueued handled to Host */ int (*migratepage)(struct balloon_dev_info *, struct page *newpage, struct page *page, enum migrate_mode mode); + struct address_space *mapping; }; extern struct page *balloon_page_enqueue(struct balloon_dev_info *b_dev_info); @@ -73,24 +75,37 @@ static inline void balloon_devinfo_init(struct balloon_dev_info *balloon) spin_lock_init(balloon-pages_lock); INIT_LIST_HEAD(balloon-pages); balloon-migratepage = NULL; + balloon-mapping = NULL; } #ifdef CONFIG_BALLOON_COMPACTION -extern bool balloon_page_isolate(struct page *page); +extern const struct address_space_operations balloon_aops; +extern bool balloon_page_isolate(struct page *page, +isolate_mode_t mode); extern void balloon_page_putback(struct page *page); -extern int balloon_page_migrate(struct page *newpage, +extern int balloon_page_migrate(struct address_space *mapping, + struct page *newpage, struct page *page, enum migrate_mode mode); +extern struct address_space +*balloon_mapping_alloc(struct balloon_dev_info *b_dev_info, + const struct address_space_operations *a_ops); + +static inline void balloon_mapping_free(struct address_space *balloon_mapping) +{ + kfree(balloon_mapping); +} + /* - * __is_movable_balloon_page - helper to perform @page PageBalloon tests + * __is_movable_balloon_page - helper to perform @page PageMigratable tests */ static inline bool __is_movable_balloon_page(struct page *page) { - return PageBalloon(page); + return PageMigratable(page); } /* - * balloon_page_movable - test PageBalloon to identify balloon pages + * balloon_page_movable - test PageMigratable to identify balloon pages * and PagePrivate to check that the page is not * isolated and can be moved by compaction/migration. * @@ -99,7 +114,7 @@ static inline bool __is_movable_balloon_page(struct page *page) */ static inline bool balloon_page_movable(struct page *page) { - return PageBalloon(page) PagePrivate(page); + return PageMigratable(page) PagePrivate(page); } /* @@ -108,7 +123,7 @@ static inline bool balloon_page_movable(struct page *page) */ static inline bool isolated_balloon_page(struct page *page) { - return PageBalloon(page); + return PageMigratable(page); } /* @@ -123,7 +138,8 @@ static inline bool isolated_balloon_page(struct page *page) static inline void balloon_page_insert(struct balloon_dev_info *balloon, struct page *page) { - __SetPageBalloon(page); + page-mapping = balloon-mapping; + __SetPageMigratable(page); SetPagePrivate(page); set_page_private(page, (unsigned