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 <[email protected]> --- 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
