Convert mshv_region_hmm_fault_and_lock() to use hmm_range_fault_unlocked() instead of taking mmap_read_lock() around hmm_range_fault() directly.
This lets the HMM helper own the mmap read lock and allows the MSHV fault path to handle mappings whose fault handlers may drop mmap_lock, including userfaultfd-backed VMAs. The existing caller already retries on -EBUSY after refreshing the mmu_interval_notifier sequence, so no control flow change is needed beyond using the unlocked helper. Signed-off-by: Stanislav Kinsburskii <[email protected]> --- drivers/hv/mshv_regions.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/drivers/hv/mshv_regions.c b/drivers/hv/mshv_regions.c index 6d65e5b42152..04676f06c5c7 100644 --- a/drivers/hv/mshv_regions.c +++ b/drivers/hv/mshv_regions.c @@ -388,13 +388,11 @@ int mshv_region_get(struct mshv_mem_region *region) * * This function performs the following steps: * 1. Reads the notifier sequence for the HMM range. - * 2. Acquires a read lock on the memory map. - * 3. Handles HMM faults for the specified range. - * 4. Releases the read lock on the memory map. - * 5. If successful, locks the memory region mutex. - * 6. Verifies if the notifier sequence has changed during the operation. + * 2. Handles HMM faults for the specified range. + * 3. If successful, locks the memory region mutex. + * 4. Verifies if the notifier sequence has changed during the operation. * If it has, releases the mutex and returns -EBUSY to match with - * hmm_range_fault() return code for repeating. + * hmm_range_fault_unlocked() so the caller retries the range fault. * * Return: 0 on success, a negative error code otherwise. */ @@ -404,9 +402,7 @@ static int mshv_region_hmm_fault_and_lock(struct mshv_mem_region *region, int ret; range->notifier_seq = mmu_interval_read_begin(range->notifier); - mmap_read_lock(region->mreg_mni.mm); - ret = hmm_range_fault(range); - mmap_read_unlock(region->mreg_mni.mm); + ret = hmm_range_fault_unlocked(range); if (ret) return ret;

