diff options
| author | Dan Williams <[email protected]> | 2019-06-13 22:56:33 +0000 |
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2019-06-14 03:34:56 +0000 |
| commit | 50f44ee7248ad2f7984ef081974a6ecd09724b3e (patch) | |
| tree | ab753d9044434c94c8e6d70ead68173c2af339f6 /drivers/fpga/ts73xx-fpga.c | |
| parent | PCI/P2PDMA: track pgmap references per resource, not globally (diff) | |
| download | kernel-50f44ee7248ad2f7984ef081974a6ecd09724b3e.tar.gz kernel-50f44ee7248ad2f7984ef081974a6ecd09724b3e.zip | |
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 <[email protected]>
Reported-by: Logan Gunthorpe <[email protected]>
Reviewed-by: Ira Weiny <[email protected]>
Reviewed-by: Logan Gunthorpe <[email protected]>
Cc: Bjorn Helgaas <[email protected]>
Cc: "Jérôme Glisse" <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Cc: "Rafael J. Wysocki" <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Diffstat (limited to 'drivers/fpga/ts73xx-fpga.c')
0 files changed, 0 insertions, 0 deletions
