Thread (78 messages) 78 messages, 7 authors, 2021-08-25

Re: [PATCH v3 09/14] mm/page_alloc: reuse tail struct pages for compound pagemaps

From: Joao Martins <hidden>
Date: 2021-07-28 15:56:22
Also in: linux-mm, nvdimm

On 7/28/21 8:28 AM, Dan Williams wrote:
On Wed, Jul 14, 2021 at 12:36 PM Joao Martins [off-list ref] wrote:
quoted
+       /*
+        * With compound page geometry and when struct pages are stored in ram
+        * (!altmap) most tail pages are reused. Consequently, the amount of
+        * unique struct pages to initialize is a lot smaller that the total
+        * amount of struct pages being mapped.
+        * See vmemmap_populate_compound_pages().
+        */
+       if (!altmap)
+               nr_pages = min_t(unsigned long, nr_pages,
What's the scenario where nr_pages is < 128? Shouldn't alignment
already be guaranteed?
Oh yeah, that's right.
quoted
+                                2 * (PAGE_SIZE/sizeof(struct page)));
quoted
+
        __SetPageHead(page);

        for (i = 1; i < nr_pages; i++) {
@@ -6657,7 +6669,7 @@ void __ref memmap_init_zone_device(struct zone *zone,
                        continue;

                memmap_init_compound(page, pfn, zone_idx, nid, pgmap,
-                                    pfns_per_compound);
+                                    altmap, pfns_per_compound);
This feels odd, memmap_init_compound() doesn't really care about
altmap, what do you think about explicitly calculating the parameters
that memmap_init_compound() needs and passing them in?

Not a strong requirement to change, but take another look at let me know.
Yeah, memmap_init_compound() indeed doesn't care about @altmap itself -- but a previous
comment was to abstract this away in memmap_init_compound() given the mix of complexity in
memmap_init_zone_device() PAGE_SIZE geometry case and the compound case:

https://lore.kernel.org/linux-mm/CAPcyv4gtSqfmuAaX9cs63OvLkf-h4B_5fPiEnM9p9cqLZztXpg@mail.gmail.com/ (local)

Before this was called @ntails above and I hide that calculation in memmap_init_compound().

But I can move this back to the caller:

memmap_init_compound(page, pfn, zone_idx, nid, pgmap,
	(!altmap ? 2 * (PAGE_SIZE/sizeof(struct page))) : pfns_per_compound);

Or with another helper like:

#define compound_nr_pages(__altmap, __nr_pages) \
		(!__altmap ? 2 * (PAGE_SIZE/sizeof(struct page))) : __nr_pages);
			
memmap_init_compound(page, pfn, zone_idx, nid, pgmap,
		     compound_nr_pages(altmap, pfns_per_compound));
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help