Re: [GIT PULL rcu/next] RCU commits for 4.6

From: Ingo Molnar
Date: Tue Mar 08 2016 - 03:53:58 EST



* Paul E. McKenney <paulmck@xxxxxxxxxxxxxxxxxx> wrote:

> Hello, Ingo,
>
> Note that this series conflicts with some commits in Thomas Gleixner's
> hotplug series and in Daniel Wagner's swait series, both of which are in
> -tip. I have suggested conflict-resolution commits for Daniel's commits
> (25f0d48a4299 "Merge commit 'abedf8e2419fb873d919dd74de2e84b510259339'
> into wagi.2016.03.01a") and for Thomas's commits (dc96aeda643f "Merge
> commit '27d50c7eeb0f' into wagi.2016.03.01a"), which you might find
> useful. These merge commits pass rcutorture testing, 0day robot testing,
> and -next testing.
>
> The changes in this series include:
>
> 1. Documentation updates, including RCU data structure design-level
> documentation.
>
> https://lkml.org/lkml/2016/2/24/26
>
> 2. Miscellaneous fixes.
>
> https://lkml.org/lkml/2016/2/24/34
>
> 3. Torture-test updates.
>
> https://lkml.org/lkml/2016/2/24/50
>
> As noted earlier, all of these changes have been subjected to 0day Test
> robot and -next testing, and are available in the git repository at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git for-mingo
>
> for you to fetch changes up to 2863b4e3dd92a9d697dd66b219710e478e0a4531:
>
> Merge branches 'doc.2015.02.23a', 'fixes.2015.02.23a' and 'torture.2015.02.23a' into HEAD (2016-02-23 20:05:19 -0800)
>
> ----------------------------------------------------------------
> Boqun Feng (3):
> sparse: Add __private to privatize members of structs
> RCU: Privatize rcu_node::lock
> irq: Privatize irq_common_data::state_use_accessors
>
> Chen Gang (1):
> rcu: Remove useless rcu_data_p when !PREEMPT_RCU
>
> Paul E. McKenney (25):
> rcutorture: Add checks for rcutorture writer starvation
> rcutorture: Don't keep empty console.log.diags files
> rcutorture: Check for self-detected stalls
> documentation: Add real-time requirements from CPU-bound workloads
> documentation: Fix control dependency and identical stores
> documentation: Fix memory-barriers.txt section references
> documentation: Add synchronize_rcu_mult() to the requirements
> documentation: Remove obsolete reference to RCU-protected indexes
> documentation: Subsequent writes ordered by rcu_dereference()
> documentation: Distinguish between local and global transitivity
> documentation: Add alternative release-acquire outcome
> documentation: Add documentation for RCU's major data structures
> documentation: Explain why rcu_read_lock() needs no barrier()
> documentation: Transitivity is not cumulativity
> documentation: Document illegality of call_rcu() from offline CPUs
> documentation: Explain how RCU's combining tree fights contention
> rcu: Assign false instead of 0 for ->core_needs_qs
> rcu: Update rcu_report_qs_rsp() comment
> rcu: Stop treating in-kernel CPU-bound workloads as errors
> rcu: Set rdp->gpwrap when CPU is idle
> rcutorture: Correct no-expedite console messages
> rcu: Document unique-name limitation for DEFINE_STATIC_SRCU()
> rcu: Catch up rcu_report_qs_rdp() comment with reality
> rcu: Export rcu_gp_is_normal()
> Merge branches 'doc.2015.02.23a', 'fixes.2015.02.23a' and 'torture.2015.02.23a' into HEAD
>
> Paul Gortmaker (1):
> rcu: Make rcu/tiny_plugin.h explicitly non-modular
>
> SeongJae Park (1):
> documentation: Clarify compiler store-fusion example
>
> Yang Shi (1):
> rcu: Remove rcu_user_hooks_switch
>
> .../Design/Data-Structures/BigTreeClassicRCU.svg | 474 +++++++
> .../Design/Data-Structures/BigTreeClassicRCUBH.svg | 499 +++++++
> .../Data-Structures/BigTreeClassicRCUBHdyntick.svg | 695 ++++++++++
> .../Data-Structures/BigTreePreemptRCUBHdyntick.svg | 741 +++++++++++
> .../BigTreePreemptRCUBHdyntickCB.svg | 858 ++++++++++++
> .../Design/Data-Structures/Data-Structures.html | 1395 ++++++++++++++++++++
> .../Design/Data-Structures/Data-Structures.htmlx | 1295 ++++++++++++++++++
> .../Design/Data-Structures/HugeTreeClassicRCU.svg | 939 +++++++++++++
> .../RCU/Design/Data-Structures/TreeLevel.svg | 828 ++++++++++++
> .../RCU/Design/Data-Structures/TreeMapping.svg | 305 +++++
> .../Design/Data-Structures/TreeMappingLevel.svg | 380 ++++++
> .../RCU/Design/Data-Structures/blkd_task.svg | 843 ++++++++++++
> .../RCU/Design/Data-Structures/nxtlist.svg | 396 ++++++
> .../RCU/Design/Requirements/Requirements.html | 225 +++-
> .../RCU/Design/Requirements/Requirements.htmlx | 121 +-
> Documentation/memory-barriers.txt | 141 +-
> include/linux/compiler.h | 12 +-
> include/linux/irq.h | 6 +-
> include/linux/rcupdate.h | 2 -
> include/linux/srcu.h | 19 +-
> kernel/irq/internals.h | 4 +
> kernel/rcu/rcutorture.c | 14 +-
> kernel/rcu/tiny_plugin.h | 15 +-
> kernel/rcu/tree.c | 143 +-
> kernel/rcu/tree.h | 42 +-
> kernel/rcu/tree_plugin.h | 27 +-
> kernel/rcu/update.c | 1 +
> scripts/checkpatch.pl | 3 +-
> .../selftests/rcutorture/bin/parse-console.sh | 6 +-
> 29 files changed, 10233 insertions(+), 196 deletions(-)
> create mode 100644 Documentation/RCU/Design/Data-Structures/BigTreeClassicRCU.svg
> create mode 100644 Documentation/RCU/Design/Data-Structures/BigTreeClassicRCUBH.svg
> create mode 100644 Documentation/RCU/Design/Data-Structures/BigTreeClassicRCUBHdyntick.svg
> create mode 100644 Documentation/RCU/Design/Data-Structures/BigTreePreemptRCUBHdyntick.svg
> create mode 100644 Documentation/RCU/Design/Data-Structures/BigTreePreemptRCUBHdyntickCB.svg
> create mode 100644 Documentation/RCU/Design/Data-Structures/Data-Structures.html
> create mode 100644 Documentation/RCU/Design/Data-Structures/Data-Structures.htmlx
> create mode 100644 Documentation/RCU/Design/Data-Structures/HugeTreeClassicRCU.svg
> create mode 100644 Documentation/RCU/Design/Data-Structures/TreeLevel.svg
> create mode 100644 Documentation/RCU/Design/Data-Structures/TreeMapping.svg
> create mode 100644 Documentation/RCU/Design/Data-Structures/TreeMappingLevel.svg
> create mode 100644 Documentation/RCU/Design/Data-Structures/blkd_task.svg
> create mode 100644 Documentation/RCU/Design/Data-Structures/nxtlist.svg

Pulled, thanks a lot Paul!

So I've done the conflict resolutions with tmp:smp/hotplug and tip:sched/core
myself, and came up with a mostly identical resolution, except this difference
with your resolution in wagi.2016.03.01a:

--- linux-next/kernel/rcu/tree.c
+++ tip/kernel/rcu/tree.c
@@ -2046,8 +2046,8 @@ static void rcu_gp_cleanup(struct rcu_st
/* smp_mb() provided by prior unlock-lock pair. */
nocb += rcu_future_gp_cleanup(rsp, rnp);
sq = rcu_nocb_gp_get(rnp);
- raw_spin_unlock_irq_rcu_node(rnp);
rcu_nocb_gp_cleanup(sq);
+ raw_spin_unlock_irq_rcu_node(rnp);
cond_resched_rcu_qs();
WRITE_ONCE(rsp->gp_activity, jiffies);
rcu_gp_slow(rsp, gp_cleanup_delay);

but your resolution is better, rcu_nocb_gp_cleanup() can (and should) be done
outside of the rcu_node lock.

So we have the same resolution now, which is good! ;-)

Thanks,

Ingo