From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933427AbcFOW3k (ORCPT ); Wed, 15 Jun 2016 18:29:40 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:41549 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933043AbcFOW2j (ORCPT ); Wed, 15 Jun 2016 18:28:39 -0400 X-IBM-Helo: d01dlp03.pok.ibm.com X-IBM-MailFrom: paulmck@linux.vnet.ibm.com X-IBM-RcptTo: linux-kernel@vger.kernel.org From: "Paul E. McKenney" To: linux-kernel@vger.kernel.org Cc: mingo@kernel.org, jiangshanlai@gmail.com, dipankar@in.ibm.com, akpm@linux-foundation.org, mathieu.desnoyers@efficios.com, josh@joshtriplett.org, tglx@linutronix.de, peterz@infradead.org, rostedt@goodmis.org, dhowells@redhat.com, edumazet@google.com, dvhart@linux.intel.com, fweisbec@gmail.com, oleg@redhat.com, bobby.prani@gmail.com, "Paul E. McKenney" Subject: [PATCH tip/core/rcu 4/8] waketorture: Add utilization measurement Date: Wed, 15 Jun 2016 15:28:24 -0700 X-Mailer: git-send-email 2.5.2 In-Reply-To: <20160615222756.GA10695@linux.vnet.ibm.com> References: <20160615222756.GA10695@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16061522-0044-0000-0000-0000006949F3 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16061522-0045-0000-0000-0000047E5062 Message-Id: <1466029708-11359-4-git-send-email-paulmck@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-06-15_13:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1604210000 definitions=main-1606150236 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Signed-off-by: Paul E. McKenney --- kernel/rcu/waketorture.c | 29 ++++++++++++++++++++++++++++- lib/Kconfig.debug | 1 + 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/kernel/rcu/waketorture.c b/kernel/rcu/waketorture.c index 75bc547206cc..3068a5c858c8 100644 --- a/kernel/rcu/waketorture.c +++ b/kernel/rcu/waketorture.c @@ -81,7 +81,9 @@ static unsigned long *waiter_iter; /* Number of wait iterations. */ static bool *waiter_cts; /* Waiter already checked. */ static unsigned long *waiter_kicks; /* Number of waiter starvations. */ static unsigned long *waiter_ts; /* Jiffies last run. */ -DEFINE_MUTEX(waiter_mutex); +static DEFINE_MUTEX(waiter_mutex); +static DEFINE_PER_CPU(u64, waiter_cputime); /* Nanoseconds. */ +static u64 starttime; static int torture_runnable = IS_ENABLED(MODULE); module_param(torture_runnable, int, 0444); @@ -133,16 +135,23 @@ static int wake_torture_waiter(void *arg) { int i; long me = (long)arg; + u64 ts; VERBOSE_TOROUT_STRING("wake_torture_waiter task started"); set_user_nice(current, MAX_NICE); + preempt_disable(); + ts = trace_clock_local(); do { waiter_ts[me] = jiffies; smp_mb(); /* Ensure waiter_ts[] written before waiter_cts[]. */ /* Pairs with [A]. */ waiter_cts[me] = false; + __this_cpu_add(waiter_cputime, trace_clock_local() - ts); + preempt_enable(); cur_ops->wait(wait_duration); + preempt_disable(); + ts = trace_clock_local(); waiter_iter[me]++; for (i = 0; i < nrealwaiters; i++) { if (waiter_done[i] || @@ -164,8 +173,14 @@ static int wake_torture_waiter(void *arg) mutex_unlock(&waiter_mutex); } } + __this_cpu_add(waiter_cputime, trace_clock_local() - ts); + preempt_enable(); torture_shutdown_absorb("wake_torture_waiter"); + preempt_disable(); + ts = trace_clock_local(); } while (!torture_must_stop()); + __this_cpu_add(waiter_cputime, trace_clock_local() - ts); + preempt_enable(); mutex_lock(&waiter_mutex); waiter_done[me] = true; mutex_unlock(&waiter_mutex); @@ -189,6 +204,8 @@ wake_torture_stats_print(void) { int i; bool tardy = false; + u64 timediff; + u64 timetot; if (!waiter_done || !waiter_iter || !waiter_cts || !waiter_kicks || !waiter_ts) { @@ -212,6 +229,15 @@ wake_torture_stats_print(void) pr_cont("\n"); else TOROUT_STRING(" No tardy kthreads"); + timediff = (trace_clock_global() - starttime) / 1000; + timetot = 0; + for_each_possible_cpu(i) + timetot += READ_ONCE(per_cpu(waiter_cputime, i)); + timetot /= nr_cpu_ids; + timetot /= timediff; + pr_alert("%s" TORTURE_FLAG " timediff: %llu utilization: %llu.%llu nr_cpu_ids: %d\n", + torture_type, timediff, + timetot / 1000ULL, timetot % 1000ULL, nr_cpu_ids); } /* @@ -290,6 +316,7 @@ wake_torture_init(void) if (!torture_init_begin(torture_type, verbose, &torture_runnable)) return -EBUSY; + starttime = trace_clock_global(); /* Process args and tell the world that the torturer is on the job. */ for (i = 0; i < ARRAY_SIZE(torture_ops); i++) { diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index f0dcb4c0fe96..c8fb7dad5062 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -1403,6 +1403,7 @@ config WAKE_TORTURE_TEST tristate "Torture test for wakeups and CPU hotplug" depends on DEBUG_KERNEL depends on 64BIT + depends on TRACE_CLOCK select TORTURE_TEST default n help -- 2.5.2