Re: [External] Re: [PATCH v7 06/15] mm/hugetlb: Disable freeing vmemmap if struct page size is not power of two

From: David Hildenbrand
Date: Wed Dec 09 2020 - 10:51:11 EST


On 09.12.20 16:13, Muchun Song wrote:
> On Wed, Dec 9, 2020 at 6:10 PM David Hildenbrand <david@xxxxxxxxxx> wrote:
>>
>> On 09.12.20 11:06, David Hildenbrand wrote:
>>> On 09.12.20 11:03, Muchun Song wrote:
>>>> On Wed, Dec 9, 2020 at 5:57 PM David Hildenbrand <david@xxxxxxxxxx> wrote:
>>>>>
>>>>> On 30.11.20 16:18, Muchun Song wrote:
>>>>>> We only can free the tail vmemmap pages of HugeTLB to the buddy allocator
>>>>>> when the size of struct page is a power of two.
>>>>>>
>>>>>> Signed-off-by: Muchun Song <songmuchun@xxxxxxxxxxxxx>
>>>>>> ---
>>>>>> mm/hugetlb_vmemmap.c | 5 +++++
>>>>>> 1 file changed, 5 insertions(+)
>>>>>>
>>>>>> diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c
>>>>>> index 51152e258f39..ad8fc61ea273 100644
>>>>>> --- a/mm/hugetlb_vmemmap.c
>>>>>> +++ b/mm/hugetlb_vmemmap.c
>>>>>> @@ -111,6 +111,11 @@ void __init hugetlb_vmemmap_init(struct hstate *h)
>>>>>> unsigned int nr_pages = pages_per_huge_page(h);
>>>>>> unsigned int vmemmap_pages;
>>>>>>
>>>>>> + if (!is_power_of_2(sizeof(struct page))) {
>>>>>> + pr_info("disable freeing vmemmap pages for %s\n", h->name);
>>>>>
>>>>> I'd just drop that pr_info(). Users are able to observe that it's
>>>>> working (below), so they are able to identify that it's not working as well.
>>>>
>>>> The below is just a pr_debug. Do you suggest converting it to pr_info?
>>>
>>> Good question. I wonder if users really have to know in most cases.
>>> Maybe pr_debug() is good enough in environments where we want to debug
>>> why stuff is not working as expected.
>>>
>>
>> Oh, another thought, can we glue availability of
>> HUGETLB_PAGE_FREE_VMEMMAP (or a new define based on the config and the
>> size of a stuct page) to the size of struct page somehow?
>>
>> I mean, it's known at compile time that this will never work.
>
> I want to define a macro which indicates the size of the
> struct page. There is place (kernel/bounds.c) where can
> do similar things. When I added the following code in
> that file.
>
> DEFINE(STRUCT_PAGE_SIZE, sizeof(struct page));
>
> Then the compiler will output a message like:
>

Hm, from what I understand you cannot use sizeof() in #if etc. So it
might not be possible after all. At least the compiler should optimize
code like

if (!is_power_of_2(sizeof(struct page))) {
// either this
} else {
// or that
}

that can never be reached

--
Thanks,

David / dhildenb