summaryrefslogtreecommitdiffstats
path: root/mm/swap.c
diff options
context:
space:
mode:
authorJason Gunthorpe2019-06-07 17:10:33 +0200
committerJason Gunthorpe2019-06-27 18:05:02 +0200
commit5a136b4ae327e7f6be9c984a010df8d7ea5a4f83 (patch)
treef4de2700081df24f82818149ecc4c1cd14709785 /mm/swap.c
parentmm/hmm: Remove confusing comment and logic from hmm_release (diff)
downloadkernel-qcow2-linux-5a136b4ae327e7f6be9c984a010df8d7ea5a4f83.tar.gz
kernel-qcow2-linux-5a136b4ae327e7f6be9c984a010df8d7ea5a4f83.tar.xz
kernel-qcow2-linux-5a136b4ae327e7f6be9c984a010df8d7ea5a4f83.zip
mm/hmm: Fix error flows in hmm_invalidate_range_start
If the trylock on the hmm->mirrors_sem fails the function will return without decrementing the notifiers that were previously incremented. Since the caller will not call invalidate_range_end() on EAGAIN this will result in notifiers becoming permanently incremented and deadlock. If the sync_cpu_device_pagetables() required blocking the function will not return EAGAIN even though the device continues to touch the pages. This is a violation of the mmu notifier contract. Switch, and rename, the ranges_lock to a spin lock so we can reliably obtain it without blocking during error unwind. The error unwind is necessary since the notifiers count must be held incremented across the call to sync_cpu_device_pagetables() as we cannot allow the range to become marked valid by a parallel invalidate_start/end() pair while doing sync_cpu_device_pagetables(). Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> Reviewed-by: Ralph Campbell <rcampbell@nvidia.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Tested-by: Philip Yang <Philip.Yang@amd.com>
Diffstat (limited to 'mm/swap.c')
0 files changed, 0 insertions, 0 deletions