From: Preeti U Murthy <preeti@linux.vnet.ibm.com>
To: Sam Bobroff <sam.bobroff@au1.ibm.com>,
Linux PPC dev <linuxppc-dev@ozlabs.org>,
"mpe >> Michael Ellerman" <mpe@ellerman.id.au>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Subject: Re: suspicious RCU usage clockevents_lock, tick_broadcast_lock, hrtimer_bases.lock
Date: Fri, 13 Feb 2015 12:52:45 +0530 [thread overview]
Message-ID: <54DDA645.6080600@linux.vnet.ibm.com> (raw)
In-Reply-To: <54DD8B37.2040903@linux.vnet.ibm.com>
On 02/13/2015 10:57 AM, Preeti U Murthy wrote:
> On 02/13/2015 06:27 AM, Sam Bobroff wrote:
>> Hello,
>>
>> I'm receiving this while booting a vanilla 3.19 kernel on a Power 8 machine:
>
> Does the below patch fix the issue ?
>
> From: Preeti U Murthy <preeti@linux.vnet.ibm.com>
>
> [PATCH] tick/hrtimer-broadcast: Fix a suspicious RCU usage in the tick broadcast path
>
> ---
> kernel/time/tick-broadcast-hrtimer.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/kernel/time/tick-broadcast-hrtimer.c b/kernel/time/tick-broadcast-hrtimer.c
> index eb682d5..57b8e32 100644
> --- a/kernel/time/tick-broadcast-hrtimer.c
> +++ b/kernel/time/tick-broadcast-hrtimer.c
> @@ -62,7 +62,7 @@ static int bc_set_next(ktime_t expires, struct clock_event_device *bc)
> * HRTIMER_RESTART.
> */
> if (hrtimer_try_to_cancel(&bctimer) >= 0) {
> - hrtimer_start(&bctimer, expires, HRTIMER_MODE_ABS_PINNED);
> + RCU_NONIDLE(hrtimer_start(&bctimer, expires, HRTIMER_MODE_ABS_PINNED));
> /* Bind the "device" to the cpu */
> bc->bound_on = smp_processor_id();
> } else if (bc->bound_on == smp_processor_id()) {
>
Actually the below patch is the complete fix. Paul can you please
review this ? As an alternate solution I checked to see if its
possible to move rcu_idle_enter()/exit() closer to the
cpuidle_enter() call, but that won't work as you may have already
tried earlier.
-----------------------------------------------------------------
tick/broadcast-hrtimer : Fix suspicious RCU usage in idle loop
From: Preeti U Murthy <preeti@linux.vnet.ibm.com>
The hrtimer mode of broadcast queues hrtimers in the idle entry
path so as to wakeup cpus in deep idle states. hrtimer_{start/cancel}
functions call into tracing which uses RCU. But it is not legal to call
into RCU in cpuidle because it is one of the quiescent states. Hence
protect this region with RCU_NONIDLE which informs RCU that the cpu
is momentarily non-idle.
Signed-off-by: Preeti U Murthy <preeti@linux.vnet.ibm.com>
---
kernel/time/tick-broadcast-hrtimer.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/kernel/time/tick-broadcast-hrtimer.c b/kernel/time/tick-broadcast-hrtimer.c
index eb682d5..d3dd564 100644
--- a/kernel/time/tick-broadcast-hrtimer.c
+++ b/kernel/time/tick-broadcast-hrtimer.c
@@ -49,6 +49,7 @@ static void bc_set_mode(enum clock_event_mode mode,
*/
static int bc_set_next(ktime_t expires, struct clock_event_device *bc)
{
+ int bc_moved;
/*
* We try to cancel the timer first. If the callback is on
* flight on some other cpu then we let it handle it. If we
@@ -60,9 +61,15 @@ static int bc_set_next(ktime_t expires, struct clock_event_device *bc)
* restart the timer because we are in the callback, but we
* can set the expiry time and let the callback return
* HRTIMER_RESTART.
+ *
+ * Since we are in the idle loop at this point and because
+ * hrtimer_{start/cancel} functions call into tracing,
+ * calls to these functions must be bound within RCU_NONIDLE.
*/
- if (hrtimer_try_to_cancel(&bctimer) >= 0) {
- hrtimer_start(&bctimer, expires, HRTIMER_MODE_ABS_PINNED);
+ RCU_NONIDLE(bc_moved = (hrtimer_try_to_cancel(&bctimer) >= 0) ?
+ !hrtimer_start(&bctimer, expires, HRTIMER_MODE_ABS_PINNED) :
+ 0);
+ if (bc_moved) {
/* Bind the "device" to the cpu */
bc->bound_on = smp_processor_id();
} else if (bc->bound_on == smp_processor_id()) {
Thanks
Regards
Preeti U Murthy
next prev parent reply other threads:[~2015-02-13 7:23 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-13 0:57 suspicious RCU usage clockevents_lock, tick_broadcast_lock, hrtimer_bases.lock Sam Bobroff
2015-02-13 5:27 ` Preeti U Murthy
2015-02-13 7:22 ` Preeti U Murthy [this message]
2015-02-13 14:26 ` Paul E. McKenney
2015-02-16 3:19 ` Preeti U Murthy
2015-02-16 5:50 ` Paul E. McKenney
2015-02-16 6:06 ` Preeti U Murthy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54DDA645.6080600@linux.vnet.ibm.com \
--to=preeti@linux.vnet.ibm.com \
--cc=linuxppc-dev@ozlabs.org \
--cc=mpe@ellerman.id.au \
--cc=paulmck@linux.vnet.ibm.com \
--cc=sam.bobroff@au1.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).