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
