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

From: Andrea Arcangeli
Date: Tue Nov 19 2013 - 19:26:36 EST


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);
> : }
> : }
> :
> :
>
--
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/