From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754799AbZEIJ0V (ORCPT ); Sat, 9 May 2009 05:26:21 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751076AbZEIJ0M (ORCPT ); Sat, 9 May 2009 05:26:12 -0400 Received: from fgwmail7.fujitsu.co.jp ([192.51.44.37]:55957 "EHLO fgwmail7.fujitsu.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751144AbZEIJ0K (ORCPT ); Sat, 9 May 2009 05:26:10 -0400 From: KOSAKI Motohiro To: Ingo Molnar Subject: Re: [PATCH v3] cpuacct: VIRT_CPU_ACCOUNTING don't prevent percpu cputime count Cc: kosaki.motohiro@jp.fujitsu.com, LKML , Bharata B Rao , Balaji Rao , Dhaval Giani , KAMEZAWA Hiroyuki , Peter Zijlstra , Balbir Singh , Martin Schwidefsky In-Reply-To: <20090507105007.GA28398@elte.hu> References: <20090507185831.9D24.A69D9226@jp.fujitsu.com> <20090507105007.GA28398@elte.hu> Message-Id: <20090509182541.8D0F.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 [ja] Date: Sat, 9 May 2009 18:26:08 +0900 (JST) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > > * KOSAKI Motohiro wrote: > > > > > Changelog: > > since v2 > > - revert using percpu_counter_sum() > > > > since v1 > > - use percpu_counter_sum() instead percpu_counter_read() > > > > > > ------------------------------------- > > Subject: [PATCH v3] cpuacct: VIRT_CPU_ACCOUNTING don't prevent percpu cputime count > > > > cpuacct_update_stats() is called at every tick updating. and it use percpu_counter > > for avoiding performance degression. > > > > For archs which define VIRT_CPU_ACCOUNTING, every tick would result > > in >1000 units of cputime updates and since this is much much greater > > than percpu_batch_counter, we end up taking spinlock on every tick. > > > > This patch change batch rule. now, any cpu can store "percpu_counter_bach * jiffies" > > cputime in per-cpu cache. > > it mean this patch don't have behavior change if VIRT_CPU_ACCOUNTING=n. > > > > Cc: Bharata B Rao > > Cc: Balaji Rao > > Cc: Dhaval Giani > > Cc: KAMEZAWA Hiroyuki > > Cc: Peter Zijlstra > > Cc: Balbir Singh > > Cc: Ingo Molnar > > Cc: Martin Schwidefsky > > Signed-off-by: KOSAKI Motohiro > > --- > > kernel/sched.c | 6 +++++- > > 1 file changed, 5 insertions(+), 1 deletion(-) > > > > Index: b/kernel/sched.c > > =================================================================== > > --- a/kernel/sched.c 2009-04-30 11:37:47.000000000 +0900 > > +++ b/kernel/sched.c 2009-05-07 16:34:00.000000000 +0900 > > @@ -10221,6 +10221,7 @@ struct cpuacct { > > }; > > > > struct cgroup_subsys cpuacct_subsys; > > +static s32 cpuacct_batch; > > should be __read_mostly i guess. > > > > > /* return cpu accounting group corresponding to this container */ > > static inline struct cpuacct *cgroup_ca(struct cgroup *cgrp) > > @@ -10250,6 +10251,9 @@ static struct cgroup_subsys_state *cpuac > > if (!ca->cpuusage) > > goto out_free_ca; > > > > + if (!cpuacct_batch) > > + cpuacct_batch = jiffies_to_cputime(percpu_counter_batch); > > So this is a once per boot condition? Why not initialize it in > sched_init() or so? (instead of incuring this ugly check all the > time) Thanks! fixed. Changelog: since V3 - rewirte patch description (thanks Bharata!) - append read_mostly to cpuacct_batch - cpuacct_batch is initialized by sched_init() since v2 - revert using percpu_counter_sum() since v1 - use percpu_counter_sum() instead percpu_counter_read() --------------------------------------------------------- Subject: [PATCH v4] cpuacct: Use bigger percpu counter batch values for stats counters on archs that have VIRT_CPU_ACCOUNTING=y percpu counters used to accumulate statistics in cpuacct controller use the default batch value [max(2*nr_cpus, 32)] which can be too small for archs that define VIRT_CPU_ACCOUNTING. In such archs, a tick could result in cputime updates in the range of thousands. As a result, cpuacct_update_stats() would end up acquiring the percpu counter spinlock on every tick which is not good for performance. Let those architectures to have a bigger batch threshold so that percpu counter spinlock isn't taken on every tick. This change doesn't affect the archs which don't define VIRT_CPU_ACCOUNTING and they continue to have the default percpu counter batch value. Cc: Balaji Rao Cc: Dhaval Giani Cc: KAMEZAWA Hiroyuki Cc: Peter Zijlstra Cc: Balbir Singh Cc: Ingo Molnar Cc: Martin Schwidefsky Signed-off-by: Bharata B Rao Signed-off-by: KOSAKI Motohiro --- kernel/sched.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) Index: b/kernel/sched.c =================================================================== --- a/kernel/sched.c 2009-05-09 16:48:08.000000000 +0900 +++ b/kernel/sched.c 2009-05-09 18:16:00.000000000 +0900 @@ -824,8 +824,12 @@ static struct file_operations sched_feat .release = single_release, }; +static __read_mostly s32 cpuacct_batch; + static __init int sched_init_debug(void) { + cpuacct_batch = jiffies_to_cputime(percpu_counter_batch); + debugfs_create_file("sched_features", 0644, NULL, NULL, &sched_feat_fops); @@ -10457,7 +10461,8 @@ static void cpuacct_update_stats(struct ca = task_ca(tsk); do { - percpu_counter_add(&ca->cpustat[idx], val); + __percpu_counter_add(&ca->cpustat[idx], val, cpuacct_batch); + ca = ca->parent; } while (ca); rcu_read_unlock();