On Tue, 7 Jul 2026 13:02:52 +1000, [email protected] wrote:
> > +static inline bool zone_device_page_init_optimization_enabled(void)
> > +{
> > + /*
> > + * The template fast path copies a preinitialized struct page image.
> > + * Skip it when the page_ref_set tracepoint is enabled.
> > + */
> > + return !page_ref_tracepoint_active(page_ref_set);
> > +}
> > +
> > +static inline void zone_device_template_page_init(struct page *template,
> > + struct page *src)
> > +{
> > + memcpy(template, src, sizeof(*template));
>
> I'd drop this function and just open-code the memcpy as I think that ends up
> being clearer and removes a naming confusion - I kept mixing up the purpose of
> `zone_device_template_page_init` and `zone_device_page_init_from_template`
Agreed. I will drop zone_device_template_page_init() and open-code
that memcpy() in v6.
> > - for (pfn = start_pfn; pfn < end_pfn; pfn += pfns_per_compound) {
> > - struct page *page = pfn_to_page(pfn);
> > +
> > + if (!nr_pages)
> > + return;
> > +
> > + pfn = start_pfn;
> > + /*
> > + * Seed the reusable head-page template from the first real struct
> > + * page, because the existing page-init and pageblock helpers expect
> > + * a real memmap entry rather than a stack object.
> > + */
> > + if (use_template) {
> > + struct page *page = pfn_to_page(start_pfn);
> >
> > zone_device_page_init_slow(page, pfn, zone_idx, nid, pgmap);
> > + 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));
> > + pfn += pfns_per_compound;
>
> I think it would be clearer and less error prone to not unroll the loop here.
> Instead just initialise the template page and leave the for loop starting at
> pfn = start_pfn and let it handle the rest of the steps. I can't imagine the
> extra call to zone_deivce_page_init_from_template() would cause a noticable
> perf impact.
>
> It also avoids the obvious danger of someone updating the loop but missing the
> unrolled version above.
Thanks. I will keep the initial slow-path template seeding as a
separate step, still using the first real memmap entry for that, but
let the main loop start at start_pfn again so the first PFN goes
through the same loop body as the rest. That should make the code
clearer and avoid the duplicated first-iteration path drifting from
the main loop in later changes.
Thanks,
Zhe