On Mon, Jul 30, 2012 at 07:12:39PM +0200, Johannes Weiner wrote:
> On Wed, Jul 11, 2012 at 04:40:00PM -0700, [email protected] wrote:
> > 
> > The patch below does not apply to the 3.4-stable tree.
> > If someone wants it applied there, or to any other stable or longterm
> > tree, then please email the backport, including the original git commit
> > id to <[email protected]>.
> > 
> > thanks,
> > 
> > greg k-h
> 
> ---
> From: Johannes Weiner <[email protected]>
> Subject: [patch] mm: bootmem: fix sparse usemap allocation above node
>  descriptor section
> 
> commit 99ab7b19440a72ebdf225f99b20f8ef40decee86 upstream.
> 
> After commit f5bf18fa22f8 ("bootmem/sparsemem: remove limit constraint
> in alloc_bootmem_section"), usemap allocations may easily be placed
> outside the optimal section that holds the node descriptor, even if
> there is space available in that section.  This results in unnecessary
> hotplug dependencies that need to have the node unplugged before the
> section holding the usemap.
> 
> The reason is that the bootmem allocator doesn't guarantee a linear
> search starting from the passed allocation goal but may start out at a
> much higher address absent an upper limit.
> 
> Fix this by trying the allocation with the limit at the section end
> again, but not if this is impossible due to the size of the
> allocation.  This keeps the fix from f5bf18fa22f8 of not panicking if
> the allocation does not fit in the section, but still makes sure to
> try to stay within the section if possible.
> 
> Signed-off-by: Johannes Weiner <[email protected]>
> ---
>  mm/bootmem.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/mm/bootmem.c b/mm/bootmem.c
> index 0131170..53cf62b 100644
> --- a/mm/bootmem.c
> +++ b/mm/bootmem.c
> @@ -766,13 +766,17 @@ void * __init alloc_bootmem_section(unsigned long size,
>                                   unsigned long section_nr)
>  {
>       bootmem_data_t *bdata;
> -     unsigned long pfn, goal;
> +     unsigned long pfn, goal, limit;
>  
>       pfn = section_nr_to_pfn(section_nr);
>       goal = pfn << PAGE_SHIFT;
> +     limit = section_nr_to_pfn(section_nr + 1) << PAGE_SHIFT;
>       bdata = &bootmem_node_data[early_pfn_to_nid(pfn)];
>  
> -     return alloc_bootmem_core(bdata, size, SMP_CACHE_BYTES, goal, 0);
> +     if (goal + size > limit)
> +             limit = 0;
> +
> +     return alloc_bootmem_core(bdata, size, SMP_CACHE_BYTES, goal, limit);
>  }
>  #endif
>  

This is really the backport for 3.4?  It looks _very_ different from the
in-kernel version of this patch, why the major changes?

greg k-h
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to