On Wed, Apr 03, 2013 at 04:00:49PM +0200, Michal Hocko wrote: > On Tue 02-04-13 21:43:44, Robin Holt wrote: > [...] > > diff --git a/mm/bootmem.c b/mm/bootmem.c > > index 2b0bcb0..b2e4027 100644 > > --- a/mm/bootmem.c > > +++ b/mm/bootmem.c > > @@ -705,12 +705,16 @@ void * __init __alloc_bootmem(unsigned long size, unsigned long align, > > > > void * __init ___alloc_bootmem_node_nopanic(pg_data_t *pgdat, > > unsigned long size, unsigned long align, > > - unsigned long goal, unsigned long limit) > > + unsigned long goal, unsigned long limit, > > + int zeroed) > > { > > void *ptr; > > > > if (WARN_ON_ONCE(slab_is_available())) > > - return kzalloc(size, GFP_NOWAIT); > > + if (zeroed) > > + return kzalloc(size, GFP_NOWAIT); > > + else > > + return kmalloc(size, GFP_NOWAIT); > > again: > > > > /* do not panic in alloc_bootmem_bdata() */ > > You need to update alloc_bootmem_bdata and alloc_bootmem_core as well. > Otherwise this is a no-op for early allocations when slab is not > available which is the case unless something is broken. Michal, Does this do what you would expect? I compiled this for ia64, but I have not tested it at all. Robin --- mm/bootmem.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/mm/bootmem.c b/mm/bootmem.c index b2e4027..350e0ab 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c @@ -497,7 +497,8 @@ static unsigned long __init align_off(struct bootmem_data *bdata, static void * __init alloc_bootmem_bdata(struct bootmem_data *bdata, unsigned long size, unsigned long align, - unsigned long goal, unsigned long limit) + unsigned long goal, unsigned long limit, + int zeroed) { unsigned long fallback = 0; unsigned long min, max, start, sidx, midx, step; @@ -584,7 +585,8 @@ find_block: region = phys_to_virt(PFN_PHYS(bdata->node_min_pfn) + start_off); - memset(region, 0, size); + if (zeroed) + memset(region, 0, size); /* * The min_count is set to 0 so that bootmem allocated blocks * are never reported as leaks. @@ -605,13 +607,18 @@ find_block: static void * __init alloc_bootmem_core(unsigned long size, unsigned long align, unsigned long goal, - unsigned long limit) + unsigned long limit, + int zeroed) { bootmem_data_t *bdata; void *region; - if (WARN_ON_ONCE(slab_is_available())) - return kzalloc(size, GFP_NOWAIT); + if (WARN_ON_ONCE(slab_is_available())) { + if (zeroed) + return kzalloc(size, GFP_NOWAIT); + else + return kmalloc(size, GFP_NOWAIT); + } list_for_each_entry(bdata, &bdata_list, list) { if (goal && bdata->node_low_pfn <= PFN_DOWN(goal)) @@ -619,7 +626,7 @@ static void * __init alloc_bootmem_core(unsigned long size, if (limit && bdata->node_min_pfn >= PFN_DOWN(limit)) break; - region = alloc_bootmem_bdata(bdata, size, align, goal, limit); + region = alloc_bootmem_bdata(bdata, size, align, goal, limit, zeroed); if (region) return region; } @@ -635,7 +642,7 @@ static void * __init ___alloc_bootmem_nopanic(unsigned long size, void *ptr; restart: - ptr = alloc_bootmem_core(size, align, goal, limit); + ptr = alloc_bootmem_core(size, align, goal, limit, 1); if (ptr) return ptr; if (goal) { @@ -710,22 +717,23 @@ void * __init ___alloc_bootmem_node_nopanic(pg_data_t *pgdat, { void *ptr; - if (WARN_ON_ONCE(slab_is_available())) + if (WARN_ON_ONCE(slab_is_available())) { if (zeroed) return kzalloc(size, GFP_NOWAIT); else return kmalloc(size, GFP_NOWAIT); + } again: /* do not panic in alloc_bootmem_bdata() */ if (limit && goal + size > limit) limit = 0; - ptr = alloc_bootmem_bdata(pgdat->bdata, size, align, goal, limit); + ptr = alloc_bootmem_bdata(pgdat->bdata, size, align, goal, limit, zeroed); if (ptr) return ptr; - ptr = alloc_bootmem_core(size, align, goal, limit); + ptr = alloc_bootmem_core(size, align, goal, limit, zeroed); if (ptr) return ptr; @@ -813,7 +821,7 @@ void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size, new_goal = MAX_DMA32_PFN << PAGE_SHIFT; ptr = alloc_bootmem_bdata(pgdat->bdata, size, align, - new_goal, 0); + new_goal, 0, 1); if (ptr) return ptr; } -- 1.8.1.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>