Re: [PATCH] kexec: Export free_huge_page to VMCOREINFO

From: Baoquan He
Date: Thu Jul 24 2014 - 05:32:39 EST


To Eric and Andrew.

On 07/24/14 at 05:05pm, Baoquan He wrote:
> On 07/11/14 at 10:34am, Atsushi Kumagai wrote:
> > PG_head_mask was added into VMCOREINFO to filter huge pages in
> > commit:b3acc56bfe1(kexec: save PG_head_mask in VMCOREINFO), but
> > makedumpfile still need another symbol to filter *hugetlbfs* pages.
> >
> > If a user hope to filter user pages, makedumpfile tries to exclude
> > them by checking the condition whether the page is anonymous, but
> > hugetlbfs pages aren't anonymous while they also be user pages.
> >
> > We know it's possible to detect them in the same way as PageHuge(),
> > so we need the start address of free_huge_page():
> >
> > int PageHuge(struct page *page)
> > {
> > if (!PageCompound(page))
> > return 0;
> >
> > page = compound_head(page);
> > return get_compound_page_dtor(page) == free_huge_page;
> > }
>
> Since makedumpfile need filter huge pages used for user pages.
> Transparent huge pages can be recognised because it's marked as
> anonymous page for now. However hugetlbfs huge pages and normal
> huge pages can only be differentiated by compound_page_dtor,
> hugetlbfs set free_huge_page as compound_page_dtor. So it makes
> sense to export compound_page_dtor to VMCOREINFO.
>
> Ack it.
>
> Acked-by: Baoquan He <bhe@xxxxxxxxxx>
>
> Thanks
> Baoquan
>
> >
> > For that reason, this patch changes free_huge_page() into public
> > to export it to VMCOREINFO.
> >
> > Signed-off-by: Atsushi Kumagai <kumagai-atsushi@xxxxxxxxxxxxxxxxx>
> > ---
> > include/linux/hugetlb.h | 1 +
> > kernel/kexec.c | 2 ++
> > mm/hugetlb.c | 2 +-
> > 3 files changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
> > index 255cd5c..a23c096 100644
> > --- a/include/linux/hugetlb.h
> > +++ b/include/linux/hugetlb.h
> > @@ -80,6 +80,7 @@ int dequeue_hwpoisoned_huge_page(struct page *page);
> > bool isolate_huge_page(struct page *page, struct list_head *list);
> > void putback_active_hugepage(struct page *page);
> > bool is_hugepage_active(struct page *page);
> > +void free_huge_page(struct page *page);
> >
> > #ifdef CONFIG_ARCH_WANT_HUGE_PMD_SHARE
> > pte_t *huge_pmd_share(struct mm_struct *mm, unsigned long addr, pud_t *pud);
> > diff --git a/kernel/kexec.c b/kernel/kexec.c
> > index 369f41a..23a088f 100644
> > --- a/kernel/kexec.c
> > +++ b/kernel/kexec.c
> > @@ -33,6 +33,7 @@
> > #include <linux/swap.h>
> > #include <linux/syscore_ops.h>
> > #include <linux/compiler.h>
> > +#include <linux/hugetlb.h>
> >
> > #include <asm/page.h>
> > #include <asm/uaccess.h>
> > @@ -1619,6 +1620,7 @@ static int __init crash_save_vmcoreinfo_init(void)
> > #endif
> > VMCOREINFO_NUMBER(PG_head_mask);
> > VMCOREINFO_NUMBER(PAGE_BUDDY_MAPCOUNT_VALUE);
> > + VMCOREINFO_SYMBOL(free_huge_page);
> >
> > arch_crash_save_vmcoreinfo();
> > update_vmcoreinfo_note();
> > diff --git a/mm/hugetlb.c b/mm/hugetlb.c
> > index 2024bbd..d5437eb 100644
> > --- a/mm/hugetlb.c
> > +++ b/mm/hugetlb.c
> > @@ -856,7 +856,7 @@ struct hstate *size_to_hstate(unsigned long size)
> > return NULL;
> > }
> >
> > -static void free_huge_page(struct page *page)
> > +void free_huge_page(struct page *page)
> > {
> > /*
> > * Can't pass hstate in here because it is called from the
> > --
> > 1.9.0
> >
> > _______________________________________________
> > kexec mailing list
> > kexec@xxxxxxxxxxxxxxxxxxx
> > http://lists.infradead.org/mailman/listinfo/kexec
>
> _______________________________________________
> kexec mailing list
> kexec@xxxxxxxxxxxxxxxxxxx
> http://lists.infradead.org/mailman/listinfo/kexec
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/