From: Qi Zheng <qi.zheng@linux.dev>
To: Muchun Song <songmuchun@bytedance.com>,
Madhavan Srinivasan <maddy@linux.ibm.com>,
Mike Rapoport <rppt@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@kernel.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>,
Nicholas Piggin <npiggin@gmail.com>,
Christophe Leroy <chleroy@kernel.org>,
Lorenzo Stoakes <ljs@kernel.org>,
"Liam R . Howlett" <liam@infradead.org>,
Vlastimil Babka <vbabka@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>,
linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org,
linux-mm@kvack.org, muchun.song@linux.dev
Subject: Re: [PATCH 1/6] mm/sparse-vmemmap: drop VMEMMAP_POPULATE_DAX
Date: Sat, 19 Sep 2026 22:01:06 +0800 [thread overview]
Message-ID: <186ee2ba-daf3-4120-a3e3-101cac1ff5a1@linux.dev> (raw)
In-Reply-To: <20260913083734.86802-2-songmuchun@bytedance.com>
On 9/13/26 4:37 PM, Muchun Song wrote:
> VMEMMAP_POPULATE_DAX currently distinguishes DAX vmemmap population in two
> places: it keeps allocations on the normal path and takes a reference when
> a backing page is supplied for reuse.
>
> After Device DAX switched to the common per-zone shared tail page, both
> conditions can be determined locally. DAX supplies ptpfn for every shared
> tail mapping and requests an allocation only for compound head mappings,
> whose PFNs are not optimizable. Therefore, vmemmap_optimizable_pfn() alone
> selects the correct allocation path.
>
> When ptpfn is supplied, the caller is reusing an existing backing page.
> Once the slab allocator is available, take a reference for each reused
Does the availability of slab mean the buddy allocator is already being
used? Could there be a window where the buddy allocator is functional
but slab hasn't become available yet?
> mapping to balance the release performed by vmemmap_free(). Early mappings
> are backed by memblock/reserved memory and do not need page reference
> accounting.
>
> Remove VMEMMAP_POPULATE_DAX and the flags argument from the vmemmap
> population helpers.
>
> Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> ---
> mm/sparse-vmemmap.c | 36 +++++++++++++-----------------------
> 1 file changed, 13 insertions(+), 23 deletions(-)
>
> diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c
> index 96506f594924..878d29a4e862 100644
> --- a/mm/sparse-vmemmap.c
> +++ b/mm/sparse-vmemmap.c
> @@ -32,12 +32,6 @@
> #include <asm/dma.h>
> #include <asm/tlbflush.h>
>
> -/*
> - * Flags for vmemmap_populate_range and friends.
> - */
> -/* Vmemmap population for ZONE_DEVICE compound pages */
> -#define VMEMMAP_POPULATE_DAX 0x0001
> -
> #include "internal.h"
> #include "mm_init.h"
> #include "sparse.h"
> @@ -208,7 +202,7 @@ struct page __ref *vmemmap_shared_tail_page(unsigned int order, struct zone *zon
> }
>
> static __meminit void *vmemmap_alloc_pte(unsigned long pfn, int node,
> - struct vmem_altmap *altmap, unsigned long flags)
> + struct vmem_altmap *altmap)
> {
> struct zone *zone;
> struct page *page;
> @@ -218,7 +212,7 @@ static __meminit void *vmemmap_alloc_pte(unsigned long pfn, int node,
> * Device DAX still relies on vmemmap_populate_compound_pages() for
> * head/first-tail allocation and tail-page reuse.
> */
> - if (!vmemmap_optimizable_pfn(pfn) || flags & VMEMMAP_POPULATE_DAX)
> + if (!vmemmap_optimizable_pfn(pfn))
> return vmemmap_alloc_block_buf(PAGE_SIZE, node, altmap);
>
> zone = pfn_to_zone(pfn, node);
> @@ -230,8 +224,7 @@ static __meminit void *vmemmap_alloc_pte(unsigned long pfn, 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)
> + struct vmem_altmap *altmap, unsigned long ptpfn)
> {
> pte_t *pte = pte_offset_kernel(pmd, addr);
> unsigned long pfn = page_to_pfn((struct page *)addr);
> @@ -240,7 +233,7 @@ static pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, in
> pte_t entry;
>
> if (ptpfn == (unsigned long)-1) {
> - void *p = vmemmap_alloc_pte(pfn, node, altmap, flags);
> + void *p = vmemmap_alloc_pte(pfn, node, altmap);
>
> if (!p)
> return NULL;
> @@ -255,7 +248,7 @@ static pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, in
> * and through vmemmap_populate_compound_pages() when
> * slab is available.
> */
> - if (flags & VMEMMAP_POPULATE_DAX)
> + if (slab_is_available())
> get_page(pfn_to_page(ptpfn));
> }
> entry = pfn_pte(ptpfn, PAGE_KERNEL);
> @@ -318,8 +311,7 @@ static pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node)
>
> static pte_t * __meminit vmemmap_populate_address(unsigned long addr, int node,
> struct vmem_altmap *altmap,
> - unsigned long ptpfn,
> - unsigned long flags)
> + unsigned long ptpfn)
> {
> pgd_t *pgd;
> p4d_t *p4d;
> @@ -339,7 +331,7 @@ static pte_t * __meminit vmemmap_populate_address(unsigned long addr, int node,
> pmd = vmemmap_pmd_populate(pud, addr, node);
> if (!pmd)
> return NULL;
> - pte = vmemmap_pte_populate(pmd, addr, node, altmap, ptpfn, flags);
> + pte = vmemmap_pte_populate(pmd, addr, node, altmap, ptpfn);
> if (!pte)
> return NULL;
> vmemmap_verify(pte, node, addr, addr + PAGE_SIZE);
> @@ -350,15 +342,14 @@ static pte_t * __meminit vmemmap_populate_address(unsigned long addr, int node,
> static int __meminit vmemmap_populate_range(unsigned long start,
> unsigned long end, int node,
> struct vmem_altmap *altmap,
> - unsigned long ptpfn,
> - unsigned long flags)
> + unsigned long ptpfn)
> {
> unsigned long addr = start;
> pte_t *pte;
>
> for (; addr < end; addr += PAGE_SIZE) {
> pte = vmemmap_populate_address(addr, node, altmap,
> - ptpfn, flags);
> + ptpfn);
> if (!pte)
> return -ENOMEM;
> }
> @@ -369,7 +360,7 @@ static int __meminit vmemmap_populate_range(unsigned long start,
> int __meminit vmemmap_populate_basepages(unsigned long start, unsigned long end,
> int node, struct vmem_altmap *altmap)
> {
> - return vmemmap_populate_range(start, end, node, altmap, -1, 0);
> + return vmemmap_populate_range(start, end, node, altmap, -1);
> }
>
> /*
> @@ -498,7 +489,6 @@ static int __meminit vmemmap_populate_compound_pages(unsigned long start_pfn,
> unsigned long size, addr;
> pte_t *pte;
> int rc;
> - unsigned long flags = VMEMMAP_POPULATE_DAX;
> struct page *page;
> unsigned int order = pfn_to_section_compound_order(start_pfn);
>
> @@ -508,14 +498,14 @@ static int __meminit vmemmap_populate_compound_pages(unsigned long start_pfn,
>
> if (reuse_compound_section(start_pfn, pgmap))
> return vmemmap_populate_range(start, end, node, NULL,
> - page_to_pfn(page), flags);
> + page_to_pfn(page));
>
> size = min(end - start, (1UL << order) * sizeof(struct page));
> for (addr = start; addr < end; addr += size) {
> unsigned long next, last = addr + size;
>
> /* Populate the head page vmemmap page */
> - pte = vmemmap_populate_address(addr, node, NULL, -1, flags);
> + pte = vmemmap_populate_address(addr, node, NULL, -1);
> if (!pte)
> return -ENOMEM;
>
> @@ -525,7 +515,7 @@ static int __meminit vmemmap_populate_compound_pages(unsigned long start_pfn,
> */
> next = addr + PAGE_SIZE;
> rc = vmemmap_populate_range(next, last, node, NULL,
> - page_to_pfn(page), flags);
> + page_to_pfn(page));
> if (rc)
> return -ENOMEM;
> }
next prev parent reply other threads:[~2026-09-19 14:01 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-13 8:37 [PATCH 0/6] mm: Unify Device DAX and HugeTLB vmemmap population paths Muchun Song
2026-09-13 8:37 ` [PATCH 1/6] mm/sparse-vmemmap: drop VMEMMAP_POPULATE_DAX Muchun Song
2026-09-19 14:01 ` Qi Zheng [this message]
2026-09-19 14:07 ` Muchun Song
2026-09-21 3:43 ` Qi Zheng
2026-09-21 3:49 ` Muchun Song
2026-09-13 8:37 ` [PATCH 2/6] mm/sparse-vmemmap: support device DAX in common vmemmap path Muchun Song
2026-09-13 8:37 ` [PATCH 3/6] mm/sparse-vmemmap: drop Device DAX-specific population path Muchun Song
2026-09-13 8:37 ` [PATCH 4/6] mm/sparse-vmemmap: remove the unused ptpfn argument Muchun Song
2026-09-13 8:37 ` [PATCH 5/6] powerpc/mm: make vmemmap_populate_compound_pages() static Muchun Song
2026-09-13 8:37 ` [PATCH 6/6] mm/sparse-vmemmap: open-code vmemmap_populate_address() Muchun Song
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=186ee2ba-daf3-4120-a3e3-101cac1ff5a1@linux.dev \
--to=qi.zheng@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=chleroy@kernel.org \
--cc=david@kernel.org \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=ljs@kernel.org \
--cc=maddy@linux.ibm.com \
--cc=mhocko@suse.com \
--cc=mpe@ellerman.id.au \
--cc=muchun.song@linux.dev \
--cc=npiggin@gmail.com \
--cc=rppt@kernel.org \
--cc=songmuchun@bytedance.com \
--cc=surenb@google.com \
--cc=vbabka@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®