[PATCH 20/39] mm/gup: error out early on !VMA_MAYREAD_BIT VMAs
From: Lorenzo Stoakes (ARM)
Date: Tue Sep 08 2026 - 16:19:31 EST
When populating a VMA range via the aptly named populate_vma_page_range()
an unreadable VMA will always eventually fail with -EFAULT.
That a VMA is accessible is always checked, however VMA_MAYREAD_BIT is not.
All user mappings always have VMA_MAYREAD_BIT set, so this check only
impacts kernel mappings.
It is implemented specifically to disallow population of uprobes XOL
mappings which are exec-only.
A nasty interaction with these mappings may occur if they are mlocked, so
actively disallow this early.
This allows a subsequent commit to remove the VM_IO check in
__mm_populate() which otherwise requires non-MMIO mappings to be wrongly
flagged simply as a workaround.
Signed-off-by: Lorenzo Stoakes (ARM) <ljs@xxxxxxxxxx>
---
mm/gup.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/mm/gup.c b/mm/gup.c
index a4036c02e213..f5dc227bd6e1 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -1836,6 +1836,10 @@ long populate_vma_page_range(struct vm_area_struct *vma,
if (!vma_is_accessible(vma))
return -EFAULT;
+ /* Unreadable VMAs also cannot be faulted in. */
+ if (!vma_test(vma, VMA_MAYREAD_BIT))
+ return -EFAULT;
+
gup_flags = FOLL_TOUCH;
/*
* We want to touch writable mappings with a write fault in order
--
2.55.0