Re: [PATCH v1 10/16] mm/memory: use __zap_vma_range() in zap_vma_for_reaping()
From: "Lorenzo Stoakes (Oracle)" <ljs@kernel.org>
Date: 2026-03-06 12:26:34
Also in:
bpf, dri-devel, intel-gfx, kvm, linux-fsdevel, linux-mm, linux-perf-users, linux-rdma, linux-s390, lkml, netdev, rust-for-linux
On Fri, Feb 27, 2026 at 09:08:41PM +0100, David Hildenbrand (Arm) wrote:
Let's call __zap_vma_range() instead of unmap_page_range() to prepare for further cleanups. To keep the existing behavior, whereby we do not call uprobe_munmap() which could block, add a new "reaping" member to zap_details and use it.
I am always in favour of making further use of helper structs :)
Likely we should handle the possible blocking in uprobe_munmap() differently, but for now keep it unchanged. Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
OK this looks like it's doing the equivalent of what was there before, so: Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
quoted hunk ↗ jump to hunk
--- include/linux/mm.h | 1 + mm/memory.c | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-)diff --git a/include/linux/mm.h b/include/linux/mm.h index 21b67c203e62..4710f7c7495a 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h@@ -2800,6 +2800,7 @@ struct zap_details { struct folio *single_folio; /* Locked folio to be unmapped */ bool skip_cows; /* Do not zap COWed private pages */ bool reclaim_pt; /* Need reclaim page tables? */ + bool reaping; /* Reaping, do not block. */ zap_flags_t zap_flags; /* Extra flags for zapping */ };diff --git a/mm/memory.c b/mm/memory.c index 7d7c24c6917c..394b2e931974 100644 --- a/mm/memory.c +++ b/mm/memory.c@@ -2079,14 +2079,18 @@ static void __zap_vma_range(struct mmu_gather *tlb, struct vm_area_struct *vma, unsigned long start, unsigned long end, struct zap_details *details) { + const bool reaping = details && details->reaping; + VM_WARN_ON_ONCE(start >= end || !range_in_vma(vma, start, end)); - if (vma->vm_file) + /* uprobe_munmap() might sleep, so skip it when reaping. */ + if (vma->vm_file && !reaping) uprobe_munmap(vma, start, end); if (unlikely(is_vm_hugetlb_page(vma))) { zap_flags_t zap_flags = details ? details->zap_flags : 0; + VM_WARN_ON_ONCE(reaping); /* * vm_file will be NULL when we fail early while instantiating * a new mapping. In this case, no pages were mapped yet and@@ -2111,11 +2115,12 @@ static void __zap_vma_range(struct mmu_gather *tlb, struct vm_area_struct *vma, */ int zap_vma_for_reaping(struct vm_area_struct *vma) { + struct zap_details details = { + .reaping = true, + }; struct mmu_notifier_range range; struct mmu_gather tlb; - VM_WARN_ON_ONCE(is_vm_hugetlb_page(vma)); -
I guess because you've moved this safety check into __zap_vma_range()?
quoted hunk ↗ jump to hunk
mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, vma->vm_mm, vma->vm_start, vma->vm_end); tlb_gather_mmu(&tlb, vma->vm_mm);@@ -2123,7 +2128,7 @@ int zap_vma_for_reaping(struct vm_area_struct *vma) tlb_finish_mmu(&tlb); return -EBUSY; } - unmap_page_range(&tlb, vma, range.start, range.end, NULL); + __zap_vma_range(&tlb, vma, range.start, range.end, &details); mmu_notifier_invalidate_range_end(&range); tlb_finish_mmu(&tlb); return 0; --2.43.0