Messages in this thread | | | Date | Fri, 12 Jun 2009 16:29:52 +0900 | From | KAMEZAWA Hiroyuki <> | Subject | Re: [GIT PULL v3] Early boot SLAB for 2.6.31 |
| |
On Fri, 12 Jun 2009 10:29:48 +0300 Pekka Enberg <penberg@cs.helsinki.fi> wrote:
> Hi Ingo, > > On Fri, 2009-06-12 at 09:17 +0200, Ingo Molnar wrote: > > Plus i quickly got this crash too: > > > > [ 0.000000] console [tty0] enabled > > [ 0.000000] allocation of page_cgroup was failed. > > [ 0.000000] please try cgroup_disable=memory boot option > > [ 0.000000] Kernel panic - not syncing: Out of memory > > [ 0.000000] Rebooting in 1 seconds..<1>BUG: unable to handle kernel NULL pointer dereference at 0000004c > > [ 0.000000] IP: [<c16ec708>] klist_next+0x10/0x8f > > [ 0.000000] *pdpt = 0000000001a8a001 *pde = 0000000000000000 > > [ 0.000000] Thread overran stack, or stack corrupted > > Hmm, does this patch fix it? Hiroyuki, Li, does the oops look familiar to you? > > Pekka > Ah, yes. maybe. This line "please try cgroup_disable=memory boot option" implies that.
-Kame
> From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> > > Now, SLAB is configured in very early stage and it can be used in > init routine now. > > But replacing alloc_bootmem() in FLAT/DISCONTIGMEM's page_cgroup() > initialization breaks the allocation, now. > (Works well in SPARSEMEM case...it supports MEMORY_HOTPLUG and > size of page_cgroup is in reasonable size (< 1 << MAX_ORDER.) > > This patch revive FLATMEM+memory cgroup by using alloc_bootmem. > > In future, > We stop to support FLATMEM (if no users) or rewrite codes for flatmem > completely.But this will adds more messy codes and overheads. > > Changelog: v1->v2 > - fixed typos. > > Acked-by: Pekka Enberg <penberg@cs.helsinki.fi> > Tested-by: Li Zefan <lizf@cn.fujitsu.com> > Reported-by: Li Zefan <lizf@cn.fujitsu.com> > Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> > --- > include/linux/page_cgroup.h | 18 +++++++++++++++++- > init/main.c | 5 +++++ > mm/page_cgroup.c | 29 ++++++++++------------------- > 3 files changed, 32 insertions(+), 20 deletions(-) > > Index: linux-2.6.30.org/init/main.c > =================================================================== > --- linux-2.6.30.org.orig/init/main.c 2009-06-11 19:02:53.000000000 +0900 > +++ linux-2.6.30.org/init/main.c 2009-06-11 20:49:21.000000000 +0900 > @@ -539,6 +539,11 @@ > */ > static void __init mm_init(void) > { > + /* > + * page_cgroup requires countinous pages as memmap > + * and it's bigger than MAX_ORDER unless SPARSEMEM. > + */ > + page_cgroup_init_flatmem(); > mem_init(); > kmem_cache_init(); > vmalloc_init(); > Index: linux-2.6.30.org/mm/page_cgroup.c > =================================================================== > --- linux-2.6.30.org.orig/mm/page_cgroup.c 2009-06-11 19:02:53.000000000 +0900 > +++ linux-2.6.30.org/mm/page_cgroup.c 2009-06-11 20:49:59.000000000 +0900 > @@ -47,8 +47,6 @@ > struct page_cgroup *base, *pc; > unsigned long table_size; > unsigned long start_pfn, nr_pages, index; > - struct page *page; > - unsigned int order; > > start_pfn = NODE_DATA(nid)->node_start_pfn; > nr_pages = NODE_DATA(nid)->node_spanned_pages; > @@ -57,13 +55,11 @@ > return 0; > > table_size = sizeof(struct page_cgroup) * nr_pages; > - order = get_order(table_size); > - page = alloc_pages_node(nid, GFP_NOWAIT | __GFP_ZERO, order); > - if (!page) > - page = alloc_pages_node(-1, GFP_NOWAIT | __GFP_ZERO, order); > - if (!page) > + > + base = __alloc_bootmem_node_nopanic(NODE_DATA(nid), > + table_size, PAGE_SIZE, __pa(MAX_DMA_ADDRESS)); > + if (!base) > return -ENOMEM; > - base = page_address(page); > for (index = 0; index < nr_pages; index++) { > pc = base + index; > __init_page_cgroup(pc, start_pfn + index); > @@ -73,7 +69,7 @@ > return 0; > } > > -void __init page_cgroup_init(void) > +void __init page_cgroup_init_flatmem(void) > { > > int nid, fail; > @@ -117,16 +113,11 @@ > if (!section->page_cgroup) { > nid = page_to_nid(pfn_to_page(pfn)); > table_size = sizeof(struct page_cgroup) * PAGES_PER_SECTION; > - if (slab_is_available()) { > - base = kmalloc_node(table_size, > - GFP_KERNEL | __GFP_NOWARN, nid); > - if (!base) > - base = vmalloc_node(table_size, nid); > - } else { > - base = __alloc_bootmem_node_nopanic(NODE_DATA(nid), > - table_size, > - PAGE_SIZE, __pa(MAX_DMA_ADDRESS)); > - } > + VM_BUG_ON(!slab_is_available()); > + base = kmalloc_node(table_size, > + GFP_KERNEL | __GFP_NOWARN, nid); > + if (!base) > + base = vmalloc_node(table_size, nid); > } else { > /* > * We don't have to allocate page_cgroup again, but > Index: linux-2.6.30.org/include/linux/page_cgroup.h > =================================================================== > --- linux-2.6.30.org.orig/include/linux/page_cgroup.h 2009-06-10 12:05:27.000000000 +0900 > +++ linux-2.6.30.org/include/linux/page_cgroup.h 2009-06-11 20:50:32.000000000 +0900 > @@ -18,7 +18,19 @@ > }; > > void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat); > -void __init page_cgroup_init(void); > + > +#ifdef CONFIG_SPARSEMEM > +static inline void __init page_cgroup_init_flatmem(void) > +{ > +} > +extern void __init page_cgroup_init(void); > +#else > +void __init page_cgroup_init_flatmem(void); > +static inline void __init page_cgroup_init(void) > +{ > +} > +#endif > + > struct page_cgroup *lookup_page_cgroup(struct page *page); > > enum { > @@ -87,6 +99,10 @@ > { > } > > +static inline void __init page_cgroup_init_flatmem(void) > +{ > +} > + > #endif > > #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP > > > >
| |