Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759618AbZGACwf (ORCPT ); Tue, 30 Jun 2009 22:52:35 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754371AbZGACw1 (ORCPT ); Tue, 30 Jun 2009 22:52:27 -0400 Received: from fgwmail6.fujitsu.co.jp ([192.51.44.36]:33491 "EHLO fgwmail6.fujitsu.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753027AbZGACw0 (ORCPT ); Tue, 30 Jun 2009 22:52:26 -0400 From: KOSAKI Motohiro To: David Rientjes Subject: Re: [PATCH v2] Show kernel stack usage to /proc/meminfo and OOM log Cc: kosaki.motohiro@jp.fujitsu.com, Christoph Lameter , Minchan Kim , Johannes Weiner , David Howells , Rik van Riel , Andrew Morton , linux-kernel@vger.kernel.org, Peter Zijlstra , "tytso@mit.edu" , linux-mm@kvack.org, "elladan@eskimo.com" , "Barnes, Jesse" , Nick Piggin In-Reply-To: References: <20090701103622.85CD.A69D9226@jp.fujitsu.com> Message-Id: <20090701112345.85D0.A69D9226@jp.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Mailer: Becky! ver. 2.50.07 [ja] Date: Wed, 1 Jul 2009 11:52:27 +0900 (JST) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4947 Lines: 153 > On Wed, 1 Jul 2009, KOSAKI Motohiro wrote: > > > Subject: [PATCH] Show kernel stack usage to /proc/meminfo and OOM log > > > > if the system have a lot of thread, kernel stack consume unignorable large size > > memory. > > IOW, it make a lot of unaccountable memory. > > > > Tons unaccountable memory bring to harder analyse memory related trouble. > > > > Then, kernel stack account is useful. > > > > > > I know this is the second revision of the patch, apologies for not > responding to the first. Thanks, good review. > > > Signed-off-by: KOSAKI Motohiro > > --- > > fs/proc/meminfo.c | 2 ++ > > include/linux/mmzone.h | 3 ++- > > kernel/fork.c | 12 ++++++++++++ > > mm/page_alloc.c | 6 ++++-- > > mm/vmstat.c | 1 + > > 5 files changed, 21 insertions(+), 3 deletions(-) > > > > Index: b/fs/proc/meminfo.c > > =================================================================== > > --- a/fs/proc/meminfo.c > > +++ b/fs/proc/meminfo.c > > @@ -85,6 +85,7 @@ static int meminfo_proc_show(struct seq_ > > "SReclaimable: %8lu kB\n" > > "SUnreclaim: %8lu kB\n" > > "PageTables: %8lu kB\n" > > + "KernelStack %8lu kB\n" > > Missing :. Grr, thanks. Will fix. > > > #ifdef CONFIG_QUICKLIST > > "Quicklists: %8lu kB\n" > > #endif > > @@ -129,6 +130,7 @@ static int meminfo_proc_show(struct seq_ > > K(global_page_state(NR_SLAB_RECLAIMABLE)), > > K(global_page_state(NR_SLAB_UNRECLAIMABLE)), > > K(global_page_state(NR_PAGETABLE)), > > + K(global_page_state(NR_KERNEL_STACK)), > > #ifdef CONFIG_QUICKLIST > > K(quicklist_total_size()), > > #endif > > Index: b/include/linux/mmzone.h > > =================================================================== > > --- a/include/linux/mmzone.h > > +++ b/include/linux/mmzone.h > > @@ -94,10 +94,11 @@ enum zone_stat_item { > > NR_SLAB_RECLAIMABLE, > > NR_SLAB_UNRECLAIMABLE, > > NR_PAGETABLE, /* used for pagetables */ > > + NR_KERNEL_STACK, > > + /* Second 128 byte cacheline */ > > NR_UNSTABLE_NFS, /* NFS unstable pages */ > > NR_BOUNCE, > > NR_VMSCAN_WRITE, > > - /* Second 128 byte cacheline */ > > NR_WRITEBACK_TEMP, /* Writeback using temporary buffers */ > > #ifdef CONFIG_NUMA > > NUMA_HIT, /* allocated in intended node */ > > Index: b/kernel/fork.c > > =================================================================== > > --- a/kernel/fork.c > > +++ b/kernel/fork.c > > @@ -137,9 +137,18 @@ struct kmem_cache *vm_area_cachep; > > /* SLAB cache for mm_struct structures (tsk->mm) */ > > static struct kmem_cache *mm_cachep; > > > > +static void account_kernel_stack(struct thread_info *ti, int on) > > +{ > > + struct zone *zone = page_zone(virt_to_page(ti)); > > + int pages = THREAD_SIZE / PAGE_SIZE; > > + > > + mod_zone_page_state(zone, NR_KERNEL_STACK, on ? pages : -pages); > > +} > > + > > void free_task(struct task_struct *tsk) > > { > > prop_local_destroy_single(&tsk->dirties); > > + account_kernel_stack(tsk->stack, 0); > > I think it would be better to do > > #define THREAD_PAGES (THREAD_SIZE / PAGE_SIZE) > > since it's currently unused and then > > struct zone *zone = page_zone(virt_to_page(tsk->stack)); > mod_zone_page_state(zone, NR_KERNEL_STACK, THREAD_PAGES); > > in free_task() and > > struct zone *zone = page_zone(virt_to_page(ti)); > mod_zone_page_state(zone, NR_KERNEL_STACK, -THREAD_PAGES); > > in dup_task_struct(). maybe, gcc makes same code. then I keep current code. because "struct zone *zone = page_zone(virt_to_page(tsk->stack))" line is a bit complicate statement and I don't hope sprinkle it. > > > free_thread_info(tsk->stack); > > rt_mutex_debug_task_free(tsk); > > ftrace_graph_exit_task(tsk); > > @@ -255,6 +264,9 @@ static struct task_struct *dup_task_stru > > tsk->btrace_seq = 0; > > #endif > > tsk->splice_pipe = NULL; > > + > > + account_kernel_stack(ti, 1); > > + > > return tsk; > > > > out: > > Index: b/mm/page_alloc.c > > =================================================================== > > --- a/mm/page_alloc.c > > +++ b/mm/page_alloc.c > > @@ -2119,7 +2119,8 @@ void show_free_areas(void) > > " inactive_file:%lu" > > " unevictable:%lu" > > " dirty:%lu writeback:%lu unstable:%lu\n" > > - " free:%lu slab:%lu mapped:%lu pagetables:%lu bounce:%lu\n", > > + " free:%lu slab:%lu mapped:%lu pagetables:%lu bounce:%lu\n" > > + " kernel_stack:%lu\n", > > Does kernel_stack really need to be printed on its own line? Well, my another patch (Makes slab pages field in show_free_areas() separate two field) already used full space of previous line. new line is really needed. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/