* [PATCH v3 0/3] Generalize vmemmap_populate_hugepages to sparc
@ 2025-12-18 17:47 chengkaitao
2025-12-18 17:47 ` [PATCH v3 1/3] sparc: Use vmemmap_populate_hugepages for vmemmap_populate chengkaitao
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: chengkaitao @ 2025-12-18 17:47 UTC (permalink / raw)
To: davem, andreas, akpm, david, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko
Cc: kevin.brodsky, dave.hansen, ziy, chengkaitao, willy,
zhengqi.arch, sparclinux, linux-kernel, linux-mm, chengkaitao
Sparc implement vmemmap_populate using vmemmap_populate_hugepages
to streamline the code. Another benefit is that it allows us to
eliminate the external declarations of vmemmap_p?d_populate
functions and convert them to static functions.
Since vmemmap_populate_hugepages may fallback to vmemmap_populate-
_basepages, which differs from sparc's original implementation.
During the v1 discussion with Mike Rapoport, sparc uses base pages
in the kernel page tables, so it should be able to use them in
vmemmap as well. Consequently, no additional special handling is
required.
Remove unnecessary whitespace from sparc.
Changes in v3:
- Allow sparc to fallback to vmemmap_populate_basepages
- Convert vmemmap_p?d_populate() to static functions
- Split the v1 patch
Changes in v2:
- Revert the whitespace deletions
- Change vmemmap_false_pmd to vmemmap_pte_fallback_allowed
Link to V1:
https://lore.kernel.org/all/20251217120858.18713-1-pilgrimtao@gmail.com/
Chengkaitao (3):
sparc: Use vmemmap_populate_hugepages for vmemmap_populate
mm: Convert vmemmap_p?d_populate() to static functions
sparc: Remove unnecessary whitespace
arch/sparc/mm/fault_64.c | 4 +--
arch/sparc/mm/hypersparc.S | 4 +--
arch/sparc/mm/init_64.c | 53 ++++++++++++--------------------------
arch/sparc/mm/io-unit.c | 12 ++++-----
arch/sparc/mm/iommu.c | 2 +-
arch/sparc/mm/swift.S | 2 +-
arch/sparc/mm/ultra.S | 4 +--
include/linux/mm.h | 7 -----
mm/sparse-vmemmap.c | 10 +++----
9 files changed, 36 insertions(+), 62 deletions(-)
--
2.50.1 (Apple Git-155)
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 1/3] sparc: Use vmemmap_populate_hugepages for vmemmap_populate
2025-12-18 17:47 [PATCH v3 0/3] Generalize vmemmap_populate_hugepages to sparc chengkaitao
@ 2025-12-18 17:47 ` chengkaitao
2025-12-19 9:33 ` Mike Rapoport
2025-12-18 17:47 ` [PATCH v3 2/3] mm: Convert vmemmap_p?d_populate() to static functions chengkaitao
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: chengkaitao @ 2025-12-18 17:47 UTC (permalink / raw)
To: davem, andreas, akpm, david, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko
Cc: kevin.brodsky, dave.hansen, ziy, chengkaitao, willy,
zhengqi.arch, sparclinux, linux-kernel, linux-mm
From: Chengkaitao <chengkaitao@kylinos.cn>
1. In the SPARC architecture, reimplemented vmemmap_populate using
vmemmap_populate_hugepages.
2. Allow the SPARC arch to fallback to vmemmap_populate_basepages(),
when vmemmap_alloc_block returns NULL.
Signed-off-by: Chengkaitao <chengkaitao@kylinos.cn>
---
arch/sparc/mm/init_64.c | 47 ++++++++++++-----------------------------
1 file changed, 14 insertions(+), 33 deletions(-)
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
index df9f7c444c39..f477ab1b4f08 100644
--- a/arch/sparc/mm/init_64.c
+++ b/arch/sparc/mm/init_64.c
@@ -2581,8 +2581,8 @@ unsigned long _PAGE_CACHE __read_mostly;
EXPORT_SYMBOL(_PAGE_CACHE);
#ifdef CONFIG_SPARSEMEM_VMEMMAP
-int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,
- int node, struct vmem_altmap *altmap)
+void __meminit vmemmap_set_pmd(pmd_t *pmd, void *p, int node,
+ unsigned long addr, unsigned long next)
{
unsigned long pte_base;
@@ -2595,39 +2595,20 @@ int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,
pte_base |= _PAGE_PMD_HUGE;
- vstart = vstart & PMD_MASK;
- vend = ALIGN(vend, PMD_SIZE);
- for (; vstart < vend; vstart += PMD_SIZE) {
- pgd_t *pgd = vmemmap_pgd_populate(vstart, node);
- unsigned long pte;
- p4d_t *p4d;
- pud_t *pud;
- pmd_t *pmd;
-
- if (!pgd)
- return -ENOMEM;
-
- p4d = vmemmap_p4d_populate(pgd, vstart, node);
- if (!p4d)
- return -ENOMEM;
-
- pud = vmemmap_pud_populate(p4d, vstart, node);
- if (!pud)
- return -ENOMEM;
-
- pmd = pmd_offset(pud, vstart);
- pte = pmd_val(*pmd);
- if (!(pte & _PAGE_VALID)) {
- void *block = vmemmap_alloc_block(PMD_SIZE, node);
-
- if (!block)
- return -ENOMEM;
+ pmd_val(*pmd) = pte_base | __pa(p);
+}
- pmd_val(*pmd) = pte_base | __pa(block);
- }
- }
+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;
+}
- return 0;
+int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,
+ int node, struct vmem_altmap *altmap)
+{
+ return vmemmap_populate_hugepages(vstart, vend, node, altmap);
}
#endif /* CONFIG_SPARSEMEM_VMEMMAP */
--
2.50.1 (Apple Git-155)
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 2/3] mm: Convert vmemmap_p?d_populate() to static functions
2025-12-18 17:47 [PATCH v3 0/3] Generalize vmemmap_populate_hugepages to sparc chengkaitao
2025-12-18 17:47 ` [PATCH v3 1/3] sparc: Use vmemmap_populate_hugepages for vmemmap_populate chengkaitao
@ 2025-12-18 17:47 ` chengkaitao
2025-12-19 9:34 ` Mike Rapoport
2025-12-18 17:47 ` [PATCH v3 3/3] sparc: Remove unnecessary whitespace chengkaitao
2025-12-19 9:29 ` [PATCH v3 0/3] Generalize vmemmap_populate_hugepages to sparc Mike Rapoport
3 siblings, 1 reply; 7+ messages in thread
From: chengkaitao @ 2025-12-18 17:47 UTC (permalink / raw)
To: davem, andreas, akpm, david, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko
Cc: kevin.brodsky, dave.hansen, ziy, chengkaitao, willy,
zhengqi.arch, sparclinux, linux-kernel, linux-mm
From: Chengkaitao <chengkaitao@kylinos.cn>
Eliminate the external declarations of vmemmap_p?d_populate functions
and convert them to static functions.
Signed-off-by: Chengkaitao <chengkaitao@kylinos.cn>
---
include/linux/mm.h | 7 -------
mm/sparse-vmemmap.c | 10 +++++-----
2 files changed, 5 insertions(+), 12 deletions(-)
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 15076261d0c2..d98a38a6ac0e 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -4234,13 +4234,6 @@ unsigned long section_map_size(void);
struct page * __populate_section_memmap(unsigned long pfn,
unsigned long nr_pages, int nid, struct vmem_altmap *altmap,
struct dev_pagemap *pgmap);
-pgd_t *vmemmap_pgd_populate(unsigned long addr, int node);
-p4d_t *vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node);
-pud_t *vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node);
-pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node);
-pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node,
- struct vmem_altmap *altmap, unsigned long ptpfn,
- unsigned long flags);
void *vmemmap_alloc_block(unsigned long size, int node);
struct vmem_altmap;
void *vmemmap_alloc_block_buf(unsigned long size, int node,
diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c
index 37522d6cb398..67f9a08c2376 100644
--- a/mm/sparse-vmemmap.c
+++ b/mm/sparse-vmemmap.c
@@ -151,7 +151,7 @@ void __meminit vmemmap_verify(pte_t *pte, int node,
start, end - 1);
}
-pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node,
+static pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node,
struct vmem_altmap *altmap,
unsigned long ptpfn, unsigned long flags)
{
@@ -195,7 +195,7 @@ static void * __meminit vmemmap_alloc_block_zero(unsigned long size, int node)
return p;
}
-pmd_t * __meminit vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node)
+static pmd_t * __meminit vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node)
{
pmd_t *pmd = pmd_offset(pud, addr);
if (pmd_none(*pmd)) {
@@ -208,7 +208,7 @@ pmd_t * __meminit vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node)
return pmd;
}
-pud_t * __meminit vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node)
+static pud_t * __meminit vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node)
{
pud_t *pud = pud_offset(p4d, addr);
if (pud_none(*pud)) {
@@ -221,7 +221,7 @@ pud_t * __meminit vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node)
return pud;
}
-p4d_t * __meminit vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node)
+static p4d_t * __meminit vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node)
{
p4d_t *p4d = p4d_offset(pgd, addr);
if (p4d_none(*p4d)) {
@@ -234,7 +234,7 @@ p4d_t * __meminit vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node)
return p4d;
}
-pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node)
+static pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node)
{
pgd_t *pgd = pgd_offset_k(addr);
if (pgd_none(*pgd)) {
--
2.50.1 (Apple Git-155)
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 3/3] sparc: Remove unnecessary whitespace
2025-12-18 17:47 [PATCH v3 0/3] Generalize vmemmap_populate_hugepages to sparc chengkaitao
2025-12-18 17:47 ` [PATCH v3 1/3] sparc: Use vmemmap_populate_hugepages for vmemmap_populate chengkaitao
2025-12-18 17:47 ` [PATCH v3 2/3] mm: Convert vmemmap_p?d_populate() to static functions chengkaitao
@ 2025-12-18 17:47 ` chengkaitao
2025-12-19 9:29 ` [PATCH v3 0/3] Generalize vmemmap_populate_hugepages to sparc Mike Rapoport
3 siblings, 0 replies; 7+ messages in thread
From: chengkaitao @ 2025-12-18 17:47 UTC (permalink / raw)
To: davem, andreas, akpm, david, lorenzo.stoakes, Liam.Howlett,
vbabka, rppt, surenb, mhocko
Cc: kevin.brodsky, dave.hansen, ziy, chengkaitao, willy,
zhengqi.arch, sparclinux, linux-kernel, linux-mm
From: Chengkaitao <chengkaitao@kylinos.cn>
This is purely a code formatting change with no functional impact.
Signed-off-by: Chengkaitao <chengkaitao@kylinos.cn>
---
arch/sparc/mm/fault_64.c | 4 ++--
arch/sparc/mm/hypersparc.S | 4 ++--
arch/sparc/mm/init_64.c | 6 +++---
arch/sparc/mm/io-unit.c | 12 ++++++------
arch/sparc/mm/iommu.c | 2 +-
arch/sparc/mm/swift.S | 2 +-
arch/sparc/mm/ultra.S | 4 ++--
7 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c
index e326caf708c6..963b2c4c87e2 100644
--- a/arch/sparc/mm/fault_64.c
+++ b/arch/sparc/mm/fault_64.c
@@ -201,7 +201,7 @@ static void __kprobes do_kernel_fault(struct pt_regs *regs, int si_code,
unsigned long address)
{
unsigned char asi = ASI_P;
-
+
if ((!insn) && (regs->tstate & TSTATE_PRIV))
goto cannot_handle;
@@ -229,7 +229,7 @@ static void __kprobes do_kernel_fault(struct pt_regs *regs, int si_code,
return;
}
}
-
+
/* Is this in ex_table? */
if (regs->tstate & TSTATE_PRIV) {
const struct exception_table_entry *entry;
diff --git a/arch/sparc/mm/hypersparc.S b/arch/sparc/mm/hypersparc.S
index 6c2521e85a42..bac194982498 100644
--- a/arch/sparc/mm/hypersparc.S
+++ b/arch/sparc/mm/hypersparc.S
@@ -30,7 +30,7 @@ hypersparc_flush_cache_all:
ld [%g4 + %lo(vac_cache_size)], %g5
sethi %hi(vac_line_size), %g1
ld [%g1 + %lo(vac_line_size)], %g2
-1:
+1:
subcc %g5, %g2, %g5 ! hyper_flush_unconditional_combined
bne 1b
sta %g0, [%g5] ASI_M_FLUSH_CTX
@@ -325,7 +325,7 @@ hypersparc_flush_tlb_page_out:
sta %g5, [%g1] ASI_M_MMUREGS
__INIT
-
+
/* High speed page clear/copy. */
hypersparc_bzero_1page:
/* NOTE: This routine has to be shorter than 40insns --jj */
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
index f477ab1b4f08..1c36448b95eb 100644
--- a/arch/sparc/mm/init_64.c
+++ b/arch/sparc/mm/init_64.c
@@ -5,7 +5,7 @@
* Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu)
* Copyright (C) 1997-1999 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
*/
-
+
#include <linux/extable.h>
#include <linux/kernel.h>
#include <linux/sched.h>
@@ -2397,11 +2397,11 @@ void __init paging_init(void)
* work.
*/
init_mm.pgd += ((shift) / (sizeof(pgd_t)));
-
+
memset(swapper_pg_dir, 0, sizeof(swapper_pg_dir));
inherit_prom_mappings();
-
+
/* Ok, we can use our TLB miss and window trap handlers safely. */
setup_tba();
diff --git a/arch/sparc/mm/io-unit.c b/arch/sparc/mm/io-unit.c
index d409cb450de4..15f83e6d21e2 100644
--- a/arch/sparc/mm/io-unit.c
+++ b/arch/sparc/mm/io-unit.c
@@ -4,7 +4,7 @@
*
* Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
*/
-
+
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/slab.h>
@@ -62,7 +62,7 @@ static void __init iounit_iommu_init(struct platform_device *op)
prom_printf("SUN4D: Cannot map External Page Table.");
prom_halt();
}
-
+
op->dev.archdata.iommu = iounit;
iounit->page_table = xpt;
spin_lock_init(&iounit->lock);
@@ -109,9 +109,9 @@ static dma_addr_t iounit_get_area(struct iounit_struct *iounit,
case 2: i = 0x0132; break;
default: i = 0x0213; break;
}
-
+
IOD(("%s(%pa,%d[%d])=", __func__, &phys, size, npages));
-
+
next: j = (i & 15);
rotor = iounit->rotor[j - 1];
limit = iounit->limit[j];
@@ -150,7 +150,7 @@ static dma_addr_t iounit_map_phys(struct device *dev, phys_addr_t phys,
struct iounit_struct *iounit = dev->archdata.iommu;
unsigned long flags;
dma_addr_t ret;
-
+
/* XXX So what is maxphys for us and how do drivers know it? */
if (!len || len > 256 * 1024)
return DMA_MAPPING_ERROR;
@@ -185,7 +185,7 @@ static void iounit_unmap_phys(struct device *dev, dma_addr_t vaddr, size_t len,
{
struct iounit_struct *iounit = dev->archdata.iommu;
unsigned long flags;
-
+
spin_lock_irqsave(&iounit->lock, flags);
len = ((vaddr & ~PAGE_MASK) + len + (PAGE_SIZE-1)) >> PAGE_SHIFT;
vaddr = (vaddr - IOUNIT_DMA_BASE) >> PAGE_SHIFT;
diff --git a/arch/sparc/mm/iommu.c b/arch/sparc/mm/iommu.c
index f48adf62724a..f43163a9a812 100644
--- a/arch/sparc/mm/iommu.c
+++ b/arch/sparc/mm/iommu.c
@@ -89,7 +89,7 @@ static void __init sbus_iommu_init(struct platform_device *op)
iommu->end = 0xffffffff;
/* Allocate IOMMU page table */
- /* Stupid alignment constraints give me a headache.
+ /* Stupid alignment constraints give me a headache.
We need 256K or 512K or 1M or 2M area aligned to
its size and current gfp will fortunately give
it to us. */
diff --git a/arch/sparc/mm/swift.S b/arch/sparc/mm/swift.S
index f414bfd8d899..cfcc48b6c5c7 100644
--- a/arch/sparc/mm/swift.S
+++ b/arch/sparc/mm/swift.S
@@ -243,7 +243,7 @@ swift_flush_tlb_page:
nop
#if 1
mov 0x400, %o1
- sta %g0, [%o1] ASI_M_FLUSH_PROBE
+ sta %g0, [%o1] ASI_M_FLUSH_PROBE
#else
lda [%g1] ASI_M_MMUREGS, %g5
sta %o3, [%g1] ASI_M_MMUREGS
diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S
index 70e658d107e0..66cbfbb1d3cd 100644
--- a/arch/sparc/mm/ultra.S
+++ b/arch/sparc/mm/ultra.S
@@ -284,7 +284,7 @@ __cheetah_flush_tlb_page: /* 22 insns */
be,pn %icc, 1f
andn %o1, 1, %o3
stxa %g0, [%o3] ASI_IMMU_DEMAP
-1: stxa %g0, [%o3] ASI_DMMU_DEMAP
+1: stxa %g0, [%o3] ASI_DMMU_DEMAP
membar #Sync
stxa %g2, [%o4] ASI_DMMU
sethi %hi(KERNBASE), %o4
@@ -312,7 +312,7 @@ __cheetah_flush_tlb_pending: /* 27 insns */
be,pn %icc, 2f
andn %o3, 1, %o3
stxa %g0, [%o3] ASI_IMMU_DEMAP
-2: stxa %g0, [%o3] ASI_DMMU_DEMAP
+2: stxa %g0, [%o3] ASI_DMMU_DEMAP
membar #Sync
brnz,pt %o1, 1b
nop
--
2.50.1 (Apple Git-155)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 0/3] Generalize vmemmap_populate_hugepages to sparc
2025-12-18 17:47 [PATCH v3 0/3] Generalize vmemmap_populate_hugepages to sparc chengkaitao
` (2 preceding siblings ...)
2025-12-18 17:47 ` [PATCH v3 3/3] sparc: Remove unnecessary whitespace chengkaitao
@ 2025-12-19 9:29 ` Mike Rapoport
3 siblings, 0 replies; 7+ messages in thread
From: Mike Rapoport @ 2025-12-19 9:29 UTC (permalink / raw)
To: chengkaitao
Cc: davem, andreas, akpm, david, lorenzo.stoakes, Liam.Howlett,
vbabka, surenb, mhocko, kevin.brodsky, dave.hansen, ziy,
chengkaitao, willy, zhengqi.arch, sparclinux, linux-kernel,
linux-mm
On Fri, Dec 19, 2025 at 01:47:46AM +0800, chengkaitao wrote:
> Sparc implement vmemmap_populate using vmemmap_populate_hugepages
> to streamline the code. Another benefit is that it allows us to
If this is merged via mm tree, the cover letter would be a part of git
history so I'd suggest slightly rephrasing the first sentence:
Change sparc's implementation of vmemmap_populate() using
vmemmap_populate_hugepages() to streamline the code.
> eliminate the external declarations of vmemmap_p?d_populate
> functions and convert them to static functions.
>
> Since vmemmap_populate_hugepages may fallback to vmemmap_populate-
> _basepages, which differs from sparc's original implementation.
> During the v1 discussion with Mike Rapoport, sparc uses base pages
> in the kernel page tables, so it should be able to use them in
> vmemmap as well. Consequently, no additional special handling is
> required.
>
> Remove unnecessary whitespace from sparc.
>
> Changes in v3:
> - Allow sparc to fallback to vmemmap_populate_basepages
> - Convert vmemmap_p?d_populate() to static functions
> - Split the v1 patch
>
> Changes in v2:
> - Revert the whitespace deletions
> - Change vmemmap_false_pmd to vmemmap_pte_fallback_allowed
>
> Link to V1:
> https://lore.kernel.org/all/20251217120858.18713-1-pilgrimtao@gmail.com/
>
> Chengkaitao (3):
> sparc: Use vmemmap_populate_hugepages for vmemmap_populate
> mm: Convert vmemmap_p?d_populate() to static functions
> sparc: Remove unnecessary whitespace
>
> arch/sparc/mm/fault_64.c | 4 +--
> arch/sparc/mm/hypersparc.S | 4 +--
> arch/sparc/mm/init_64.c | 53 ++++++++++++--------------------------
> arch/sparc/mm/io-unit.c | 12 ++++-----
> arch/sparc/mm/iommu.c | 2 +-
> arch/sparc/mm/swift.S | 2 +-
> arch/sparc/mm/ultra.S | 4 +--
> include/linux/mm.h | 7 -----
> mm/sparse-vmemmap.c | 10 +++----
> 9 files changed, 36 insertions(+), 62 deletions(-)
>
> --
> 2.50.1 (Apple Git-155)
>
--
Sincerely yours,
Mike.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/3] sparc: Use vmemmap_populate_hugepages for vmemmap_populate
2025-12-18 17:47 ` [PATCH v3 1/3] sparc: Use vmemmap_populate_hugepages for vmemmap_populate chengkaitao
@ 2025-12-19 9:33 ` Mike Rapoport
0 siblings, 0 replies; 7+ messages in thread
From: Mike Rapoport @ 2025-12-19 9:33 UTC (permalink / raw)
To: chengkaitao
Cc: davem, andreas, akpm, david, lorenzo.stoakes, Liam.Howlett,
vbabka, surenb, mhocko, kevin.brodsky, dave.hansen, ziy,
chengkaitao, willy, zhengqi.arch, sparclinux, linux-kernel,
linux-mm
On Fri, Dec 19, 2025 at 01:47:47AM +0800, chengkaitao wrote:
> From: Chengkaitao <chengkaitao@kylinos.cn>
>
> 1. In the SPARC architecture, reimplemented vmemmap_populate using
> vmemmap_populate_hugepages.
> 2. Allow the SPARC arch to fallback to vmemmap_populate_basepages(),
> when vmemmap_alloc_block returns NULL.
>
> Signed-off-by: Chengkaitao <chengkaitao@kylinos.cn>
> ---
> arch/sparc/mm/init_64.c | 47 ++++++++++++-----------------------------
> 1 file changed, 14 insertions(+), 33 deletions(-)
>
> diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
> index df9f7c444c39..f477ab1b4f08 100644
> --- a/arch/sparc/mm/init_64.c
> +++ b/arch/sparc/mm/init_64.c
> @@ -2581,8 +2581,8 @@ unsigned long _PAGE_CACHE __read_mostly;
> EXPORT_SYMBOL(_PAGE_CACHE);
>
> #ifdef CONFIG_SPARSEMEM_VMEMMAP
> -int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,
> - int node, struct vmem_altmap *altmap)
> +void __meminit vmemmap_set_pmd(pmd_t *pmd, void *p, int node,
> + unsigned long addr, unsigned long next)
> {
> unsigned long pte_base;
>
> @@ -2595,39 +2595,20 @@ int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,
>
> pte_base |= _PAGE_PMD_HUGE;
>
> - vstart = vstart & PMD_MASK;
> - vend = ALIGN(vend, PMD_SIZE);
> - for (; vstart < vend; vstart += PMD_SIZE) {
> - pgd_t *pgd = vmemmap_pgd_populate(vstart, node);
> - unsigned long pte;
> - p4d_t *p4d;
> - pud_t *pud;
> - pmd_t *pmd;
> -
> - if (!pgd)
> - return -ENOMEM;
> -
> - p4d = vmemmap_p4d_populate(pgd, vstart, node);
> - if (!p4d)
> - return -ENOMEM;
> -
> - pud = vmemmap_pud_populate(p4d, vstart, node);
> - if (!pud)
> - return -ENOMEM;
> -
> - pmd = pmd_offset(pud, vstart);
> - pte = pmd_val(*pmd);
> - if (!(pte & _PAGE_VALID)) {
> - void *block = vmemmap_alloc_block(PMD_SIZE, node);
> -
> - if (!block)
> - return -ENOMEM;
> + pmd_val(*pmd) = pte_base | __pa(p);
> +}
>
> - pmd_val(*pmd) = pte_base | __pa(block);
> - }
> - }
> +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;
This should return 1 only if the pmd actually maps a large page, see x86
and powerpc implementations for example.
> +}
>
> - return 0;
> +int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,
> + int node, struct vmem_altmap *altmap)
> +{
> + return vmemmap_populate_hugepages(vstart, vend, node, altmap);
> }
> #endif /* CONFIG_SPARSEMEM_VMEMMAP */
>
> --
> 2.50.1 (Apple Git-155)
>
--
Sincerely yours,
Mike.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 2/3] mm: Convert vmemmap_p?d_populate() to static functions
2025-12-18 17:47 ` [PATCH v3 2/3] mm: Convert vmemmap_p?d_populate() to static functions chengkaitao
@ 2025-12-19 9:34 ` Mike Rapoport
0 siblings, 0 replies; 7+ messages in thread
From: Mike Rapoport @ 2025-12-19 9:34 UTC (permalink / raw)
To: chengkaitao
Cc: davem, andreas, akpm, david, lorenzo.stoakes, Liam.Howlett,
vbabka, surenb, mhocko, kevin.brodsky, dave.hansen, ziy,
chengkaitao, willy, zhengqi.arch, sparclinux, linux-kernel,
linux-mm
On Fri, Dec 19, 2025 at 01:47:48AM +0800, chengkaitao wrote:
> From: Chengkaitao <chengkaitao@kylinos.cn>
>
> Eliminate the external declarations of vmemmap_p?d_populate functions
> and convert them to static functions.
Please also mention that they are unused outside mm.
With that
Acked-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> Signed-off-by: Chengkaitao <chengkaitao@kylinos.cn>
> ---
> include/linux/mm.h | 7 -------
> mm/sparse-vmemmap.c | 10 +++++-----
> 2 files changed, 5 insertions(+), 12 deletions(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index 15076261d0c2..d98a38a6ac0e 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -4234,13 +4234,6 @@ unsigned long section_map_size(void);
> struct page * __populate_section_memmap(unsigned long pfn,
> unsigned long nr_pages, int nid, struct vmem_altmap *altmap,
> struct dev_pagemap *pgmap);
> -pgd_t *vmemmap_pgd_populate(unsigned long addr, int node);
> -p4d_t *vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node);
> -pud_t *vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node);
> -pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node);
> -pte_t *vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node,
> - struct vmem_altmap *altmap, unsigned long ptpfn,
> - unsigned long flags);
> void *vmemmap_alloc_block(unsigned long size, int node);
> struct vmem_altmap;
> void *vmemmap_alloc_block_buf(unsigned long size, int node,
> diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c
> index 37522d6cb398..67f9a08c2376 100644
> --- a/mm/sparse-vmemmap.c
> +++ b/mm/sparse-vmemmap.c
> @@ -151,7 +151,7 @@ void __meminit vmemmap_verify(pte_t *pte, int node,
> start, end - 1);
> }
>
> -pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node,
> +static pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node,
> struct vmem_altmap *altmap,
> unsigned long ptpfn, unsigned long flags)
> {
> @@ -195,7 +195,7 @@ static void * __meminit vmemmap_alloc_block_zero(unsigned long size, int node)
> return p;
> }
>
> -pmd_t * __meminit vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node)
> +static pmd_t * __meminit vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node)
> {
> pmd_t *pmd = pmd_offset(pud, addr);
> if (pmd_none(*pmd)) {
> @@ -208,7 +208,7 @@ pmd_t * __meminit vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node)
> return pmd;
> }
>
> -pud_t * __meminit vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node)
> +static pud_t * __meminit vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node)
> {
> pud_t *pud = pud_offset(p4d, addr);
> if (pud_none(*pud)) {
> @@ -221,7 +221,7 @@ pud_t * __meminit vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node)
> return pud;
> }
>
> -p4d_t * __meminit vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node)
> +static p4d_t * __meminit vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node)
> {
> p4d_t *p4d = p4d_offset(pgd, addr);
> if (p4d_none(*p4d)) {
> @@ -234,7 +234,7 @@ p4d_t * __meminit vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node)
> return p4d;
> }
>
> -pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node)
> +static pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node)
> {
> pgd_t *pgd = pgd_offset_k(addr);
> if (pgd_none(*pgd)) {
> --
> 2.50.1 (Apple Git-155)
>
--
Sincerely yours,
Mike.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-12-19 9:34 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-18 17:47 [PATCH v3 0/3] Generalize vmemmap_populate_hugepages to sparc chengkaitao
2025-12-18 17:47 ` [PATCH v3 1/3] sparc: Use vmemmap_populate_hugepages for vmemmap_populate chengkaitao
2025-12-19 9:33 ` Mike Rapoport
2025-12-18 17:47 ` [PATCH v3 2/3] mm: Convert vmemmap_p?d_populate() to static functions chengkaitao
2025-12-19 9:34 ` Mike Rapoport
2025-12-18 17:47 ` [PATCH v3 3/3] sparc: Remove unnecessary whitespace chengkaitao
2025-12-19 9:29 ` [PATCH v3 0/3] Generalize vmemmap_populate_hugepages to sparc Mike Rapoport
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox