Merge branches 'doc.2015.02.26a', 'earlycb.2015.03.03a', 'fixes.2015.03.03a', 'gpexp...
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Fri, 20 Mar 2015 15:31:01 +0000 (08:31 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Fri, 20 Mar 2015 15:31:01 +0000 (08:31 -0700)
doc.2015.02.26a:  Documentation changes
earlycb.2015.03.03a:  Permit early-boot RCU callbacks
fixes.2015.03.03a:  Miscellaneous fixes
gpexp.2015.02.26a:  In-kernel expediting of normal grace periods
hotplug.2015.03.20a:  CPU hotplug fixes
sysidle.2015.02.26b:  NO_HZ_FULL_SYSIDLE fixes
tiny.2015.02.26a:  TINY_RCU fixes

1  2  3  4  5  6  7 
Documentation/kernel-parameters.txt
include/linux/rcupdate.h
kernel/rcu/srcu.c
kernel/rcu/tree.c
kernel/rcu/tree_plugin.h
kernel/rcu/update.c
lib/Kconfig.debug

Simple merge
Simple merge
Simple merge
index 48d640ca1a05b8c0f83fe2b217b925a6dec69fa4,c8e6569c5fbdc8e58643abf37a631e7b5530c843,23194a77a7685683b700ad74cb326ec23a33089e,4325fbe79d84af57fa3c53710bcf3a861142a47a,8fcc64ed858c1e7548d3b3ddc759ac5f1a9f3c91,a6972c20eaa51612ff7bfc13106af21c7f732b79,48d640ca1a05b8c0f83fe2b217b925a6dec69fa4..233165da782f51deb88c6373116d9d28a4fec38b
@@@@@@@@ -101,11 -103,10 -101,11 -101,11 -101,10 -101,11 -101,11 +103,9 @@@@@@@@ struct rcu_state sname##_state = { 
        .orphan_nxttail = &sname##_state.orphan_nxtlist, \
        .orphan_donetail = &sname##_state.orphan_donelist, \
        .barrier_mutex = __MUTEX_INITIALIZER(sname##_state.barrier_mutex), \
---- -- .onoff_mutex = __MUTEX_INITIALIZER(sname##_state.onoff_mutex), \
        .name = RCU_STATE_NAME(sname), \
        .abbr = sabbr, \
- -----}; \
- -----DEFINE_PER_CPU_SHARED_ALIGNED(struct rcu_data, sname##_data)
+ +++++}
       
       RCU_STATE_INITIALIZER(rcu_sched, 's', call_rcu_sched);
       RCU_STATE_INITIALIZER(rcu_bh, 'b', call_rcu_bh);
@@@@@@@@ -3734,30 -3757,30 -3734,26 -3735,30 -3900,30 -3734,30 -3734,30 +3924,26 @@@@@@@@ void rcu_scheduler_starting(void
        * Compute the per-level fanout, either using the exact fanout specified
        * or balancing the tree, depending on CONFIG_RCU_FANOUT_EXACT.
        */
-- ----#ifdef CONFIG_RCU_FANOUT_EXACT
-- - --static void __init rcu_init_levelspread(struct rcu_state *rsp)
-- - --{
-- - -- int i;
-- - --
-- - -- rsp->levelspread[rcu_num_lvls - 1] = rcu_fanout_leaf;
-- - -- for (i = rcu_num_lvls - 2; i >= 0; i--)
-- - --         rsp->levelspread[i] = CONFIG_RCU_FANOUT;
-- - --}
-- - --#else /* #ifdef CONFIG_RCU_FANOUT_EXACT */
       static void __init rcu_init_levelspread(struct rcu_state *rsp)
       {
-- - -- int ccur;
-- - -- int cprv;
        int i;
       
    -   rsp->levelspread[rcu_num_lvls - 1] = rcu_fanout_leaf;
    -   for (i = rcu_num_lvls - 2; i >= 0; i--)
    -           rsp->levelspread[i] = CONFIG_RCU_FANOUT;
    -  }
    -  #else /* #ifdef CONFIG_RCU_FANOUT_EXACT */
    -  static void __init rcu_init_levelspread(struct rcu_state *rsp)
    -  {
    -   int ccur;
    -   int cprv;
    -   int i;
    -  
-- ---- cprv = nr_cpu_ids;
-- ---- for (i = rcu_num_lvls - 1; i >= 0; i--) {
-- ----         ccur = rsp->levelcnt[i];
-- ----         rsp->levelspread[i] = (cprv + ccur - 1) / ccur;
-- ----         cprv = ccur;
++ ++++ if (IS_ENABLED(CONFIG_RCU_FANOUT_EXACT)) {
++ ++++         rsp->levelspread[rcu_num_lvls - 1] = rcu_fanout_leaf;
++ ++++         for (i = rcu_num_lvls - 2; i >= 0; i--)
++ ++++                 rsp->levelspread[i] = CONFIG_RCU_FANOUT;
++ ++++ } else {
++ ++++         int ccur;
++ ++++         int cprv;
++ ++++
++ ++++         cprv = nr_cpu_ids;
++ ++++         for (i = rcu_num_lvls - 1; i >= 0; i--) {
++ ++++                 ccur = rsp->levelcnt[i];
++ ++++                 rsp->levelspread[i] = (cprv + ccur - 1) / ccur;
++ ++++                 cprv = ccur;
++ ++++         }
        }
       }
-- ----#endif /* #else #ifdef CONFIG_RCU_FANOUT_EXACT */
       
       /*
        * Helper function for rcu_init() that initializes one rcu_state structure.
index 0a571e9a0f1d00868c74c5032912c1a0b24dce94,afddd5641bea7212e24fdd206b161ed04f56c2df,c9225350d3ed5cde946224dac7800f6d29d2ed37,63726b734d343ce63272e5d8f105fe03bb6f55ee,d45e961515c13a545f61fc5cf0fc26aad84cc701,b46c92824db1d705c59c429af9a494b5baada1b5,0a571e9a0f1d00868c74c5032912c1a0b24dce94..8c0ec0f5a02702f1a3c5ed5db0bdf346ac7ae140
@@@@@@@@ -757,19 -757,19 -758,19 -757,19 -759,16 -757,19 -757,19 +760,16 @@@@@@@@ void synchronize_rcu_expedited(void
        /* force all RCU readers onto ->blkd_tasks lists. */
        synchronize_sched_expedited();
       
---- -- /* Initialize ->expmask for all non-leaf rcu_node structures. */
---- -- rcu_for_each_nonleaf_node_breadth_first(rsp, rnp) {
---- --         raw_spin_lock_irqsave(&rnp->lock, flags);
---- --         smp_mb__after_unlock_lock();
---- --         rnp->expmask = rnp->qsmaskinit;
---- --         raw_spin_unlock_irqrestore(&rnp->lock, flags);
---- -- }
---- --
---- -- /* Snapshot current state of ->blkd_tasks lists. */
++++ ++ /*
++++ ++  * Snapshot current state of ->blkd_tasks lists into ->expmask.
++++ ++  * Phase 1 sets bits and phase 2 permits rcu_read_unlock_special()
++++ ++  * to start clearing them.  Doing this in one phase leads to
++++ ++  * strange races between setting and clearing bits, so just say "no"!
++++ ++  */
++ + ++ rcu_for_each_leaf_node(rsp, rnp)
  -             sync_rcu_preempt_exp_init(rsp, rnp);
  -     if (NUM_RCU_NODES > 1)
  -             sync_rcu_preempt_exp_init(rsp, rcu_get_root(rsp));
++++ ++         sync_rcu_preempt_exp_init1(rsp, rnp);
  +     rcu_for_each_leaf_node(rsp, rnp)
-- - --         sync_rcu_preempt_exp_init(rsp, rnp);
-- - -- if (NUM_RCU_NODES > 1)
-- - --         sync_rcu_preempt_exp_init(rsp, rcu_get_root(rsp));
++++ ++         sync_rcu_preempt_exp_init2(rsp, rnp);
       
        put_online_cpus();
       
Simple merge
Simple merge