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: 18+ 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-22 7:54 ` Qi Zheng
2026-09-13 8:37 ` [PATCH 2/6] mm/sparse-vmemmap: support device DAX in common vmemmap path Muchun Song
2026-09-22 8:02 ` Qi Zheng
2026-09-22 11:34 ` Muchun Song
2026-09-13 8:37 ` [PATCH 3/6] mm/sparse-vmemmap: drop Device DAX-specific population path Muchun Song
2026-09-22 8:06 ` Qi Zheng
2026-09-13 8:37 ` [PATCH 4/6] mm/sparse-vmemmap: remove the unused ptpfn argument Muchun Song
2026-09-22 8:12 ` Qi Zheng
2026-09-13 8:37 ` [PATCH 5/6] powerpc/mm: make vmemmap_populate_compound_pages() static Muchun Song
2026-09-22 8:14 ` Qi Zheng
2026-09-13 8:37 ` [PATCH 6/6] mm/sparse-vmemmap: open-code vmemmap_populate_address() Muchun Song
2026-09-22 8:18 ` Qi Zheng
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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.