From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-kernel@vger.kernel.org, mingo@kernel.org,
jiangshanlai@gmail.com, dipankar@in.ibm.com,
akpm@linux-foundation.org, mathieu.desnoyers@efficios.com,
josh@joshtriplett.org, tglx@linutronix.de, rostedt@goodmis.org,
dhowells@redhat.com, edumazet@google.com, fweisbec@gmail.com,
oleg@redhat.com, joel@joelfernandes.org
Subject: Re: [PATCH tip/core/rcu 13/22] rcu: Fix grace-period hangs due to race with CPU offline
Date: Tue, 26 Jun 2018 11:29:50 -0700 [thread overview]
Message-ID: <20180626182950.GH3593@linux.vnet.ibm.com> (raw)
In-Reply-To: <20180626175119.GL2494@hirez.programming.kicks-ass.net>
On Tue, Jun 26, 2018 at 07:51:19PM +0200, Peter Zijlstra wrote:
> On Tue, Jun 26, 2018 at 10:10:39AM -0700, Paul E. McKenney wrote:
> > Without special fail-safe quiescent-state-propagation checks, grace-period
> > hangs can result from the following scenario:
> >
> > 1. CPU 1 goes offline.
> >
> > 2. Because CPU 1 is the only CPU in the system blocking the current
> > grace period, as soon as rcu_cleanup_dying_idle_cpu()'s call to
> > rcu_report_qs_rnp() returns.
> >
> > 3. At this point, the leaf rcu_node structure's ->lock is no longer
> > held: rcu_report_qs_rnp() has released it, as it must in order
> > to awaken the RCU grace-period kthread.
> >
> > 4. At this point, that same leaf rcu_node structure's ->qsmaskinitnext
> > field still records CPU 1 as being online. This is absolutely
> > necessary because the scheduler uses RCU, and ->qsmaskinitnext
>
> Can you expand a bit on this, where does the scheduler care about the
> online state of the CPU that's about to call into arch_cpu_idle_dead()?
Because the CPU does a context switch between the time that the CPU gets
marked offline from the viewpoint of cpu_offline() and the time that
the CPU finally makes it to arch_cpu_idle_dead(). Plus reporting the
quiescent state (rcu_report_qs_rnp()) can result in waking up RCU's
grace-period kthread. During that context switch and that wakeup,
the scheduler needs RCU to continue paying attention to the outgoing
CPU, right?
> > contains RCU's idea as to which CPUs are online. Therefore,
> > invoking rcu_report_qs_rnp() after clearing CPU 1's bit from
> > ->qsmaskinitnext would result in a lockdep-RCU splat due to
> > RCU being used from an offline CPU.
> >
> > 5. RCU's grace-period kthread awakens, sees that the old grace period
> > has completed and that a new one is needed. It therefore starts
> > a new grace period, but because CPU 1's leaf rcu_node structure's
> > ->qsmaskinitnext field still shows CPU 1 as being online, this new
> > grace period is initialized to wait for a quiescent state from the
> > now-offline CPU 1.
>
> If we're past cpuhp_report_idle_cpu() -> rcu_report_dead(), then
> cpu_offline() is true. Is that not sufficient state to avoid this?
Not from what I can see. To avoid this, I need to synchronize
with rcu_gp_init(), but I cannot rely on the usual rcu_node ->lock
synchronization without severely complicating quiescent-state reporting.
For one thing, quiescent-state reporting can require waking up the
grace-period kthread, which cannot be done while holding any rcu_node
->lock due to deadlock. I -could- defer the wakeup (as is done in
several other places), but adding the separate lock is much simpler,
and given that both grace-period initialization and CPU hotplug are
relatively rare operations, the extra overhead is way down in the noise.
Or am I missing a trick here?
Thanx, Paul
> > 6. Without the fail-safe force-quiescent-state checks, there would
> > be no quiescent state from the now-offline CPU 1, which would
> > eventually result in RCU CPU stall warnings and memory exhaustion.
>
next prev parent reply other threads:[~2018-06-26 18:27 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-26 0:20 [PATCH tip/core/rcu 0/22] Grace-period fixes for v4.19 Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 01/22] rcu: Clean up handling of tasks blocked across full-rcu_node offline Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 02/22] rcu: Fix an obsolete ->qsmaskinit comment Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 03/22] rcu: Make rcu_init_new_rnp() stop upon already-set bit Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 04/22] rcu: Make rcu_report_unblock_qs_rnp() warn on violated preconditions Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 05/22] rcu: Fix typo and add additional debug Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 06/22] rcu: Replace smp_wmb() with smp_store_release() for stall check Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 07/22] rcu: Prevent useless FQS scan after all CPUs have checked in Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 08/22] rcu: Suppress false-positive offline-CPU lockdep-RCU splat Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 09/22] rcu: Suppress false-positive preempted-task splats Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 10/22] rcu: Suppress more involved " Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 11/22] rcu: Suppress false-positive splats from mid-init task resume Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 12/22] rcu: Fix grace-period hangs " Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 13/22] rcu: Fix grace-period hangs due to race with CPU offline Paul E. McKenney
2018-06-26 17:44 ` Peter Zijlstra
2018-06-26 18:19 ` Paul E. McKenney
2018-06-26 19:48 ` Peter Zijlstra
2018-06-26 20:40 ` Paul E. McKenney
2018-06-26 17:51 ` Peter Zijlstra
2018-06-26 18:29 ` Paul E. McKenney [this message]
2018-06-26 20:07 ` Peter Zijlstra
2018-06-26 20:26 ` Paul E. McKenney
2018-06-26 20:32 ` Peter Zijlstra
2018-06-26 23:40 ` Paul E. McKenney
2018-06-27 8:33 ` Peter Zijlstra
2018-06-27 15:43 ` Paul E. McKenney
2018-06-27 9:11 ` Peter Zijlstra
2018-06-27 9:46 ` Peter Zijlstra
2018-06-27 15:57 ` Paul E. McKenney
2018-06-27 17:51 ` Peter Zijlstra
2018-06-28 5:13 ` Paul E. McKenney
2018-06-28 8:26 ` Peter Zijlstra
2018-06-28 12:38 ` Paul E. McKenney
2018-06-28 13:06 ` Peter Zijlstra
2018-06-29 4:30 ` Paul E. McKenney
2018-06-27 15:53 ` Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 14/22] rcu: Add RCU-preempt check for waiting on newly onlined CPU Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 15/22] rcu: Move grace-period pre-init delay after pre-init Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 16/22] rcu: Remove failsafe check for lost quiescent state Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 17/22] rcutorture: Change units of onoff_interval to jiffies Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 18/22] rcu: Remove CPU-hotplug failsafe from force-quiescent-state code path Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 19/22] rcu: Add up-tree information to dump_blkd_tasks() diagnostics Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 20/22] rcu: Add CPU online/offline state to dump_blkd_tasks() Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 21/22] rcu: Record ->gp_state for both phases of grace-period initialization Paul E. McKenney
2018-06-26 17:10 ` [PATCH tip/core/rcu 22/22] rcu: Add diagnostics for offline CPUs failing to report QS 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=20180626182950.GH3593@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=edumazet@google.com \
--cc=fweisbec@gmail.com \
--cc=jiangshanlai@gmail.com \
--cc=joel@joelfernandes.org \
--cc=josh@joshtriplett.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.