[PATCH] kexec: Export free_huge_page to VMCOREINFO

Baoquan He bhe at redhat.com
Thu Jul 24 02:30:37 PDT 2014


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 at redhat.com>
> 
> 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 at mxc.nes.nec.co.jp>
> > ---
> >  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 at lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/kexec
> 
> _______________________________________________
> kexec mailing list
> kexec at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec



More information about the kexec mailing list