Merge branch 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull RCU fix from Ingo Molnar:
"A boot hang fix for the offloaded callback RCU model (RCU_NOCB_CPU=y
&& (TREE_CPU=y || TREE_PREEMPT_RC)) in certain bootup scenarios"

* 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
rcu: Make nocb leader kthreads process pending callbacks after spawning

Changed files
+12 -12
kernel
+1 -1
kernel/rcu/tree.h
··· 358 358 struct rcu_head **nocb_gp_tail; 359 359 long nocb_gp_count; 360 360 long nocb_gp_count_lazy; 361 - bool nocb_leader_wake; /* Is the nocb leader thread awake? */ 361 + bool nocb_leader_sleep; /* Is the nocb leader thread asleep? */ 362 362 struct rcu_data *nocb_next_follower; 363 363 /* Next follower in wakeup chain. */ 364 364
+11 -11
kernel/rcu/tree_plugin.h
··· 2074 2074 2075 2075 if (!ACCESS_ONCE(rdp_leader->nocb_kthread)) 2076 2076 return; 2077 - if (!ACCESS_ONCE(rdp_leader->nocb_leader_wake) || force) { 2077 + if (ACCESS_ONCE(rdp_leader->nocb_leader_sleep) || force) { 2078 2078 /* Prior xchg orders against prior callback enqueue. */ 2079 - ACCESS_ONCE(rdp_leader->nocb_leader_wake) = true; 2079 + ACCESS_ONCE(rdp_leader->nocb_leader_sleep) = false; 2080 2080 wake_up(&rdp_leader->nocb_wq); 2081 2081 } 2082 2082 } ··· 2253 2253 if (!rcu_nocb_poll) { 2254 2254 trace_rcu_nocb_wake(my_rdp->rsp->name, my_rdp->cpu, "Sleep"); 2255 2255 wait_event_interruptible(my_rdp->nocb_wq, 2256 - ACCESS_ONCE(my_rdp->nocb_leader_wake)); 2256 + !ACCESS_ONCE(my_rdp->nocb_leader_sleep)); 2257 2257 /* Memory barrier handled by smp_mb() calls below and repoll. */ 2258 2258 } else if (firsttime) { 2259 2259 firsttime = false; /* Don't drown trace log with "Poll"! */ ··· 2292 2292 schedule_timeout_interruptible(1); 2293 2293 2294 2294 /* Rescan in case we were a victim of memory ordering. */ 2295 - my_rdp->nocb_leader_wake = false; 2296 - smp_mb(); /* Ensure _wake false before scan. */ 2295 + my_rdp->nocb_leader_sleep = true; 2296 + smp_mb(); /* Ensure _sleep true before scan. */ 2297 2297 for (rdp = my_rdp; rdp; rdp = rdp->nocb_next_follower) 2298 2298 if (ACCESS_ONCE(rdp->nocb_head)) { 2299 2299 /* Found CB, so short-circuit next wait. */ 2300 - my_rdp->nocb_leader_wake = true; 2300 + my_rdp->nocb_leader_sleep = false; 2301 2301 break; 2302 2302 } 2303 2303 goto wait_again; ··· 2307 2307 rcu_nocb_wait_gp(my_rdp); 2308 2308 2309 2309 /* 2310 - * We left ->nocb_leader_wake set to reduce cache thrashing. 2311 - * We clear it now, but recheck for new callbacks while 2310 + * We left ->nocb_leader_sleep unset to reduce cache thrashing. 2311 + * We set it now, but recheck for new callbacks while 2312 2312 * traversing our follower list. 2313 2313 */ 2314 - my_rdp->nocb_leader_wake = false; 2315 - smp_mb(); /* Ensure _wake false before scan of ->nocb_head. */ 2314 + my_rdp->nocb_leader_sleep = true; 2315 + smp_mb(); /* Ensure _sleep true before scan of ->nocb_head. */ 2316 2316 2317 2317 /* Each pass through the following loop wakes a follower, if needed. */ 2318 2318 for (rdp = my_rdp; rdp; rdp = rdp->nocb_next_follower) { 2319 2319 if (ACCESS_ONCE(rdp->nocb_head)) 2320 - my_rdp->nocb_leader_wake = true; /* No need to wait. */ 2320 + my_rdp->nocb_leader_sleep = false;/* No need to sleep.*/ 2321 2321 if (!rdp->nocb_gp_head) 2322 2322 continue; /* No CBs, so no need to wake follower. */ 2323 2323