[PATCH v2] makedumpfile: Exclude unnecessary hugepages.
Atsushi Kumagai
kumagai-atsushi at mxc.nes.nec.co.jp
Wed Jul 16 23:34:33 PDT 2014
Hello Baoquan,
>On 06/17/14 at 02:32am, Atsushi Kumagai wrote:
>> Hello,
>>
>> /*
>> * Exclude the data page of the user process.
>> */
>> - else if ((info->dump_level & DL_EXCLUDE_USER_DATA)
>> - && isAnon(mapping)) {
>> - if (clear_bit_on_2nd_bitmap_for_kernel(pfn, cycle))
>> - pfn_user++;
>> + else if (info->dump_level & DL_EXCLUDE_USER_DATA) {
>Hi Atsushi,
>
>Could it be changed to checking hugepage first, then anonymous page?
>This can avoid involving the free_huge_page.
>
>like this:
> int nr_pages;
> if (page_is_hugepage(flags) {
> int nr_pages = 1 << compound_order;
>
> exclude_range(&pfn_user, pfn, pfn + nr_pages, cycle);
>
> pfn += nr_pages - 1;
> mem_map += (nr_pages - 1) * SIZE(page);
> } else if (isAnon(mapping)) {
> int nr_pages = 1;
>
> exclude_range(&pfn_user, pfn, pfn + nr_pages, cycle);
>
> pfn += nr_pages - 1;
> mem_map += (nr_pages - 1) * SIZE(page);
> }
>
>But I may not know the meaning of free_huge_page completely. If you
>think introducing free_huge_page is better, I am fine too, can ACK that
>kernel patch to export free_huge_page you posted.
The assumption that all compound pages are user pages is wrong since some
kernel pages can be compound. For example, kmalloc_large_node() calls
alloc_pages_node() with __GFP_COMP. This means we have to check compound
user pages without only depending on page_is_hugepage(). We can detect THPs
with the combination of page_is_hugepage() and isAnon(), but it can't be
applied to hugetlbfs pages.
This is why we need to export free_huge_page.
BTW, the v2 code can misdetect hugetlbfs due to the wrong check order,
I'm going to fix it in the next version.
Thanks
Atsushi Kumagai
>Thanks
>Baoquan
>
>> + /*
>> + * Exclude the anonymous pages as user pages.
>> + */
>> + if (isAnon(mapping)) {
>> + int nr_pages;
>> + /*
>> + * Check the compound page
>> + */
>> + if (page_is_hugepage(flags) && compound_order > 0)
>> + nr_pages = 1 << compound_order;
>> + else
>> + nr_pages = 1;
>> +
>> + exclude_range(&pfn_user, pfn, pfn + nr_pages, cycle);
>> +
>> + pfn += nr_pages - 1;
>> + mem_map += (nr_pages - 1) * SIZE(page);
>> + }
>> + /*
>> + * Exclude the hugetlbfs pages as user pages.
>> + */
>> + else if (hugetlb_dtor == SYMBOL(free_huge_page)) {
>> + int nr_pages = 1 << compound_order;
>> +
>> + exclude_range(&pfn_user, pfn, pfn + nr_pages, cycle);
>> +
>> + pfn += nr_pages - 1;
>> + mem_map += (nr_pages - 1) * SIZE(page);
>> + }
>> }
>
>_______________________________________________
>kexec mailing list
>kexec at lists.infradead.org
>http://lists.infradead.org/mailman/listinfo/kexec
More information about the kexec
mailing list