From patchwork Thu Feb 2 02:29:59 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Mundt X-Patchwork-Id: 6565 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id D972323EAE for ; Thu, 2 Feb 2012 02:30:46 +0000 (UTC) Received: from mail-iy0-f180.google.com (mail-iy0-f180.google.com [209.85.210.180]) by fiordland.canonical.com (Postfix) with ESMTP id 8F377A1803E for ; Thu, 2 Feb 2012 02:30:46 +0000 (UTC) Received: by iabz7 with SMTP id z7so3374157iab.11 for ; Wed, 01 Feb 2012 18:30:46 -0800 (PST) Received: by 10.50.10.225 with SMTP id l1mr1252942igb.9.1328149845565; Wed, 01 Feb 2012 18:30:45 -0800 (PST) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.231.169.210 with SMTP id a18cs34509ibz; Wed, 1 Feb 2012 18:30:44 -0800 (PST) Received: by 10.68.190.4 with SMTP id gm4mr3186667pbc.95.1328149844369; Wed, 01 Feb 2012 18:30:44 -0800 (PST) Received: from linux-sh.org (linux-sh.org. [111.68.239.195]) by mx.google.com with ESMTPS id z7si1518277pbm.236.2012.02.01.18.30.43 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 01 Feb 2012 18:30:44 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of lethal@linux-sh.org designates 111.68.239.195 as permitted sender) client-ip=111.68.239.195; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of lethal@linux-sh.org designates 111.68.239.195 as permitted sender) smtp.mail=lethal@linux-sh.org Received: from linux-sh.org (localhost.localdomain [127.0.0.1]) by linux-sh.org (8.14.5/8.14.4) with ESMTP id q122U00Y022244; Thu, 2 Feb 2012 11:30:00 +0900 Received: (from pmundt@localhost) by linux-sh.org (8.14.5/8.14.4/Submit) id q122Tx4I022238; Thu, 2 Feb 2012 11:29:59 +0900 X-Authentication-Warning: linux-sh.org: pmundt set sender to lethal@linux-sh.org using -f Date: Thu, 2 Feb 2012 11:29:59 +0900 From: Paul Mundt To: "Paul E. McKenney" Cc: linux-kernel@vger.kernel.org, mingo@elte.hu, laijs@cn.fujitsu.com, dipankar@in.ibm.com, akpm@linux-foundation.org, mathieu.desnoyers@polymtl.ca, josh@joshtriplett.org, niv@us.ibm.com, tglx@linutronix.de, peterz@infradead.org, rostedt@goodmis.org, Valdis.Kletnieks@vt.edu, dhowells@redhat.com, eric.dumazet@gmail.com, darren@dvhart.com, fweisbec@gmail.com, patches@linaro.org Subject: Re: [PATCH RFC idle] Make arm, sh, and x86 stop using RCU when idle Message-ID: <20120202022959.GA24442@linux-sh.org> References: <20120202004253.GA10946@linux.vnet.ibm.com> Mime-Version: 1.0 Content-Disposition: inline In-Reply-To: <20120202004253.GA10946@linux.vnet.ibm.com> User-Agent: Mutt/1.4.1i On Wed, Feb 01, 2012 at 04:42:53PM -0800, Paul E. McKenney wrote: > Hello! > > RCU's shiny new diagnostics (thank you, Frederic!) for using RCU when idle > located a few problems in arm, sh, and x86. This patch series contains > alleged fixes for these problems. And they are real problems -- if RCU > believes that the CPU is idle, it is ignoring it. Which means that the > idle CPU can say "rcu_read_lock()" all it like, but there will be no > useful effect. > > I was tempted to break these up, but doing so is bad for bisectability. > Presumably the same changes will also need to be reflected in cpuidle? If so, here's a start: Signed-off-by: Paul Mundt diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 59f4261..97adcd4 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "cpuidle.h" @@ -89,6 +90,8 @@ int cpuidle_idle_call(void) next_state = cpuidle_curr_governor->select(drv, dev); if (need_resched()) { local_irq_enable(); + rcu_idle_enter(); + rcu_idle_exit(); return 0; } @@ -96,9 +99,11 @@ int cpuidle_idle_call(void) trace_power_start(POWER_CSTATE, next_state, dev->cpu); trace_cpu_idle(next_state, dev->cpu); + rcu_idle_enter(); entered_state = target_state->enter(dev, drv, next_state); + rcu_idle_exit(); trace_power_end(dev->cpu); trace_cpu_idle(PWR_EVENT_EXIT, dev->cpu); @@ -173,8 +178,10 @@ static int poll_idle(struct cpuidle_device *dev, t1 = ktime_get(); local_irq_enable(); + rcu_idle_enter(); while (!need_resched()) cpu_relax(); + rcu_idle_exit(); t2 = ktime_get(); diff = ktime_to_us(ktime_sub(t2, t1));