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
