From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932675AbZFLH34 (ORCPT ); Fri, 12 Jun 2009 03:29:56 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754123AbZFLH3s (ORCPT ); Fri, 12 Jun 2009 03:29:48 -0400 Received: from courier.cs.helsinki.fi ([128.214.9.1]:54833 "EHLO mail.cs.helsinki.fi" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753629AbZFLH3s (ORCPT ); Fri, 12 Jun 2009 03:29:48 -0400 Subject: Re: [GIT PULL v3] Early boot SLAB for 2.6.31 From: Pekka Enberg To: Ingo Molnar Cc: Yinghai Lu , Christoph Lameter , Linus Torvalds , linux-kernel@vger.kernel.org, akpm@linux-foundation.org, hannes@cmpxchg.org, mpm@selenic.com, npiggin@suse.de, kamezawa.hiroyu@jp.fujitsu.com, lizf@cn.fujitsu.com In-Reply-To: <20090612071703.GA29679@elte.hu> References: <84144f020906110706y8df301bhd930dc48f3188d3c@mail.gmail.com> <84144f020906110824g7b3981abmdbcf94ae2f9068de@mail.gmail.com> <4A3143E3.3090705@kernel.org> <20090611214342.GA12762@elte.hu> <20090611220307.GA16180@elte.hu> <20090612071703.GA29679@elte.hu> Date: Fri, 12 Jun 2009 10:29:48 +0300 Message-Id: <1244791788.30512.2.camel@penberg-laptop> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 7bit X-Mailer: Evolution 2.24.3 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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: [] 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 From: KAMEZAWA Hiroyuki 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 Tested-by: Li Zefan Reported-by: Li Zefan Signed-off-by: KAMEZAWA Hiroyuki --- 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