From: Peter Zijlstra <peterz@infradead.org>
To: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: linux-kernel@vger.kernel.org, mingo@redhat.com, fweisbec@gmail.com
Subject: Re: [PATCH] clock: Fix smp_processor_id() in preemptible bug
Date: Mon, 13 Mar 2017 13:46:21 +0100 [thread overview]
Message-ID: <20170313124621.GA3328@twins.programming.kicks-ass.net> (raw)
In-Reply-To: <20170309183732.GB13748@linux.vnet.ibm.com>
On Thu, Mar 09, 2017 at 10:37:32AM -0800, Paul E. McKenney wrote:
> And it does pass light testing. I will hammer it harder this evening.
>
> So please send a formal patch!
Changed it a bit...
---
Subject: sched/clock: Some clear_sched_clock_stable() vs hotplug wobbles
Paul reported two independent problems with clear_sched_clock_stable().
- if we tickle it during hotplug (even though the sched_clock was
already marked unstable) we'll attempt to schedule_work() and
this explodes because RCU isn't watching the new CPU quite yet.
- since we run all of __clear_sched_clock_stable() from workqueue
context, there's a preempt problem.
Cure both by only doing the static_branch_disable() from a workqueue,
and only when it's still stable.
This leaves the problem what to do about hotplug actually wrecking TSC
though, because if it was stable and now isn't, then we will want to run
that work, which then will prod RCU the wrong way. Bloody hotplug.
Reported-by: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
kernel/sched/clock.c | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/kernel/sched/clock.c b/kernel/sched/clock.c
index a08795e21628..fec0f58c8dee 100644
--- a/kernel/sched/clock.c
+++ b/kernel/sched/clock.c
@@ -141,7 +141,14 @@ static void __set_sched_clock_stable(void)
tick_dep_clear(TICK_DEP_BIT_CLOCK_UNSTABLE);
}
-static void __clear_sched_clock_stable(struct work_struct *work)
+static void __sched_clock_work(struct work_struct *work)
+{
+ static_branch_disable(&__sched_clock_stable);
+}
+
+static DECLARE_WORK(sched_clock_work, __sched_clock_work);
+
+static void __clear_sched_clock_stable(void)
{
struct sched_clock_data *scd = this_scd();
@@ -160,11 +167,11 @@ static void __clear_sched_clock_stable(struct work_struct *work)
scd->tick_gtod, gtod_offset,
scd->tick_raw, raw_offset);
- static_branch_disable(&__sched_clock_stable);
tick_dep_set(TICK_DEP_BIT_CLOCK_UNSTABLE);
-}
-static DECLARE_WORK(sched_clock_work, __clear_sched_clock_stable);
+ if (sched_clock_stable())
+ schedule_work(&sched_clock_work);
+}
void clear_sched_clock_stable(void)
{
@@ -173,7 +180,7 @@ void clear_sched_clock_stable(void)
smp_mb(); /* matches sched_clock_init_late() */
if (sched_clock_running == 2)
- schedule_work(&sched_clock_work);
+ __clear_sched_clock_stable();
}
void sched_clock_init_late(void)
next prev parent reply other threads:[~2017-03-13 12:46 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-08 21:53 [PATCH] clock: Fix smp_processor_id() in preemptible bug Paul E. McKenney
2017-03-09 15:24 ` Peter Zijlstra
2017-03-09 15:31 ` Paul E. McKenney
2017-03-09 18:37 ` Paul E. McKenney
2017-03-10 17:27 ` Paul E. McKenney
2017-03-13 12:46 ` Peter Zijlstra [this message]
2017-03-13 15:55 ` Paul E. McKenney
2017-03-14 16:24 ` Paul E. McKenney
2017-03-15 22:58 ` Paul E. McKenney
2017-03-16 15:53 ` Peter Zijlstra
2017-03-16 16:57 ` Paul E. McKenney
2017-03-16 21:00 ` Paul E. McKenney
2017-03-16 21:06 ` Paul E. McKenney
2017-03-23 9:10 ` [tip:sched/urgent] sched/clock: Fix clear_sched_clock_stable() preempt wobbly tip-bot for Peter Zijlstra
2017-03-23 16:52 ` Paul E. McKenney
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=20170313124621.GA3328@twins.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=fweisbec@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=paulmck@linux.vnet.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