Re: [PATCH 1/3] mm: hugetlbfs: fix hugetlbfs optimization

Andrea Arcangeli
2013-11-20T00:26:30Z

On Tue, Nov 19, 2013 at 03:11:46PM -0800, Andrew Morton wrote:
> This is all rather verbose. How about we do this?
>
> --- a/mm/hugetlb.c~mm-hugetlbc-simplify-pageheadhuge-and-pagehuge
> +++ a/mm/hugetlb.c
> @@ -690,15 +690,11 @@ static void prep_compound_gigantic_page(
> */
> int PageHuge(struct page *page)
> {
> - compound_page_dtor *dtor;
> -
> if (!PageCompound(page))
> return 0;
>
> page = compound_head(page);
> - dtor = get_compound_page_dtor(page);
> -
> - return dtor == free_huge_page;
> + return get_compound_page_dtor(page) == free_huge_page;
> }
> EXPORT_SYMBOL_GPL(PageHuge);
>
> @@ -708,14 +704,10 @@ EXPORT_SYMBOL_GPL(PageHuge);
> */
> int PageHeadHuge(struct page *page_head)
> {
> - compound_page_dtor *dtor;
> -
> if (!PageHead(page_head))
> return 0;
>
> - dtor = get_compound_page_dtor(page_head);
> -
> - return dtor == free_huge_page;
> + return get_compound_page_dtor(page_head) == free_huge_page;
> }
> EXPORT_SYMBOL_GPL(PageHeadHuge);

Sure good idea!

> > @@ -82,19 +82,6 @@ static void __put_compound_page(struct page *page)
> >
> > static void put_compound_page(struct page *page)
>
> This function has become quite crazy. I sat down to refamiliarize but
> immediately failed.
>
> : static void put_compound_page(struct page *page)
> : {
> : if (unlikely(PageTail(page))) {
> : ...
> : } else if (put_page_testzero(page)) {
> : if (PageHead(page))
>
> How can a page be both PageTail() and PageHead()?

We execute the PageHead you quoted only if it's !PageTail. So then
PageHead tells us if if it's compound head or not compound by the time
all reference counts have been released (by the time the last
reference is released it can't be splitted anymore).

>
> : __put_compound_page(page);
> : else
> : __put_single_page(page);
> : }
> : }
> :
> :
>