All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alistair Popple <apopple@nvidia.com>
To: Li Zhe <lizhe.67@bytedance.com>
Cc: akpm@linux-foundation.org, arnd@arndb.de, bp@alien8.de,
	 dave.hansen@linux.intel.com, david@kernel.org, kees@kernel.org,
	mingo@redhat.com,  rppt@kernel.org, tglx@kernel.org,
	linux-arch@vger.kernel.org,  linux-hardening@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org, x86@kernel.org
Subject: Re: [PATCH v5 5/8] mm: extend the template fast path to zone-device compound tails
Date: Tue, 7 Jul 2026 13:09:01 +1000	[thread overview]
Message-ID: <akxtWBdz5XjoAAzF@nvdebian.thelocal> (raw)
In-Reply-To: <20260701090553.62691-6-lizhe.67@bytedance.com>

On 2026-07-01 at 19:05 +1000, Li Zhe <lizhe.67@bytedance.com> wrote...
> The template fast path from the previous patch only accelerates head
> pages. Compound tails in memmap_init_compound() still go through the
> slow path one by one.
> 
> Build separate head and tail templates and reuse one prepared tail
> template across the tail pages in a compound range. Head pages preserve
> the existing refcount policy, while compound tails always start with a
> refcount of 0 after prep_compound_tail().
> 
> This extends the template-copy fast path to pfns_per_compound > 1
> without changing the existing slow path. Tail-page PFN-dependent fields
> are refreshed in the reusable tail template before each copy.
> 
> Tested in a VM with a 100 GB devdax namespace (align=2097152) on Intel
> Ice Lake server. This test exercises the dax_pmem rebind path and
> measures memmap initialization latency.
> 
> Test procedure:
> Unbind and rebind the dax_pmem driver 30 times, collect memmap
> initialization time from the pr_debug() output of memmap_init_zone_device().
> 
> Base(v7.2-rc1):
>   First binding: 1462 ms
>   Average of subsequent rebinds: 273.31 ms
> 
> With this patch and its prerequisites applied:
>   First binding: 1403 ms
>   Average of subsequent rebinds: 244.37 ms
> 
> This reduces the average rebind time from 273.31 ms to 244.37 ms, or
> about 10.6%.
> 
> Signed-off-by: Li Zhe <lizhe.67@bytedance.com>
> ---
>  mm/mm_init.c | 47 ++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 40 insertions(+), 7 deletions(-)
> 
> diff --git a/mm/mm_init.c b/mm/mm_init.c
> index cc8417951467..60794050bc07 100644
> --- a/mm/mm_init.c
> +++ b/mm/mm_init.c
> @@ -1081,6 +1081,16 @@ static inline void zone_device_template_page_init(struct page *template,
>  	memcpy(template, src, sizeof(*template));
>  }
>  
> +static inline void zone_device_tail_page_init(struct page *page,
> +		unsigned long pfn, unsigned long zone_idx, int nid,
> +		struct dev_pagemap *pgmap, const struct page *head,
> +		unsigned int order)
> +{
> +	zone_device_page_init_slow(page, pfn, zone_idx, nid, pgmap);
> +	prep_compound_tail(page, head, order);
> +	set_page_count(page, 0);
> +}
> +
>  /*
>   * 'template' is a reusable page prototype rather than a strictly immutable
>   * object. Most ZONE_DEVICE fields stay constant across the pages covered by
> @@ -1138,10 +1148,12 @@ static void __ref memmap_init_compound(struct page *head,
>  				       unsigned long head_pfn,
>  				       unsigned long zone_idx, int nid,
>  				       struct dev_pagemap *pgmap,
> -				       unsigned long nr_pages)
> +				       unsigned long nr_pages,
> +				       bool use_template)
>  {
>  	unsigned long pfn, end_pfn = head_pfn + nr_pages;
>  	unsigned int order = pgmap->vmemmap_shift;
> +	struct page template;
>  
>  	/*
>  	 * We have to initialize the pages, including setting up page links.
> @@ -1150,12 +1162,31 @@ static void __ref memmap_init_compound(struct page *head,
>  	 * the pages in the same go.
>  	 */
>  	__SetPageHead(head);
> -	for (pfn = head_pfn + 1; pfn < end_pfn; pfn++) {
> +
> +	pfn = head_pfn + 1;
> +	/*
> +	 * All tails of the same compound page share the state established by
> +	 * prep_compound_tail(). Reuse one tail template for the whole range and
> +	 * refresh only the PFN-dependent fields in that template before each copy.
> +	 */
> +	if (use_template) {
>  		struct page *page = pfn_to_page(pfn);
>  
> -		zone_device_page_init_slow(page, pfn, zone_idx, nid, pgmap);
> -		prep_compound_tail(page, head, order);
> -		set_page_count(page, 0);
> +		zone_device_tail_page_init(page, pfn, zone_idx, nid,
> +					   pgmap, head, order);
> +		zone_device_template_page_init(&template, page);
> +		pfn++;

Similar comment as the previous patch - I think it's clearer to just init the
template page here as a separate step and not unroll the loop.

 - Alistair

> +	}
> +
> +	for (; pfn < end_pfn; pfn++) {
> +		struct page *page = pfn_to_page(pfn);
> +
> +		if (use_template)
> +			zone_device_page_init_from_template(page, pfn,
> +							    &template);
> +		else
> +			zone_device_tail_page_init(page, pfn, zone_idx, nid,
> +						   pgmap, head, order);
>  	}
>  	prep_compound_head(head, order);
>  }
> @@ -1205,7 +1236,8 @@ void __ref memmap_init_zone_device(struct zone *zone,
>  		zone_device_template_page_init(&template, page);
>  		if (pfns_per_compound != 1)
>  			memmap_init_compound(page, pfn, zone_idx, nid, pgmap,
> -				compound_nr_pages(start_pfn, altmap, pgmap));
> +				compound_nr_pages(start_pfn, altmap, pgmap),
> +				use_template);
>  		pfn += pfns_per_compound;
>  	}
>  
> @@ -1226,7 +1258,8 @@ void __ref memmap_init_zone_device(struct zone *zone,
>  			continue;
>  
>  		memmap_init_compound(page, pfn, zone_idx, nid, pgmap,
> -				     compound_nr_pages(pfn, altmap, pgmap));
> +				     compound_nr_pages(pfn, altmap, pgmap),
> +				     use_template);
>  	}
>  
>  	pageblock_migratetype_init_range(start_pfn, nr_pages, MIGRATE_MOVABLE);
> -- 
> 2.20.1
> 

  reply	other threads:[~2026-07-07  3:09 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-01  9:05 [PATCH v5 0/8] mm: optimize zone-device memmap initialization Li Zhe
2026-07-01  9:05 ` [PATCH v5 1/8] mm: fix stale ZONE_DEVICE refcount comment Li Zhe
2026-07-06  9:11   ` David Hildenbrand (Arm)
2026-07-07  2:28   ` Alistair Popple
2026-07-01  9:05 ` [PATCH v5 2/8] mm: factor zone-device page init helpers out of __init_zone_device_page Li Zhe
2026-07-06  9:13   ` David Hildenbrand (Arm)
2026-07-06 11:50     ` Li Zhe
2026-07-06 13:47       ` David Hildenbrand (Arm)
2026-07-07  3:25         ` Li Zhe
2026-07-01  9:05 ` [PATCH v5 3/8] mm: add a set_page_section_from_pfn() helper Li Zhe
2026-07-06  9:15   ` David Hildenbrand (Arm)
2026-07-06 11:52     ` Li Zhe
2026-07-06 13:48       ` David Hildenbrand (Arm)
2026-07-07  3:26         ` Li Zhe
2026-07-01  9:05 ` [PATCH v5 4/8] mm: add a template-based fast path for zone-device page init Li Zhe
2026-07-03 14:06   ` Mike Rapoport
2026-07-06  7:45     ` Li Zhe
2026-07-07  3:06       ` Alistair Popple
2026-07-07  6:36         ` Li Zhe
2026-07-07  3:02   ` Alistair Popple
2026-07-07  6:33     ` Li Zhe
2026-07-01  9:05 ` [PATCH v5 5/8] mm: extend the template fast path to zone-device compound tails Li Zhe
2026-07-07  3:09   ` Alistair Popple [this message]
2026-07-07  6:38     ` Li Zhe
2026-07-01  9:05 ` [PATCH v5 6/8] string: introduce memcpy_nt() helpers Li Zhe
2026-07-02  2:16   ` Borislav Petkov
2026-07-02  7:36     ` Li Zhe
2026-07-06  9:18   ` David Hildenbrand (Arm)
2026-07-06 11:53     ` Li Zhe
2026-07-06 13:49       ` David Hildenbrand (Arm)
2026-07-07  3:28         ` Li Zhe
2026-07-01  9:05 ` [PATCH v5 7/8] x86/string: extend memcpy_flushcache() fixed-size fastpaths Li Zhe
2026-07-02  2:23   ` Borislav Petkov
2026-07-02  7:37     ` Li Zhe
2026-07-03 19:56       ` Borislav Petkov
2026-07-06  7:43         ` Li Zhe
2026-07-06 17:19           ` Borislav Petkov
2026-07-07 11:34             ` Li Zhe
2026-07-01  9:05 ` [PATCH v5 8/8] mm: use memcpy_nt() in zone-device template copies Li Zhe
2026-07-01 23:28 ` [PATCH v5 0/8] mm: optimize zone-device memmap initialization Andrew Morton
2026-07-02  2:24   ` Borislav Petkov
2026-07-02  7:39   ` Li Zhe

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=akxtWBdz5XjoAAzF@nvdebian.thelocal \
    --to=apopple@nvidia.com \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=david@kernel.org \
    --cc=kees@kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=lizhe.67@bytedance.com \
    --cc=mingo@redhat.com \
    --cc=rppt@kernel.org \
    --cc=tglx@kernel.org \
    --cc=x86@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.