Currently zbud pages do not have any flags set so it is not possible to identify them during migration or compaction. Implement PageZbud() by comparing page->_mapcount to -127 to distinguish pages allocated by zbud. Just like PageBuddy() is implemented. Signed-off-by: Krzysztof Kozlowski <k.kozlowski@xxxxxxxxxxx> --- include/linux/mm.h | 23 +++++++++++++++++++++++ mm/zbud.c | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/include/linux/mm.h b/include/linux/mm.h index f022460..b9ae6f2 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -440,6 +440,7 @@ static inline void init_page_count(struct page *page) * efficiently by most CPU architectures. */ #define PAGE_BUDDY_MAPCOUNT_VALUE (-128) +#define PAGE_ZBUD_MAPCOUNT_VALUE (-127) static inline int PageBuddy(struct page *page) { @@ -458,6 +459,28 @@ static inline void __ClearPageBuddy(struct page *page) atomic_set(&page->_mapcount, -1); } +#ifdef CONFIG_ZBUD +static inline int PageZbud(struct page *page) +{ + return atomic_read(&page->_mapcount) == PAGE_ZBUD_MAPCOUNT_VALUE; +} + +static inline void SetPageZbud(struct page *page) +{ + VM_BUG_ON(atomic_read(&page->_mapcount) != -1); + atomic_set(&page->_mapcount, PAGE_ZBUD_MAPCOUNT_VALUE); +} + +static inline void ClearPageZbud(struct page *page) +{ + VM_BUG_ON(!PageZbud(page)); + atomic_set(&page->_mapcount, -1); +} +#else +PAGEFLAG_FALSE(Zbud) +#endif + + void put_page(struct page *page); void put_pages_list(struct list_head *pages); diff --git a/mm/zbud.c b/mm/zbud.c index aa9a15c..9267cd9 100644 --- a/mm/zbud.c +++ b/mm/zbud.c @@ -197,7 +197,10 @@ static void get_zbud_page(struct zbud_header *zhdr) static int put_zbud_page(struct zbud_header *zhdr) { struct page *page = virt_to_page(zhdr); + VM_BUG_ON(!PageZbud(page)); + if (put_page_testzero(page)) { + ClearPageZbud(page); free_hot_cold_page(page, 0); return 1; } @@ -307,6 +310,7 @@ int zbud_alloc(struct zbud_pool *pool, int size, gfp_t gfp, * don't increase the page count. */ zhdr = init_zbud_page(page); + SetPageZbud(page); bud = FIRST; found: -- 1.7.9.5 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>