Re: [PATCH v7 5/5] mm/page_alloc: reuse tail struct pages for compound devmaps

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 3/4/22 03:27, Muchun Song wrote:
> On Fri, Mar 4, 2022 at 5:33 AM Joao Martins <joao.m.martins@xxxxxxxxxx> wrote:
>>
>> Currently memmap_init_zone_device() ends up initializing 32768 pages
>> when it only needs to initialize 128 given tail page reuse. That
>> number is worse with 1GB compound pages, 262144 instead of 128. Update
>> memmap_init_zone_device() to skip redundant initialization, detailed
>> below.
>>
>> When a pgmap @vmemmap_shift is set, all pages are mapped at a given
>> huge page alignment and use compound pages to describe them as opposed
>> to a struct per 4K.
>>
>> With @vmemmap_shift > 0 and when struct pages are stored in ram
>> (!altmap) most tail pages are reused. Consequently, the amount of
>> unique struct pages is a lot smaller than the total amount of struct
>> pages being mapped.
>>
>> The altmap path is left alone since it does not support memory savings
>> based on compound pages devmap.
>>
>> Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx>
> 
> Reviewed-by: Muchun Song <songmuchun@xxxxxxxxxxxxx>
> 
Thanks!

> But a nit below.
> 
>> ---
>>  mm/page_alloc.c | 17 ++++++++++++++++-
>>  1 file changed, 16 insertions(+), 1 deletion(-)
>>
>> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
>> index e0c1e6bb09dd..e9282d043cca 100644
>> --- a/mm/page_alloc.c
>> +++ b/mm/page_alloc.c
>> @@ -6653,6 +6653,21 @@ static void __ref __init_zone_device_page(struct page *page, unsigned long pfn,
>>         }
>>  }
>>
>> +/*
>> + * With compound page geometry and when struct pages are stored in ram 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. This is a paired / mild layering violation with explicit knowledge
>> + * of how the sparse_vmemmap internals handle compound pages in the lack
>> + * of an altmap. See vmemmap_populate_compound_pages().
>> + */
>> +static inline unsigned long compound_nr_pages(struct vmem_altmap *altmap,
>> +                                             unsigned long nr_pages)
>> +{
>> +       return is_power_of_2(sizeof(struct page)) &&
>> +               !altmap ? 2 * (PAGE_SIZE/sizeof(struct page)) : nr_pages;
> 
> It is better to add spaces around that '/'.

/me nods



[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux