diff options
Diffstat (limited to 'include/linux/balloon_compaction.h')
| -rw-r--r-- | include/linux/balloon_compaction.h | 51 | 
1 files changed, 15 insertions, 36 deletions
| diff --git a/include/linux/balloon_compaction.h b/include/linux/balloon_compaction.h index 9b0a15d06a4f..79542b2698ec 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 inode *inode;  };  extern struct page *balloon_page_enqueue(struct balloon_dev_info *b_dev_info); @@ -73,45 +75,19 @@ 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->inode = 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);  /* - * __is_movable_balloon_page - helper to perform @page PageBalloon tests - */ -static inline bool __is_movable_balloon_page(struct page *page) -{ -	return PageBalloon(page); -} - -/* - * balloon_page_movable - test PageBalloon to identify balloon pages - *			  and PagePrivate to check that the page is not - *			  isolated and can be moved by compaction/migration. - * - * As we might return false positives in the case of a balloon page being just - * released under us, this need to be re-tested later, under the page lock. - */ -static inline bool balloon_page_movable(struct page *page) -{ -	return PageBalloon(page) && PagePrivate(page); -} - -/* - * isolated_balloon_page - identify an isolated balloon page on private - *			   compaction/migration page lists. - */ -static inline bool isolated_balloon_page(struct page *page) -{ -	return PageBalloon(page); -} - -/*   * balloon_page_insert - insert a page into the balloon's page list and make   *			 the page->private assignment accordingly.   * @balloon : pointer to balloon device @@ -124,7 +100,7 @@ static inline void balloon_page_insert(struct balloon_dev_info *balloon,  				       struct page *page)  {  	__SetPageBalloon(page); -	SetPagePrivate(page); +	__SetPageMovable(page, balloon->inode->i_mapping);  	set_page_private(page, (unsigned long)balloon);  	list_add(&page->lru, &balloon->pages);  } @@ -140,11 +116,14 @@ static inline void balloon_page_insert(struct balloon_dev_info *balloon,  static inline void balloon_page_delete(struct page *page)  {  	__ClearPageBalloon(page); +	__ClearPageMovable(page);  	set_page_private(page, 0); -	if (PagePrivate(page)) { -		ClearPagePrivate(page); +	/* +	 * No touch page.lru field once @page has been isolated +	 * because VM is using the field. +	 */ +	if (!PageIsolated(page))  		list_del(&page->lru); -	}  }  /* |