From 0835cb106e13fdadaf381567618e586c1862247b Mon Sep 17 00:00:00 2001 From: Muchun Song Date: Mon, 1 Jun 2026 16:48:40 +0800 Subject: [PATCH 1/5] mm/sparse-vmemmap: provide generic vmemmap_set_pmd() and vmemmap_check_pmd() The two weak functions are currently no-ops on every architecture, forcing each platform that needs them to duplicate the same handful of lines. Provide a generic implementation: - vmemmap_set_pmd() simply sets a huge PMD with PAGE_KERNEL protection. - vmemmap_check_pmd() verifies that the PMD is present and leaf, then calls the existing vmemmap_verify() helper. Architectures that need special handling can continue to override the weak symbols; everyone else gets the standard version for free. Signed-off-by: Muchun Song Signed-off-by: Linux RISC-V bot --- mm/sparse-vmemmap.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index 6eadb9d116e433..97468576a3b53e 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c @@ -391,12 +391,17 @@ int __meminit vmemmap_populate_hvo(unsigned long addr, unsigned long end, void __weak __meminit vmemmap_set_pmd(pmd_t *pmd, void *p, int node, unsigned long addr, unsigned long next) { + WARN_ON_ONCE(!pmd_set_huge(pmd, virt_to_phys(p), PAGE_KERNEL)); } int __weak __meminit vmemmap_check_pmd(pmd_t *pmd, int node, unsigned long addr, unsigned long next) { - return 0; + if (!pmd_leaf(pmdp_get(pmd))) + return 0; + vmemmap_verify((pte_t *)pmd, node, addr, next); + + return 1; } int __meminit vmemmap_populate_hugepages(unsigned long start, unsigned long end, From 76fe120f877b31a823adf69306e9655b05666b95 Mon Sep 17 00:00:00 2001 From: Muchun Song Date: Mon, 1 Jun 2026 16:48:41 +0800 Subject: [PATCH 2/5] arm64/mm: drop vmemmap_pmd helpers and use generic code The generic implementations now suffice; remove the arm64 copies. Signed-off-by: Muchun Song Acked-by: Will Deacon Signed-off-by: Linux RISC-V bot --- arch/arm64/mm/mmu.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index dd85e093ffdb17..da106e923049a2 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -1775,20 +1775,6 @@ static void free_empty_tables(unsigned long addr, unsigned long end, } #endif -void __meminit vmemmap_set_pmd(pmd_t *pmdp, void *p, int node, - unsigned long addr, unsigned long next) -{ - pmd_set_huge(pmdp, __pa(p), __pgprot(PROT_SECT_NORMAL)); -} - -int __meminit vmemmap_check_pmd(pmd_t *pmdp, int node, - unsigned long addr, unsigned long next) -{ - vmemmap_verify((pte_t *)pmdp, node, addr, next); - - return pmd_leaf(READ_ONCE(*pmdp)); -} - int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, struct vmem_altmap *altmap) { From f677af828d6dcc8aa1ffff9bf0d97ef0600e127e Mon Sep 17 00:00:00 2001 From: Muchun Song Date: Mon, 1 Jun 2026 16:48:42 +0800 Subject: [PATCH 3/5] riscv/mm: drop vmemmap_pmd helpers and use generic code The generic implementations now suffice; remove the riscv copies. Signed-off-by: Muchun Song Signed-off-by: Linux RISC-V bot --- arch/riscv/mm/init.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index fa8d2f6f554b57..3bfa6a1e76f383 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -1359,19 +1359,6 @@ void __init misc_mem_init(void) } #ifdef CONFIG_SPARSEMEM_VMEMMAP -void __meminit vmemmap_set_pmd(pmd_t *pmd, void *p, int node, - unsigned long addr, unsigned long next) -{ - pmd_set_huge(pmd, virt_to_phys(p), PAGE_KERNEL); -} - -int __meminit vmemmap_check_pmd(pmd_t *pmdp, int node, - unsigned long addr, unsigned long next) -{ - vmemmap_verify((pte_t *)pmdp, node, addr, next); - return 1; -} - int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, struct vmem_altmap *altmap) { From 1136e0e8b458c5940f5968d70ae6446e63eab276 Mon Sep 17 00:00:00 2001 From: Muchun Song Date: Mon, 1 Jun 2026 16:48:43 +0800 Subject: [PATCH 4/5] loongarch/mm: drop vmemmap_check_pmd helper and use generic code The generic implementations now suffice; remove the loongarch copies. Signed-off-by: Muchun Song Signed-off-by: Linux RISC-V bot --- arch/loongarch/mm/init.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/arch/loongarch/mm/init.c b/arch/loongarch/mm/init.c index 3f9ab54114c514..e3da6487b54e3a 100644 --- a/arch/loongarch/mm/init.c +++ b/arch/loongarch/mm/init.c @@ -143,17 +143,6 @@ void __meminit vmemmap_set_pmd(pmd_t *pmd, void *p, int node, set_pmd_at(&init_mm, addr, pmd, entry); } -int __meminit vmemmap_check_pmd(pmd_t *pmd, int node, - unsigned long addr, unsigned long next) -{ - int huge = pmd_val(pmdp_get(pmd)) & _PAGE_HUGE; - - if (huge) - vmemmap_verify((pte_t *)pmd, node, addr, next); - - return huge; -} - int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, struct vmem_altmap *altmap) { From 4190cf4bae727e95ea31a67c86329cf2f225f639 Mon Sep 17 00:00:00 2001 From: Muchun Song Date: Mon, 1 Jun 2026 16:48:44 +0800 Subject: [PATCH 5/5] sparc/mm: drop vmemmap_check_pmd helper and use generic code The generic implementations now suffice; remove the sparc copies. Signed-off-by: Muchun Song Signed-off-by: Linux RISC-V bot --- arch/sparc/mm/init_64.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 367c269305e51e..4a089da0a49004 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -2579,17 +2579,6 @@ void __meminit vmemmap_set_pmd(pmd_t *pmd, void *p, int node, pmd_val(*pmd) = pte_base | __pa(p); } -int __meminit vmemmap_check_pmd(pmd_t *pmdp, int node, - unsigned long addr, unsigned long next) -{ - int large = pmd_leaf(*pmdp); - - if (large) - vmemmap_verify((pte_t *)pmdp, node, addr, next); - - return large; -} - int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend, int node, struct vmem_altmap *altmap) {