This does not affect non ZONE_DEVICE page. In order to allow ZONE_DEVICE page to be tracked we need to detect when refcount of a ZONE_DEVICE page reach 1 (not 0 as non ZONE_DEVICE page). This patch just move put_page_testzero() from put_page() to put_zone_device_page() and only for ZONE_DEVICE. It does not add any overhead compare to existing code. Signed-off-by: Jérôme Glisse <jglisse@xxxxxxxxxx> Cc: Dan Williams <dan.j.williams@xxxxxxxxx> Cc: Ross Zwisler <ross.zwisler@xxxxxxxxxxxxxxx> --- include/linux/mm.h | 8 +++++--- kernel/memremap.c | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index 5f01c88..28e8b28 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -793,11 +793,13 @@ static inline void put_page(struct page *page) { page = compound_head(page); + if (unlikely(is_zone_device_page(page))) { + put_zone_device_page(page); + return; + } + if (put_page_testzero(page)) __put_page(page); - - if (unlikely(is_zone_device_page(page))) - put_zone_device_page(page); } #if defined(CONFIG_SPARSEMEM) && !defined(CONFIG_SPARSEMEM_VMEMMAP) diff --git a/kernel/memremap.c b/kernel/memremap.c index 40d4af8..c821946 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -190,6 +190,8 @@ EXPORT_SYMBOL(get_zone_device_page); void put_zone_device_page(struct page *page) { + page_ref_dec(page); + put_dev_pagemap(page->pgmap); } EXPORT_SYMBOL(put_zone_device_page); -- 2.4.11 -- 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>