Re: [RFC 2/4] mm/balloon: apply driver page migratable into balloon driver

2015-06-03 Thread Konstantin Khlebnikov
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

2015-06-02 Thread Gioh Kim
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

2015-06-02 Thread Gioh Kim




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