On Mon, 19 Nov 2012 00:07:29 +0800
Jiang Liu <liu...@gmail.com> wrote:

> If SPARSEMEM is enabled, it won't build page structures for
> non-existing pages (holes) within a zone, so provide a more accurate
> estimation of pages occupied by memmap if there are big holes within
> the zone.
> 
> And pages for highmem zones' memmap will be allocated from lowmem,
> so charge nr_kernel_pages for that.
> 
> ...
>
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -4435,6 +4435,22 @@ void __init set_pageblock_order(void)
>  
>  #endif /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */
>  
> +static unsigned long calc_memmap_size(unsigned long spanned_pages,
> +                                   unsigned long present_pages)
> +{
> +     unsigned long pages = spanned_pages;
> +
> +     /*
> +      * Provide a more accurate estimation if there are big holes within
> +      * the zone and SPARSEMEM is in use.
> +      */
> +     if (spanned_pages > present_pages + (present_pages >> 4) &&
> +         IS_ENABLED(CONFIG_SPARSEMEM))
> +             pages = present_pages;
> +
> +     return PAGE_ALIGN(pages * sizeof(struct page)) >> PAGE_SHIFT;
> +}

Please explain the ">> 4" heuristc more completely - preferably in both
the changelog and code comments.  Why can't we calculate this
requirement exactly?  That might require a second pass, but that's OK for
code like this?

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to