[PATCH v2 3/5] mm: use mapcount for identifying zbud pages
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 Reviewed-by: Seth Jennings --- 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(>_mapcount, -1); } +#ifdef CONFIG_ZBUD +static inline int PageZbud(struct page *page) +{ + return atomic_read(>_mapcount) == PAGE_ZBUD_MAPCOUNT_VALUE; +} + +static inline void SetPageZbud(struct page *page) +{ + VM_BUG_ON(atomic_read(>_mapcount) != -1); + atomic_set(>_mapcount, PAGE_ZBUD_MAPCOUNT_VALUE); +} + +static inline void ClearPageZbud(struct page *page) +{ + VM_BUG_ON(!PageZbud(page)); + atomic_set(>_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 1d5b26b..9be160c 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 from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH v2 3/5] mm: use mapcount for identifying zbud pages
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.kozlow...@samsung.com Reviewed-by: Seth Jennings sjenn...@linux.vnet.ibm.com --- 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 1d5b26b..9be160c 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 from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/