On Mon, Aug 13, 2012 at 11:04:53AM -0700, Greg KH wrote:
> 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?

The sparse section allocation moved to mm/sparse.c after 3.4.  The
issue fixed is the same, but the underlying base has completely
changed and this "backport" is essentially done from scratch.
--
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