[PATCH 38/49] mm/sparse-vmemmap: remap the shared tail pages as read-only

Muchun Song
2026-04-05T12:57:34Z

HugeTLB enforces Read-Only mappings for HVO to prevent illegal
write operations, whereas DAX currently does not, which introduces
potential security risks.

Now that we are unifying the HVO logic for HugeTLB and DAX, we can
remap the shared tail pages as read-only directly in
vmemmap_pte_populate(). This ensures that both HugeTLB and DAX
benefit from the read-only protection of vmemmap tail pages right
from the point of mapping establishment.

Signed-off-by: Muchun Song <songmuchun@bytedance.com>
---
mm/sparse-vmemmap.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c
index fd7b0e1e5aba..c70275717054 100644
--- a/mm/sparse-vmemmap.c
+++ b/mm/sparse-vmemmap.c
@@ -176,14 +176,17 @@ static pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, in
if (slab_is_available())
get_page(page);
ptpfn = page_to_pfn(page);
+
+ /* Remap shared tail page read-only to catch illegal writes. */
+ entry = pfn_pte(ptpfn, PAGE_KERNEL_RO);
} else {
void *p = vmemmap_alloc_block_buf(PAGE_SIZE, node, altmap);

if (!p)
return NULL;
ptpfn = PHYS_PFN(__pa(p));
+ entry = pfn_pte(ptpfn, PAGE_KERNEL);
}
- entry = pfn_pte(ptpfn, PAGE_KERNEL);
set_pte_at(&init_mm, addr, pte, entry);

return pte;
--
2.20.1