Linux/linux 50f44eedrivers/dax device.c, drivers/nvdimm pmem.c

mm/devm_memremap_pages: fix final page put race

Logan noticed that devm_memremap_pages_release() kills the percpu_ref
drops all the page references that were acquired at init and then
immediately proceeds to unplug, arch_remove_memory(), the backing pages
for the pagemap.  If for some reason device shutdown actually collides
with a busy / elevated-ref-count page then arch_remove_memory() should
be deferred until after that reference is dropped.

As it stands the "wait for last page ref drop" happens *after*
devm_memremap_pages_release() returns, which is obviously too late and
can lead to crashes.

Fix this situation by assigning the responsibility to wait for the
percpu_ref to go idle to devm_memremap_pages() with a new ->cleanup()
callback.  Implement the new cleanup callback for all
devm_memremap_pages() users: pmem, devdax, hmm, and p2pdma.

Link: http://lkml.kernel.org/r/155727339156.292046.5432007428235387859.stgit@dwillia2-desk3.amr.corp.intel.com
Fixes: 41e94a851304 ("add devm_memremap_pages")
Signed-off-by: Dan Williams <dan.j.williams at intel.com>
Reported-by: Logan Gunthorpe <logang at deltatee.com>
Reviewed-by: Ira Weiny <ira.weiny at intel.com>
Reviewed-by: Logan Gunthorpe <logang at deltatee.com>
Cc: Bjorn Helgaas <bhelgaas at google.com>
Cc: "Jérôme Glisse" <jglisse at redhat.com>
Cc: Christoph Hellwig <hch at lst.de>
Cc: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
Cc: "Rafael J. Wysocki" <rafael at kernel.org>
Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
DeltaFile
+13-4drivers/nvdimm/pmem.c
+3-14drivers/pci/p2pdma.c
+12-5kernel/memremap.c
+3-11mm/hmm.c
+3-10drivers/dax/device.c
+2-0include/linux/memremap.h
+2-0tools/testing/nvdimm/test/iomap.c
+38-447 files

UnifiedSplitRaw