]> git.itanic.dy.fi Git - linux-stable/commitdiff
mm, dev_pagemap: Do not clear ->mapping on final put
authorDan Williams <dan.j.williams@intel.com>
Sat, 14 Jul 2018 04:50:01 +0000 (21:50 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 9 Sep 2018 08:32:41 +0000 (10:32 +0200)
commit 2fa147bdbf672c53386a8f5f2c7fe358004c3ef8 upstream.

MEMORY_DEVICE_FS_DAX relies on typical page semantics whereby ->mapping
is only ever cleared by truncation, not final put.

Without this fix dax pages may forget their mapping association at the
end of every page pin event.

Move this atypical behavior that HMM wants into the HMM ->page_free()
callback.

Cc: <stable@vger.kernel.org>
Cc: Jan Kara <jack@suse.cz>
Cc: Jérôme Glisse <jglisse@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Fixes: d2c997c0f145 ("fs, dax: use page->mapping...")
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Acked-by: Jérôme Glisse <jglisse@redhat.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
kernel/memremap.c
mm/hmm.c

index 38283363da06d40057ddfe71c3c8ec1a2c7a94d2..cfb750105e1e01f9c14faeb3f7c5db3ba660493a 100644 (file)
@@ -355,7 +355,6 @@ void __put_devmap_managed_page(struct page *page)
                __ClearPageActive(page);
                __ClearPageWaiters(page);
 
-               page->mapping = NULL;
                mem_cgroup_uncharge(page);
 
                page->pgmap->page_free(page, page->pgmap->data);
index de7b6bf7720104fa9312dab54618d7cc425c3f05..f9d1d89dec4d66d4948c2c4de3602e0878efa7ca 100644 (file)
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -963,6 +963,8 @@ static void hmm_devmem_free(struct page *page, void *data)
 {
        struct hmm_devmem *devmem = data;
 
+       page->mapping = NULL;
+
        devmem->ops->free(devmem, page);
 }