Messages in this thread | | | Date | Fri, 06 May 2011 10:52:22 +0200 | From | Stefan Hellermann <> | Subject | Re: early crash on ancient tablet related to no-bootmem |
| |
Am 06.05.2011 08:30, schrieb Yinghai Lu: > > please check > > [PATCH] mm: Use alloc_bootmem_node_nopanic on really needed path > > Stefan found nobootmem does not work on his system that only have 8M ram. > > It turns out we should ignore the low limit the 16M. > > Use alloc_bootmem_node_nopanic in those calling. > > Reported-by: Stefan Hellermann <stefan@the2masters.de> > Signed-off-by: Yinghai LU <yinghai@kernel.org>
You found it! bootlog attached. Tested-by: Stefan Hellermann <stefan@the2masters.de>
> > --- > include/linux/bootmem.h | 2 ++ > mm/page_alloc.c | 6 +++--- > 2 files changed, 5 insertions(+), 3 deletions(-) > > Index: linux-2.6/include/linux/bootmem.h > =================================================================== > --- linux-2.6.orig/include/linux/bootmem.h > +++ linux-2.6/include/linux/bootmem.h > @@ -111,6 +111,8 @@ extern void *__alloc_bootmem_low_node(pg > __alloc_bootmem_nopanic(x, PAGE_SIZE, __pa(MAX_DMA_ADDRESS)) > #define alloc_bootmem_node(pgdat, x) \ > __alloc_bootmem_node(pgdat, x, SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) > +#define alloc_bootmem_node_nopanic(pgdat, x) \ > + __alloc_bootmem_node_nopanic(pgdat, x, SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) > #define alloc_bootmem_pages_node(pgdat, x) \ > __alloc_bootmem_node(pgdat, x, PAGE_SIZE, __pa(MAX_DMA_ADDRESS)) > #define alloc_bootmem_pages_node_nopanic(pgdat, x) \ > Index: linux-2.6/mm/page_alloc.c > =================================================================== > --- linux-2.6.orig/mm/page_alloc.c > +++ linux-2.6/mm/page_alloc.c > @@ -3564,7 +3564,7 @@ int zone_wait_table_init(struct zone *zo > > if (!slab_is_available()) { > zone->wait_table = (wait_queue_head_t *) > - alloc_bootmem_node(pgdat, alloc_size); > + alloc_bootmem_node_nopanic(pgdat, alloc_size); > } else { > /* > * This case means that a zone whose size was 0 gets new memory > @@ -4141,7 +4141,7 @@ static void __init setup_usemap(struct p > unsigned long usemapsize = usemap_size(zonesize); > zone->pageblock_flags = NULL; > if (usemapsize) > - zone->pageblock_flags = alloc_bootmem_node(pgdat, usemapsize); > + zone->pageblock_flags = alloc_bootmem_node_nopanic(pgdat, usemapsize); > } > #else > static inline void setup_usemap(struct pglist_data *pgdat, > @@ -4307,7 +4307,7 @@ static void __init_refok alloc_node_mem_ > size = (end - start) * sizeof(struct page); > map = alloc_remap(pgdat->node_id, size); > if (!map) > - map = alloc_bootmem_node(pgdat, size); > + map = alloc_bootmem_node_nopanic(pgdat, size); > pgdat->node_mem_map = map + (pgdat->node_start_pfn - start); > } > #ifndef CONFIG_NEED_MULTIPLE_NODES
| |