xref: /openbmc/linux/kernel/rcu/tree.c (revision ec9f5835f74cba5cc2285d3032bb2b16afc312c3)
14102adabSPaul E. McKenney /*
24102adabSPaul E. McKenney  * Read-Copy Update mechanism for mutual exclusion
34102adabSPaul E. McKenney  *
44102adabSPaul E. McKenney  * This program is free software; you can redistribute it and/or modify
54102adabSPaul E. McKenney  * it under the terms of the GNU General Public License as published by
64102adabSPaul E. McKenney  * the Free Software Foundation; either version 2 of the License, or
74102adabSPaul E. McKenney  * (at your option) any later version.
84102adabSPaul E. McKenney  *
94102adabSPaul E. McKenney  * This program is distributed in the hope that it will be useful,
104102adabSPaul E. McKenney  * but WITHOUT ANY WARRANTY; without even the implied warranty of
114102adabSPaul E. McKenney  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
124102adabSPaul E. McKenney  * GNU General Public License for more details.
134102adabSPaul E. McKenney  *
144102adabSPaul E. McKenney  * You should have received a copy of the GNU General Public License
1587de1cfdSPaul E. McKenney  * along with this program; if not, you can access it online at
1687de1cfdSPaul E. McKenney  * http://www.gnu.org/licenses/gpl-2.0.html.
174102adabSPaul E. McKenney  *
184102adabSPaul E. McKenney  * Copyright IBM Corporation, 2008
194102adabSPaul E. McKenney  *
204102adabSPaul E. McKenney  * Authors: Dipankar Sarma <dipankar@in.ibm.com>
214102adabSPaul E. McKenney  *	    Manfred Spraul <manfred@colorfullife.com>
224102adabSPaul E. McKenney  *	    Paul E. McKenney <paulmck@linux.vnet.ibm.com> Hierarchical version
234102adabSPaul E. McKenney  *
244102adabSPaul E. McKenney  * Based on the original work by Paul McKenney <paulmck@us.ibm.com>
254102adabSPaul E. McKenney  * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen.
264102adabSPaul E. McKenney  *
274102adabSPaul E. McKenney  * For detailed explanation of Read-Copy Update mechanism see -
284102adabSPaul E. McKenney  *	Documentation/RCU
294102adabSPaul E. McKenney  */
30a7538352SJoe Perches 
31a7538352SJoe Perches #define pr_fmt(fmt) "rcu: " fmt
32a7538352SJoe Perches 
334102adabSPaul E. McKenney #include <linux/types.h>
344102adabSPaul E. McKenney #include <linux/kernel.h>
354102adabSPaul E. McKenney #include <linux/init.h>
364102adabSPaul E. McKenney #include <linux/spinlock.h>
374102adabSPaul E. McKenney #include <linux/smp.h>
38f9411ebeSIngo Molnar #include <linux/rcupdate_wait.h>
394102adabSPaul E. McKenney #include <linux/interrupt.h>
404102adabSPaul E. McKenney #include <linux/sched.h>
41b17b0153SIngo Molnar #include <linux/sched/debug.h>
424102adabSPaul E. McKenney #include <linux/nmi.h>
434102adabSPaul E. McKenney #include <linux/atomic.h>
444102adabSPaul E. McKenney #include <linux/bitops.h>
454102adabSPaul E. McKenney #include <linux/export.h>
464102adabSPaul E. McKenney #include <linux/completion.h>
474102adabSPaul E. McKenney #include <linux/moduleparam.h>
484102adabSPaul E. McKenney #include <linux/percpu.h>
494102adabSPaul E. McKenney #include <linux/notifier.h>
504102adabSPaul E. McKenney #include <linux/cpu.h>
514102adabSPaul E. McKenney #include <linux/mutex.h>
524102adabSPaul E. McKenney #include <linux/time.h>
534102adabSPaul E. McKenney #include <linux/kernel_stat.h>
544102adabSPaul E. McKenney #include <linux/wait.h>
554102adabSPaul E. McKenney #include <linux/kthread.h>
56ae7e81c0SIngo Molnar #include <uapi/linux/sched/types.h>
574102adabSPaul E. McKenney #include <linux/prefetch.h>
584102adabSPaul E. McKenney #include <linux/delay.h>
594102adabSPaul E. McKenney #include <linux/stop_machine.h>
604102adabSPaul E. McKenney #include <linux/random.h>
61af658dcaSSteven Rostedt (Red Hat) #include <linux/trace_events.h>
624102adabSPaul E. McKenney #include <linux/suspend.h>
63a278d471SPaul E. McKenney #include <linux/ftrace.h>
644102adabSPaul E. McKenney 
654102adabSPaul E. McKenney #include "tree.h"
664102adabSPaul E. McKenney #include "rcu.h"
674102adabSPaul E. McKenney 
684102adabSPaul E. McKenney #ifdef MODULE_PARAM_PREFIX
694102adabSPaul E. McKenney #undef MODULE_PARAM_PREFIX
704102adabSPaul E. McKenney #endif
714102adabSPaul E. McKenney #define MODULE_PARAM_PREFIX "rcutree."
724102adabSPaul E. McKenney 
734102adabSPaul E. McKenney /* Data structures. */
744102adabSPaul E. McKenney 
75358be2d3SPaul E. McKenney static DEFINE_PER_CPU_SHARED_ALIGNED(struct rcu_data, rcu_data);
76358be2d3SPaul E. McKenney struct rcu_state rcu_state = {
77358be2d3SPaul E. McKenney 	.level = { &rcu_state.node[0] },
78358be2d3SPaul E. McKenney 	.gp_state = RCU_GP_IDLE,
79358be2d3SPaul E. McKenney 	.gp_seq = (0UL - 300UL) << RCU_SEQ_CTR_SHIFT,
80358be2d3SPaul E. McKenney 	.barrier_mutex = __MUTEX_INITIALIZER(rcu_state.barrier_mutex),
81358be2d3SPaul E. McKenney 	.name = RCU_NAME,
82358be2d3SPaul E. McKenney 	.abbr = RCU_ABBR,
83358be2d3SPaul E. McKenney 	.exp_mutex = __MUTEX_INITIALIZER(rcu_state.exp_mutex),
84358be2d3SPaul E. McKenney 	.exp_wake_mutex = __MUTEX_INITIALIZER(rcu_state.exp_wake_mutex),
85358be2d3SPaul E. McKenney 	.ofl_lock = __SPIN_LOCK_UNLOCKED(rcu_state.ofl_lock),
86358be2d3SPaul E. McKenney };
874102adabSPaul E. McKenney 
88a3dc2948SPaul E. McKenney /* Dump rcu_node combining tree at boot to verify correct setup. */
89a3dc2948SPaul E. McKenney static bool dump_tree;
90a3dc2948SPaul E. McKenney module_param(dump_tree, bool, 0444);
917fa27001SPaul E. McKenney /* Control rcu_node-tree auto-balancing at boot time. */
927fa27001SPaul E. McKenney static bool rcu_fanout_exact;
937fa27001SPaul E. McKenney module_param(rcu_fanout_exact, bool, 0444);
9447d631afSPaul E. McKenney /* Increase (but not decrease) the RCU_FANOUT_LEAF at boot time. */
9547d631afSPaul E. McKenney static int rcu_fanout_leaf = RCU_FANOUT_LEAF;
964102adabSPaul E. McKenney module_param(rcu_fanout_leaf, int, 0444);
974102adabSPaul E. McKenney int rcu_num_lvls __read_mostly = RCU_NUM_LVLS;
98cb007102SAlexander Gordeev /* Number of rcu_nodes at specified level. */
99e95d68d2SPaul E. McKenney int num_rcu_lvl[] = NUM_RCU_LVL_INIT;
1004102adabSPaul E. McKenney int rcu_num_nodes __read_mostly = NUM_RCU_NODES; /* Total # rcu_nodes in use. */
101088e9d25SDaniel Bristot de Oliveira /* panic() on RCU Stall sysctl. */
102088e9d25SDaniel Bristot de Oliveira int sysctl_panic_on_rcu_stall __read_mostly;
1034102adabSPaul E. McKenney 
1044102adabSPaul E. McKenney /*
10552d7e48bSPaul E. McKenney  * The rcu_scheduler_active variable is initialized to the value
10652d7e48bSPaul E. McKenney  * RCU_SCHEDULER_INACTIVE and transitions RCU_SCHEDULER_INIT just before the
10752d7e48bSPaul E. McKenney  * first task is spawned.  So when this variable is RCU_SCHEDULER_INACTIVE,
10852d7e48bSPaul E. McKenney  * RCU can assume that there is but one task, allowing RCU to (for example)
1090d95092cSPaul E. McKenney  * optimize synchronize_rcu() to a simple barrier().  When this variable
11052d7e48bSPaul E. McKenney  * is RCU_SCHEDULER_INIT, RCU must actually do all the hard work required
11152d7e48bSPaul E. McKenney  * to detect real grace periods.  This variable is also used to suppress
11252d7e48bSPaul E. McKenney  * boot-time false positives from lockdep-RCU error checking.  Finally, it
11352d7e48bSPaul E. McKenney  * transitions from RCU_SCHEDULER_INIT to RCU_SCHEDULER_RUNNING after RCU
11452d7e48bSPaul E. McKenney  * is fully initialized, including all of its kthreads having been spawned.
1154102adabSPaul E. McKenney  */
1164102adabSPaul E. McKenney int rcu_scheduler_active __read_mostly;
1174102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_scheduler_active);
1184102adabSPaul E. McKenney 
1194102adabSPaul E. McKenney /*
1204102adabSPaul E. McKenney  * The rcu_scheduler_fully_active variable transitions from zero to one
1214102adabSPaul E. McKenney  * during the early_initcall() processing, which is after the scheduler
1224102adabSPaul E. McKenney  * is capable of creating new tasks.  So RCU processing (for example,
1234102adabSPaul E. McKenney  * creating tasks for RCU priority boosting) must be delayed until after
1244102adabSPaul E. McKenney  * rcu_scheduler_fully_active transitions from zero to one.  We also
1254102adabSPaul E. McKenney  * currently delay invocation of any RCU callbacks until after this point.
1264102adabSPaul E. McKenney  *
1274102adabSPaul E. McKenney  * It might later prove better for people registering RCU callbacks during
1284102adabSPaul E. McKenney  * early boot to take responsibility for these callbacks, but one step at
1294102adabSPaul E. McKenney  * a time.
1304102adabSPaul E. McKenney  */
1314102adabSPaul E. McKenney static int rcu_scheduler_fully_active __read_mostly;
1324102adabSPaul E. McKenney 
133b50912d0SPaul E. McKenney static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp,
134b50912d0SPaul E. McKenney 			      unsigned long gps, unsigned long flags);
1350aa04b05SPaul E. McKenney static void rcu_init_new_rnp(struct rcu_node *rnp_leaf);
1360aa04b05SPaul E. McKenney static void rcu_cleanup_dead_rnp(struct rcu_node *rnp_leaf);
1374102adabSPaul E. McKenney static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, int outgoingcpu);
1384102adabSPaul E. McKenney static void invoke_rcu_core(void);
139aff4e9edSPaul E. McKenney static void invoke_rcu_callbacks(struct rcu_data *rdp);
14063d4c8c9SPaul E. McKenney static void rcu_report_exp_rdp(struct rcu_data *rdp);
1413549c2bcSPaul E. McKenney static void sync_sched_exp_online_cleanup(int cpu);
1424102adabSPaul E. McKenney 
143a94844b2SPaul E. McKenney /* rcuc/rcub kthread realtime priority */
14426730f55SPaul E. McKenney static int kthread_prio = IS_ENABLED(CONFIG_RCU_BOOST) ? 1 : 0;
145a94844b2SPaul E. McKenney module_param(kthread_prio, int, 0644);
146a94844b2SPaul E. McKenney 
1478d7dc928SPaul E. McKenney /* Delay in jiffies for grace-period initialization delays, debug only. */
1480f41c0ddSPaul E. McKenney 
14990040c9eSPaul E. McKenney static int gp_preinit_delay;
15090040c9eSPaul E. McKenney module_param(gp_preinit_delay, int, 0444);
15190040c9eSPaul E. McKenney static int gp_init_delay;
15290040c9eSPaul E. McKenney module_param(gp_init_delay, int, 0444);
15390040c9eSPaul E. McKenney static int gp_cleanup_delay;
15490040c9eSPaul E. McKenney module_param(gp_cleanup_delay, int, 0444);
1550f41c0ddSPaul E. McKenney 
1564cf439a2SPaul E. McKenney /* Retrieve RCU kthreads priority for rcutorture */
1574babd855SJoel Fernandes (Google) int rcu_get_gp_kthreads_prio(void)
1584babd855SJoel Fernandes (Google) {
1594babd855SJoel Fernandes (Google) 	return kthread_prio;
1604babd855SJoel Fernandes (Google) }
1614babd855SJoel Fernandes (Google) EXPORT_SYMBOL_GPL(rcu_get_gp_kthreads_prio);
1624babd855SJoel Fernandes (Google) 
163eab128e8SPaul E. McKenney /*
164eab128e8SPaul E. McKenney  * Number of grace periods between delays, normalized by the duration of
165bfd090beSPaul E. McKenney  * the delay.  The longer the delay, the more the grace periods between
166eab128e8SPaul E. McKenney  * each delay.  The reason for this normalization is that it means that,
167eab128e8SPaul E. McKenney  * for non-zero delays, the overall slowdown of grace periods is constant
168eab128e8SPaul E. McKenney  * regardless of the duration of the delay.  This arrangement balances
169eab128e8SPaul E. McKenney  * the need for long delays to increase some race probabilities with the
170eab128e8SPaul E. McKenney  * need for fast grace periods to increase other race probabilities.
171eab128e8SPaul E. McKenney  */
172eab128e8SPaul E. McKenney #define PER_RCU_NODE_PERIOD 3	/* Number of grace periods between delays. */
17337745d28SPaul E. McKenney 
1744102adabSPaul E. McKenney /*
1750aa04b05SPaul E. McKenney  * Compute the mask of online CPUs for the specified rcu_node structure.
1760aa04b05SPaul E. McKenney  * This will not be stable unless the rcu_node structure's ->lock is
1770aa04b05SPaul E. McKenney  * held, but the bit corresponding to the current CPU will be stable
1780aa04b05SPaul E. McKenney  * in most contexts.
1790aa04b05SPaul E. McKenney  */
1800aa04b05SPaul E. McKenney unsigned long rcu_rnp_online_cpus(struct rcu_node *rnp)
1810aa04b05SPaul E. McKenney {
1827d0ae808SPaul E. McKenney 	return READ_ONCE(rnp->qsmaskinitnext);
1830aa04b05SPaul E. McKenney }
1840aa04b05SPaul E. McKenney 
1850aa04b05SPaul E. McKenney /*
1867d0ae808SPaul E. McKenney  * Return true if an RCU grace period is in progress.  The READ_ONCE()s
1874102adabSPaul E. McKenney  * permit this function to be invoked without holding the root rcu_node
1884102adabSPaul E. McKenney  * structure's ->lock, but of course results can be subject to change.
1894102adabSPaul E. McKenney  */
190de8e8730SPaul E. McKenney static int rcu_gp_in_progress(void)
1914102adabSPaul E. McKenney {
192de8e8730SPaul E. McKenney 	return rcu_seq_state(rcu_seq_current(&rcu_state.gp_seq));
1934102adabSPaul E. McKenney }
1944102adabSPaul E. McKenney 
195d28139c4SPaul E. McKenney void rcu_softirq_qs(void)
196d28139c4SPaul E. McKenney {
19745975c7dSPaul E. McKenney 	rcu_qs();
198d28139c4SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
199d28139c4SPaul E. McKenney }
200d28139c4SPaul E. McKenney 
201b8c17e66SPaul E. McKenney /*
202b8c17e66SPaul E. McKenney  * Steal a bit from the bottom of ->dynticks for idle entry/exit
203b8c17e66SPaul E. McKenney  * control.  Initially this is for TLB flushing.
204b8c17e66SPaul E. McKenney  */
205b8c17e66SPaul E. McKenney #define RCU_DYNTICK_CTRL_MASK 0x1
206b8c17e66SPaul E. McKenney #define RCU_DYNTICK_CTRL_CTR  (RCU_DYNTICK_CTRL_MASK + 1)
207b8c17e66SPaul E. McKenney #ifndef rcu_eqs_special_exit
208b8c17e66SPaul E. McKenney #define rcu_eqs_special_exit() do { } while (0)
209b8c17e66SPaul E. McKenney #endif
2104a81e832SPaul E. McKenney 
2114a81e832SPaul E. McKenney static DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks) = {
21251a1fd30SPaul E. McKenney 	.dynticks_nesting = 1,
21358721f5dSPaul E. McKenney 	.dynticks_nmi_nesting = DYNTICK_IRQ_NONIDLE,
214b8c17e66SPaul E. McKenney 	.dynticks = ATOMIC_INIT(RCU_DYNTICK_CTRL_CTR),
2154a81e832SPaul E. McKenney };
2164a81e832SPaul E. McKenney 
2176563de9dSPaul E. McKenney /*
2182625d469SPaul E. McKenney  * Record entry into an extended quiescent state.  This is only to be
2192625d469SPaul E. McKenney  * called when not already in an extended quiescent state.
2202625d469SPaul E. McKenney  */
2212625d469SPaul E. McKenney static void rcu_dynticks_eqs_enter(void)
2222625d469SPaul E. McKenney {
2232625d469SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
224b8c17e66SPaul E. McKenney 	int seq;
2252625d469SPaul E. McKenney 
2262625d469SPaul E. McKenney 	/*
227b8c17e66SPaul E. McKenney 	 * CPUs seeing atomic_add_return() must see prior RCU read-side
2282625d469SPaul E. McKenney 	 * critical sections, and we also must force ordering with the
2292625d469SPaul E. McKenney 	 * next idle sojourn.
2302625d469SPaul E. McKenney 	 */
231b8c17e66SPaul E. McKenney 	seq = atomic_add_return(RCU_DYNTICK_CTRL_CTR, &rdtp->dynticks);
232b8c17e66SPaul E. McKenney 	/* Better be in an extended quiescent state! */
233b8c17e66SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
234b8c17e66SPaul E. McKenney 		     (seq & RCU_DYNTICK_CTRL_CTR));
235b8c17e66SPaul E. McKenney 	/* Better not have special action (TLB flush) pending! */
236b8c17e66SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
237b8c17e66SPaul E. McKenney 		     (seq & RCU_DYNTICK_CTRL_MASK));
2382625d469SPaul E. McKenney }
2392625d469SPaul E. McKenney 
2402625d469SPaul E. McKenney /*
2412625d469SPaul E. McKenney  * Record exit from an extended quiescent state.  This is only to be
2422625d469SPaul E. McKenney  * called from an extended quiescent state.
2432625d469SPaul E. McKenney  */
2442625d469SPaul E. McKenney static void rcu_dynticks_eqs_exit(void)
2452625d469SPaul E. McKenney {
2462625d469SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
247b8c17e66SPaul E. McKenney 	int seq;
2482625d469SPaul E. McKenney 
2492625d469SPaul E. McKenney 	/*
250b8c17e66SPaul E. McKenney 	 * CPUs seeing atomic_add_return() must see prior idle sojourns,
2512625d469SPaul E. McKenney 	 * and we also must force ordering with the next RCU read-side
2522625d469SPaul E. McKenney 	 * critical section.
2532625d469SPaul E. McKenney 	 */
254b8c17e66SPaul E. McKenney 	seq = atomic_add_return(RCU_DYNTICK_CTRL_CTR, &rdtp->dynticks);
255b8c17e66SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
256b8c17e66SPaul E. McKenney 		     !(seq & RCU_DYNTICK_CTRL_CTR));
257b8c17e66SPaul E. McKenney 	if (seq & RCU_DYNTICK_CTRL_MASK) {
258b8c17e66SPaul E. McKenney 		atomic_andnot(RCU_DYNTICK_CTRL_MASK, &rdtp->dynticks);
259b8c17e66SPaul E. McKenney 		smp_mb__after_atomic(); /* _exit after clearing mask. */
260b8c17e66SPaul E. McKenney 		/* Prefer duplicate flushes to losing a flush. */
261b8c17e66SPaul E. McKenney 		rcu_eqs_special_exit();
262b8c17e66SPaul E. McKenney 	}
2632625d469SPaul E. McKenney }
2642625d469SPaul E. McKenney 
2652625d469SPaul E. McKenney /*
2662625d469SPaul E. McKenney  * Reset the current CPU's ->dynticks counter to indicate that the
2672625d469SPaul E. McKenney  * newly onlined CPU is no longer in an extended quiescent state.
2682625d469SPaul E. McKenney  * This will either leave the counter unchanged, or increment it
2692625d469SPaul E. McKenney  * to the next non-quiescent value.
2702625d469SPaul E. McKenney  *
2712625d469SPaul E. McKenney  * The non-atomic test/increment sequence works because the upper bits
2722625d469SPaul E. McKenney  * of the ->dynticks counter are manipulated only by the corresponding CPU,
2732625d469SPaul E. McKenney  * or when the corresponding CPU is offline.
2742625d469SPaul E. McKenney  */
2752625d469SPaul E. McKenney static void rcu_dynticks_eqs_online(void)
2762625d469SPaul E. McKenney {
2772625d469SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
2782625d469SPaul E. McKenney 
279b8c17e66SPaul E. McKenney 	if (atomic_read(&rdtp->dynticks) & RCU_DYNTICK_CTRL_CTR)
2802625d469SPaul E. McKenney 		return;
281b8c17e66SPaul E. McKenney 	atomic_add(RCU_DYNTICK_CTRL_CTR, &rdtp->dynticks);
2822625d469SPaul E. McKenney }
2832625d469SPaul E. McKenney 
2842625d469SPaul E. McKenney /*
28502a5c550SPaul E. McKenney  * Is the current CPU in an extended quiescent state?
28602a5c550SPaul E. McKenney  *
28702a5c550SPaul E. McKenney  * No ordering, as we are sampling CPU-local information.
28802a5c550SPaul E. McKenney  */
28902a5c550SPaul E. McKenney bool rcu_dynticks_curr_cpu_in_eqs(void)
29002a5c550SPaul E. McKenney {
29102a5c550SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
29202a5c550SPaul E. McKenney 
293b8c17e66SPaul E. McKenney 	return !(atomic_read(&rdtp->dynticks) & RCU_DYNTICK_CTRL_CTR);
29402a5c550SPaul E. McKenney }
29502a5c550SPaul E. McKenney 
29602a5c550SPaul E. McKenney /*
2978b2f63abSPaul E. McKenney  * Snapshot the ->dynticks counter with full ordering so as to allow
2988b2f63abSPaul E. McKenney  * stable comparison of this counter with past and future snapshots.
2998b2f63abSPaul E. McKenney  */
30002a5c550SPaul E. McKenney int rcu_dynticks_snap(struct rcu_dynticks *rdtp)
3018b2f63abSPaul E. McKenney {
3028b2f63abSPaul E. McKenney 	int snap = atomic_add_return(0, &rdtp->dynticks);
3038b2f63abSPaul E. McKenney 
304b8c17e66SPaul E. McKenney 	return snap & ~RCU_DYNTICK_CTRL_MASK;
3058b2f63abSPaul E. McKenney }
3068b2f63abSPaul E. McKenney 
3078b2f63abSPaul E. McKenney /*
30802a5c550SPaul E. McKenney  * Return true if the snapshot returned from rcu_dynticks_snap()
30902a5c550SPaul E. McKenney  * indicates that RCU is in an extended quiescent state.
31002a5c550SPaul E. McKenney  */
31102a5c550SPaul E. McKenney static bool rcu_dynticks_in_eqs(int snap)
31202a5c550SPaul E. McKenney {
313b8c17e66SPaul E. McKenney 	return !(snap & RCU_DYNTICK_CTRL_CTR);
31402a5c550SPaul E. McKenney }
31502a5c550SPaul E. McKenney 
31602a5c550SPaul E. McKenney /*
31702a5c550SPaul E. McKenney  * Return true if the CPU corresponding to the specified rcu_dynticks
31802a5c550SPaul E. McKenney  * structure has spent some time in an extended quiescent state since
31902a5c550SPaul E. McKenney  * rcu_dynticks_snap() returned the specified snapshot.
32002a5c550SPaul E. McKenney  */
32102a5c550SPaul E. McKenney static bool rcu_dynticks_in_eqs_since(struct rcu_dynticks *rdtp, int snap)
32202a5c550SPaul E. McKenney {
32302a5c550SPaul E. McKenney 	return snap != rcu_dynticks_snap(rdtp);
32402a5c550SPaul E. McKenney }
32502a5c550SPaul E. McKenney 
32602a5c550SPaul E. McKenney /*
327b8c17e66SPaul E. McKenney  * Set the special (bottom) bit of the specified CPU so that it
328b8c17e66SPaul E. McKenney  * will take special action (such as flushing its TLB) on the
329b8c17e66SPaul E. McKenney  * next exit from an extended quiescent state.  Returns true if
330b8c17e66SPaul E. McKenney  * the bit was successfully set, or false if the CPU was not in
331b8c17e66SPaul E. McKenney  * an extended quiescent state.
332b8c17e66SPaul E. McKenney  */
333b8c17e66SPaul E. McKenney bool rcu_eqs_special_set(int cpu)
334b8c17e66SPaul E. McKenney {
335b8c17e66SPaul E. McKenney 	int old;
336b8c17e66SPaul E. McKenney 	int new;
337b8c17e66SPaul E. McKenney 	struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
338b8c17e66SPaul E. McKenney 
339b8c17e66SPaul E. McKenney 	do {
340b8c17e66SPaul E. McKenney 		old = atomic_read(&rdtp->dynticks);
341b8c17e66SPaul E. McKenney 		if (old & RCU_DYNTICK_CTRL_CTR)
342b8c17e66SPaul E. McKenney 			return false;
343b8c17e66SPaul E. McKenney 		new = old | RCU_DYNTICK_CTRL_MASK;
344b8c17e66SPaul E. McKenney 	} while (atomic_cmpxchg(&rdtp->dynticks, old, new) != old);
345b8c17e66SPaul E. McKenney 	return true;
3466563de9dSPaul E. McKenney }
3475cd37193SPaul E. McKenney 
3484a81e832SPaul E. McKenney /*
3494a81e832SPaul E. McKenney  * Let the RCU core know that this CPU has gone through the scheduler,
3504a81e832SPaul E. McKenney  * which is a quiescent state.  This is called when the need for a
3514a81e832SPaul E. McKenney  * quiescent state is urgent, so we burn an atomic operation and full
3524a81e832SPaul E. McKenney  * memory barriers to let the RCU core know about it, regardless of what
3534a81e832SPaul E. McKenney  * this CPU might (or might not) do in the near future.
3544a81e832SPaul E. McKenney  *
3550f9be8caSPaul E. McKenney  * We inform the RCU core by emulating a zero-duration dyntick-idle period.
35646a5d164SPaul E. McKenney  *
3573b57a399SPaul E. McKenney  * The caller must have disabled interrupts and must not be idle.
3584a81e832SPaul E. McKenney  */
3594a81e832SPaul E. McKenney static void rcu_momentary_dyntick_idle(void)
3604a81e832SPaul E. McKenney {
3613b57a399SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
3623b57a399SPaul E. McKenney 	int special;
3633b57a399SPaul E. McKenney 
3640f9be8caSPaul E. McKenney 	raw_cpu_write(rcu_dynticks.rcu_need_heavy_qs, false);
3653b57a399SPaul E. McKenney 	special = atomic_add_return(2 * RCU_DYNTICK_CTRL_CTR, &rdtp->dynticks);
3663b57a399SPaul E. McKenney 	/* It is illegal to call this from idle state. */
3673b57a399SPaul E. McKenney 	WARN_ON_ONCE(!(special & RCU_DYNTICK_CTRL_CTR));
3683e310098SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
3694a81e832SPaul E. McKenney }
3704a81e832SPaul E. McKenney 
37145975c7dSPaul E. McKenney /**
37245975c7dSPaul E. McKenney  * rcu_is_cpu_rrupt_from_idle - see if idle or immediately interrupted from idle
37345975c7dSPaul E. McKenney  *
37445975c7dSPaul E. McKenney  * If the current CPU is idle or running at a first-level (not nested)
37545975c7dSPaul E. McKenney  * interrupt from idle, return true.  The caller must have at least
37645975c7dSPaul E. McKenney  * disabled preemption.
3774102adabSPaul E. McKenney  */
37845975c7dSPaul E. McKenney static int rcu_is_cpu_rrupt_from_idle(void)
3794102adabSPaul E. McKenney {
38045975c7dSPaul E. McKenney 	return __this_cpu_read(rcu_dynticks.dynticks_nesting) <= 0 &&
38145975c7dSPaul E. McKenney 	       __this_cpu_read(rcu_dynticks.dynticks_nmi_nesting) <= 1;
3824102adabSPaul E. McKenney }
3834102adabSPaul E. McKenney 
3845cd37193SPaul E. McKenney /*
3851925d196SPaul E. McKenney  * Register a quiescent state for all RCU flavors.  If there is an
3865cd37193SPaul E. McKenney  * emergency, invoke rcu_momentary_dyntick_idle() to do a heavy-weight
3875cd37193SPaul E. McKenney  * dyntick-idle quiescent state visible to other CPUs (but only for those
3881925d196SPaul E. McKenney  * RCU flavors in desperate need of a quiescent state, which will normally
3895cd37193SPaul E. McKenney  * be none of them).  Either way, do a lightweight quiescent state for
3905cd37193SPaul E. McKenney  * all RCU flavors.
391bb73c52bSBoqun Feng  *
392bb73c52bSBoqun Feng  * The barrier() calls are redundant in the common case when this is
393bb73c52bSBoqun Feng  * called externally, but just in case this is called from within this
394bb73c52bSBoqun Feng  * file.
395bb73c52bSBoqun Feng  *
3965cd37193SPaul E. McKenney  */
3975cd37193SPaul E. McKenney void rcu_all_qs(void)
3985cd37193SPaul E. McKenney {
39946a5d164SPaul E. McKenney 	unsigned long flags;
40046a5d164SPaul E. McKenney 
4019226b10dSPaul E. McKenney 	if (!raw_cpu_read(rcu_dynticks.rcu_urgent_qs))
4029226b10dSPaul E. McKenney 		return;
4039226b10dSPaul E. McKenney 	preempt_disable();
4049226b10dSPaul E. McKenney 	/* Load rcu_urgent_qs before other flags. */
4059226b10dSPaul E. McKenney 	if (!smp_load_acquire(this_cpu_ptr(&rcu_dynticks.rcu_urgent_qs))) {
4069226b10dSPaul E. McKenney 		preempt_enable();
4079226b10dSPaul E. McKenney 		return;
4089226b10dSPaul E. McKenney 	}
4099226b10dSPaul E. McKenney 	this_cpu_write(rcu_dynticks.rcu_urgent_qs, false);
410bb73c52bSBoqun Feng 	barrier(); /* Avoid RCU read-side critical sections leaking down. */
4110f9be8caSPaul E. McKenney 	if (unlikely(raw_cpu_read(rcu_dynticks.rcu_need_heavy_qs))) {
41246a5d164SPaul E. McKenney 		local_irq_save(flags);
4135cd37193SPaul E. McKenney 		rcu_momentary_dyntick_idle();
41446a5d164SPaul E. McKenney 		local_irq_restore(flags);
41546a5d164SPaul E. McKenney 	}
41645975c7dSPaul E. McKenney 	if (unlikely(raw_cpu_read(rcu_data.cpu_no_qs.b.exp)))
41745975c7dSPaul E. McKenney 		rcu_qs();
4189577df9aSPaul E. McKenney 	this_cpu_inc(rcu_dynticks.rcu_qs_ctr);
419bb73c52bSBoqun Feng 	barrier(); /* Avoid RCU read-side critical sections leaking up. */
4209226b10dSPaul E. McKenney 	preempt_enable();
4215cd37193SPaul E. McKenney }
4225cd37193SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_all_qs);
4235cd37193SPaul E. McKenney 
42417c7798bSPaul E. McKenney #define DEFAULT_RCU_BLIMIT 10     /* Maximum callbacks per rcu_do_batch. */
42517c7798bSPaul E. McKenney static long blimit = DEFAULT_RCU_BLIMIT;
42617c7798bSPaul E. McKenney #define DEFAULT_RCU_QHIMARK 10000 /* If this many pending, ignore blimit. */
42717c7798bSPaul E. McKenney static long qhimark = DEFAULT_RCU_QHIMARK;
42817c7798bSPaul E. McKenney #define DEFAULT_RCU_QLOMARK 100   /* Once only this many pending, use blimit. */
42917c7798bSPaul E. McKenney static long qlowmark = DEFAULT_RCU_QLOMARK;
4304102adabSPaul E. McKenney 
4314102adabSPaul E. McKenney module_param(blimit, long, 0444);
4324102adabSPaul E. McKenney module_param(qhimark, long, 0444);
4334102adabSPaul E. McKenney module_param(qlowmark, long, 0444);
4344102adabSPaul E. McKenney 
4354102adabSPaul E. McKenney static ulong jiffies_till_first_fqs = ULONG_MAX;
4364102adabSPaul E. McKenney static ulong jiffies_till_next_fqs = ULONG_MAX;
4378c7c4829SPaul E. McKenney static bool rcu_kick_kthreads;
4384102adabSPaul E. McKenney 
43967abb96cSByungchul Park static int param_set_first_fqs_jiffies(const char *val, const struct kernel_param *kp)
44067abb96cSByungchul Park {
44167abb96cSByungchul Park 	ulong j;
44267abb96cSByungchul Park 	int ret = kstrtoul(val, 0, &j);
44367abb96cSByungchul Park 
44467abb96cSByungchul Park 	if (!ret)
44567abb96cSByungchul Park 		WRITE_ONCE(*(ulong *)kp->arg, (j > HZ) ? HZ : j);
44667abb96cSByungchul Park 	return ret;
44767abb96cSByungchul Park }
44867abb96cSByungchul Park 
44967abb96cSByungchul Park static int param_set_next_fqs_jiffies(const char *val, const struct kernel_param *kp)
45067abb96cSByungchul Park {
45167abb96cSByungchul Park 	ulong j;
45267abb96cSByungchul Park 	int ret = kstrtoul(val, 0, &j);
45367abb96cSByungchul Park 
45467abb96cSByungchul Park 	if (!ret)
45567abb96cSByungchul Park 		WRITE_ONCE(*(ulong *)kp->arg, (j > HZ) ? HZ : (j ?: 1));
45667abb96cSByungchul Park 	return ret;
45767abb96cSByungchul Park }
45867abb96cSByungchul Park 
45967abb96cSByungchul Park static struct kernel_param_ops first_fqs_jiffies_ops = {
46067abb96cSByungchul Park 	.set = param_set_first_fqs_jiffies,
46167abb96cSByungchul Park 	.get = param_get_ulong,
46267abb96cSByungchul Park };
46367abb96cSByungchul Park 
46467abb96cSByungchul Park static struct kernel_param_ops next_fqs_jiffies_ops = {
46567abb96cSByungchul Park 	.set = param_set_next_fqs_jiffies,
46667abb96cSByungchul Park 	.get = param_get_ulong,
46767abb96cSByungchul Park };
46867abb96cSByungchul Park 
46967abb96cSByungchul Park module_param_cb(jiffies_till_first_fqs, &first_fqs_jiffies_ops, &jiffies_till_first_fqs, 0644);
47067abb96cSByungchul Park module_param_cb(jiffies_till_next_fqs, &next_fqs_jiffies_ops, &jiffies_till_next_fqs, 0644);
4718c7c4829SPaul E. McKenney module_param(rcu_kick_kthreads, bool, 0644);
4724102adabSPaul E. McKenney 
4734a81e832SPaul E. McKenney /*
4744a81e832SPaul E. McKenney  * How long the grace period must be before we start recruiting
4754a81e832SPaul E. McKenney  * quiescent-state help from rcu_note_context_switch().
4764a81e832SPaul E. McKenney  */
477f79c3ad6SPaul E. McKenney static ulong jiffies_till_sched_qs = HZ / 10;
478f79c3ad6SPaul E. McKenney module_param(jiffies_till_sched_qs, ulong, 0444);
4794a81e832SPaul E. McKenney 
480e9ecb780SPaul E. McKenney static void force_qs_rnp(int (*f)(struct rcu_data *rsp));
481e9ecb780SPaul E. McKenney static void force_quiescent_state(void);
482e3950ecdSPaul E. McKenney static int rcu_pending(void);
4834102adabSPaul E. McKenney 
4844102adabSPaul E. McKenney /*
48517ef2fe9SPaul E. McKenney  * Return the number of RCU GPs completed thus far for debug & stats.
4864102adabSPaul E. McKenney  */
48717ef2fe9SPaul E. McKenney unsigned long rcu_get_gp_seq(void)
488917963d0SPaul E. McKenney {
48916fc9c60SPaul E. McKenney 	return READ_ONCE(rcu_state.gp_seq);
490917963d0SPaul E. McKenney }
49117ef2fe9SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_get_gp_seq);
492917963d0SPaul E. McKenney 
493917963d0SPaul E. McKenney /*
49417ef2fe9SPaul E. McKenney  * Return the number of RCU-sched GPs completed thus far for debug & stats.
495917963d0SPaul E. McKenney  */
49617ef2fe9SPaul E. McKenney unsigned long rcu_sched_get_gp_seq(void)
497917963d0SPaul E. McKenney {
49845975c7dSPaul E. McKenney 	return rcu_get_gp_seq();
499917963d0SPaul E. McKenney }
50017ef2fe9SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_sched_get_gp_seq);
501917963d0SPaul E. McKenney 
502917963d0SPaul E. McKenney /*
50382fcecfaSPaul E. McKenney  * Return the number of RCU GPs completed thus far for debug & stats.
50482fcecfaSPaul E. McKenney  * This is a transitional API and will soon be removed.
505917963d0SPaul E. McKenney  */
50617ef2fe9SPaul E. McKenney unsigned long rcu_bh_get_gp_seq(void)
507917963d0SPaul E. McKenney {
50816fc9c60SPaul E. McKenney 	return READ_ONCE(rcu_state.gp_seq);
509917963d0SPaul E. McKenney }
51017ef2fe9SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_bh_get_gp_seq);
5114102adabSPaul E. McKenney 
5124102adabSPaul E. McKenney /*
513291783b8SPaul E. McKenney  * Return the number of RCU expedited batches completed thus far for
514291783b8SPaul E. McKenney  * debug & stats.  Odd numbers mean that a batch is in progress, even
515291783b8SPaul E. McKenney  * numbers mean idle.  The value returned will thus be roughly double
516291783b8SPaul E. McKenney  * the cumulative batches since boot.
517291783b8SPaul E. McKenney  */
518291783b8SPaul E. McKenney unsigned long rcu_exp_batches_completed(void)
519291783b8SPaul E. McKenney {
52016fc9c60SPaul E. McKenney 	return rcu_state.expedited_sequence;
521291783b8SPaul E. McKenney }
522291783b8SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_exp_batches_completed);
523291783b8SPaul E. McKenney 
524291783b8SPaul E. McKenney /*
525291783b8SPaul E. McKenney  * Return the number of RCU-sched expedited batches completed thus far
526291783b8SPaul E. McKenney  * for debug & stats.  Similar to rcu_exp_batches_completed().
527291783b8SPaul E. McKenney  */
528291783b8SPaul E. McKenney unsigned long rcu_exp_batches_completed_sched(void)
529291783b8SPaul E. McKenney {
53045975c7dSPaul E. McKenney 	return rcu_state.expedited_sequence;
531291783b8SPaul E. McKenney }
532291783b8SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_exp_batches_completed_sched);
533291783b8SPaul E. McKenney 
534291783b8SPaul E. McKenney /*
535a381d757SAndreea-Cristina Bernat  * Force a quiescent state.
536a381d757SAndreea-Cristina Bernat  */
537a381d757SAndreea-Cristina Bernat void rcu_force_quiescent_state(void)
538a381d757SAndreea-Cristina Bernat {
539e9ecb780SPaul E. McKenney 	force_quiescent_state();
540a381d757SAndreea-Cristina Bernat }
541a381d757SAndreea-Cristina Bernat EXPORT_SYMBOL_GPL(rcu_force_quiescent_state);
542a381d757SAndreea-Cristina Bernat 
543a381d757SAndreea-Cristina Bernat /*
5444102adabSPaul E. McKenney  * Force a quiescent state for RCU BH.
5454102adabSPaul E. McKenney  */
5464102adabSPaul E. McKenney void rcu_bh_force_quiescent_state(void)
5474102adabSPaul E. McKenney {
548e9ecb780SPaul E. McKenney 	force_quiescent_state();
5494102adabSPaul E. McKenney }
5504102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_bh_force_quiescent_state);
5514102adabSPaul E. McKenney 
5524102adabSPaul E. McKenney /*
553e7580f33SPaul E. McKenney  * Force a quiescent state for RCU-sched.
554e7580f33SPaul E. McKenney  */
555e7580f33SPaul E. McKenney void rcu_sched_force_quiescent_state(void)
556e7580f33SPaul E. McKenney {
55745975c7dSPaul E. McKenney 	rcu_force_quiescent_state();
558e7580f33SPaul E. McKenney }
559e7580f33SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_sched_force_quiescent_state);
560e7580f33SPaul E. McKenney 
561e7580f33SPaul E. McKenney /*
562afea227fSPaul E. McKenney  * Show the state of the grace-period kthreads.
563afea227fSPaul E. McKenney  */
564afea227fSPaul E. McKenney void show_rcu_gp_kthreads(void)
565afea227fSPaul E. McKenney {
56647199a08SPaul E. McKenney 	int cpu;
56747199a08SPaul E. McKenney 	struct rcu_data *rdp;
56847199a08SPaul E. McKenney 	struct rcu_node *rnp;
569afea227fSPaul E. McKenney 
570b97d23c5SPaul E. McKenney 	pr_info("%s: wait state: %d ->state: %#lx\n", rcu_state.name,
571b97d23c5SPaul E. McKenney 		rcu_state.gp_state, rcu_state.gp_kthread->state);
572aedf4ba9SPaul E. McKenney 	rcu_for_each_node_breadth_first(rnp) {
573b97d23c5SPaul E. McKenney 		if (ULONG_CMP_GE(rcu_state.gp_seq, rnp->gp_seq_needed))
57447199a08SPaul E. McKenney 			continue;
57547199a08SPaul E. McKenney 		pr_info("\trcu_node %d:%d ->gp_seq %lu ->gp_seq_needed %lu\n",
57647199a08SPaul E. McKenney 			rnp->grplo, rnp->grphi, rnp->gp_seq,
57747199a08SPaul E. McKenney 			rnp->gp_seq_needed);
57847199a08SPaul E. McKenney 		if (!rcu_is_leaf_node(rnp))
57947199a08SPaul E. McKenney 			continue;
58047199a08SPaul E. McKenney 		for_each_leaf_node_possible_cpu(rnp, cpu) {
581da1df50dSPaul E. McKenney 			rdp = per_cpu_ptr(&rcu_data, cpu);
58247199a08SPaul E. McKenney 			if (rdp->gpwrap ||
583b97d23c5SPaul E. McKenney 			    ULONG_CMP_GE(rcu_state.gp_seq,
58447199a08SPaul E. McKenney 					 rdp->gp_seq_needed))
58547199a08SPaul E. McKenney 				continue;
58647199a08SPaul E. McKenney 			pr_info("\tcpu %d ->gp_seq_needed %lu\n",
58747199a08SPaul E. McKenney 				cpu, rdp->gp_seq_needed);
58847199a08SPaul E. McKenney 		}
58947199a08SPaul E. McKenney 	}
590b97d23c5SPaul E. McKenney 	/* sched_show_task(rcu_state.gp_kthread); */
591afea227fSPaul E. McKenney }
592afea227fSPaul E. McKenney EXPORT_SYMBOL_GPL(show_rcu_gp_kthreads);
593afea227fSPaul E. McKenney 
594afea227fSPaul E. McKenney /*
595ad0dc7f9SPaul E. McKenney  * Send along grace-period-related data for rcutorture diagnostics.
596ad0dc7f9SPaul E. McKenney  */
597ad0dc7f9SPaul E. McKenney void rcutorture_get_gp_data(enum rcutorture_type test_type, int *flags,
598aebc8264SPaul E. McKenney 			    unsigned long *gp_seq)
599ad0dc7f9SPaul E. McKenney {
600ad0dc7f9SPaul E. McKenney 	switch (test_type) {
601ad0dc7f9SPaul E. McKenney 	case RCU_FLAVOR:
602ad0dc7f9SPaul E. McKenney 	case RCU_BH_FLAVOR:
603ad0dc7f9SPaul E. McKenney 	case RCU_SCHED_FLAVOR:
604f7dd7d44SPaul E. McKenney 		*flags = READ_ONCE(rcu_state.gp_flags);
605f7dd7d44SPaul E. McKenney 		*gp_seq = rcu_seq_current(&rcu_state.gp_seq);
606ad0dc7f9SPaul E. McKenney 		break;
607ad0dc7f9SPaul E. McKenney 	default:
608ad0dc7f9SPaul E. McKenney 		break;
609ad0dc7f9SPaul E. McKenney 	}
610ad0dc7f9SPaul E. McKenney }
611ad0dc7f9SPaul E. McKenney EXPORT_SYMBOL_GPL(rcutorture_get_gp_data);
612ad0dc7f9SPaul E. McKenney 
613ad0dc7f9SPaul E. McKenney /*
614365187fbSPaul E. McKenney  * Return the root node of the specified rcu_state structure.
615365187fbSPaul E. McKenney  */
616336a4f6cSPaul E. McKenney static struct rcu_node *rcu_get_root(void)
617365187fbSPaul E. McKenney {
618336a4f6cSPaul E. McKenney 	return &rcu_state.node[0];
619365187fbSPaul E. McKenney }
620365187fbSPaul E. McKenney 
621365187fbSPaul E. McKenney /*
622215bba9fSPaul E. McKenney  * Enter an RCU extended quiescent state, which can be either the
623215bba9fSPaul E. McKenney  * idle loop or adaptive-tickless usermode execution.
6244102adabSPaul E. McKenney  *
625215bba9fSPaul E. McKenney  * We crowbar the ->dynticks_nmi_nesting field to zero to allow for
626215bba9fSPaul E. McKenney  * the possibility of usermode upcalls having messed up our count
627215bba9fSPaul E. McKenney  * of interrupt nesting level during the prior busy period.
6284102adabSPaul E. McKenney  */
629215bba9fSPaul E. McKenney static void rcu_eqs_enter(bool user)
6304102adabSPaul E. McKenney {
63196d3fd0dSPaul E. McKenney 	struct rcu_data *rdp;
632215bba9fSPaul E. McKenney 	struct rcu_dynticks *rdtp;
633215bba9fSPaul E. McKenney 
634215bba9fSPaul E. McKenney 	rdtp = this_cpu_ptr(&rcu_dynticks);
635e11ec65cSPaul E. McKenney 	WARN_ON_ONCE(rdtp->dynticks_nmi_nesting != DYNTICK_IRQ_NONIDLE);
636215bba9fSPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nmi_nesting, 0);
637215bba9fSPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
638215bba9fSPaul E. McKenney 		     rdtp->dynticks_nesting == 0);
639215bba9fSPaul E. McKenney 	if (rdtp->dynticks_nesting != 1) {
640215bba9fSPaul E. McKenney 		rdtp->dynticks_nesting--;
641215bba9fSPaul E. McKenney 		return;
642215bba9fSPaul E. McKenney 	}
64396d3fd0dSPaul E. McKenney 
644b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
645dec98900SPaul E. McKenney 	trace_rcu_dyntick(TPS("Start"), rdtp->dynticks_nesting, 0, rdtp->dynticks);
646e68bbb26SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && !user && !is_idle_task(current));
647da1df50dSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
64896d3fd0dSPaul E. McKenney 	do_nocb_deferred_wakeup(rdp);
649198bbf81SPaul E. McKenney 	rcu_prepare_for_idle();
6503e310098SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
6512342172fSPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nesting, 0); /* Avoid irq-access tearing. */
652844ccdd7SPaul E. McKenney 	rcu_dynticks_eqs_enter();
653176f8f7aSPaul E. McKenney 	rcu_dynticks_task_enter();
6543a592405SPaul E. McKenney }
6554102adabSPaul E. McKenney 
6564102adabSPaul E. McKenney /**
6574102adabSPaul E. McKenney  * rcu_idle_enter - inform RCU that current CPU is entering idle
6584102adabSPaul E. McKenney  *
6594102adabSPaul E. McKenney  * Enter idle mode, in other words, -leave- the mode in which RCU
6604102adabSPaul E. McKenney  * read-side critical sections can occur.  (Though RCU read-side
6614102adabSPaul E. McKenney  * critical sections can occur in irq handlers in idle, a possibility
6624102adabSPaul E. McKenney  * handled by irq_enter() and irq_exit().)
6634102adabSPaul E. McKenney  *
664c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_idle_enter(), be sure to test with
665c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
6664102adabSPaul E. McKenney  */
6674102adabSPaul E. McKenney void rcu_idle_enter(void)
6684102adabSPaul E. McKenney {
669b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
6704102adabSPaul E. McKenney 	rcu_eqs_enter(false);
6714102adabSPaul E. McKenney }
6724102adabSPaul E. McKenney 
673d1ec4c34SPaul E. McKenney #ifdef CONFIG_NO_HZ_FULL
6744102adabSPaul E. McKenney /**
6754102adabSPaul E. McKenney  * rcu_user_enter - inform RCU that we are resuming userspace.
6764102adabSPaul E. McKenney  *
6774102adabSPaul E. McKenney  * Enter RCU idle mode right before resuming userspace.  No use of RCU
6784102adabSPaul E. McKenney  * is permitted between this call and rcu_user_exit(). This way the
6794102adabSPaul E. McKenney  * CPU doesn't need to maintain the tick for RCU maintenance purposes
6804102adabSPaul E. McKenney  * when the CPU runs in userspace.
681c0da313eSPaul E. McKenney  *
682c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_user_enter(), be sure to test with
683c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
6844102adabSPaul E. McKenney  */
6854102adabSPaul E. McKenney void rcu_user_enter(void)
6864102adabSPaul E. McKenney {
687b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
688d4db30afSPaul E. McKenney 	rcu_eqs_enter(true);
6894102adabSPaul E. McKenney }
690d1ec4c34SPaul E. McKenney #endif /* CONFIG_NO_HZ_FULL */
6914102adabSPaul E. McKenney 
692cf7614e1SByungchul Park /*
693fd581a91SPaul E. McKenney  * If we are returning from the outermost NMI handler that interrupted an
694fd581a91SPaul E. McKenney  * RCU-idle period, update rdtp->dynticks and rdtp->dynticks_nmi_nesting
695fd581a91SPaul E. McKenney  * to let the RCU grace-period handling know that the CPU is back to
696fd581a91SPaul E. McKenney  * being RCU-idle.
697fd581a91SPaul E. McKenney  *
698cf7614e1SByungchul Park  * If you add or remove a call to rcu_nmi_exit_common(), be sure to test
699fd581a91SPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
700fd581a91SPaul E. McKenney  */
701cf7614e1SByungchul Park static __always_inline void rcu_nmi_exit_common(bool irq)
702fd581a91SPaul E. McKenney {
703fd581a91SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
704fd581a91SPaul E. McKenney 
705fd581a91SPaul E. McKenney 	/*
706fd581a91SPaul E. McKenney 	 * Check for ->dynticks_nmi_nesting underflow and bad ->dynticks.
707fd581a91SPaul E. McKenney 	 * (We are exiting an NMI handler, so RCU better be paying attention
708fd581a91SPaul E. McKenney 	 * to us!)
709fd581a91SPaul E. McKenney 	 */
710fd581a91SPaul E. McKenney 	WARN_ON_ONCE(rdtp->dynticks_nmi_nesting <= 0);
711fd581a91SPaul E. McKenney 	WARN_ON_ONCE(rcu_dynticks_curr_cpu_in_eqs());
712fd581a91SPaul E. McKenney 
713fd581a91SPaul E. McKenney 	/*
714fd581a91SPaul E. McKenney 	 * If the nesting level is not 1, the CPU wasn't RCU-idle, so
715fd581a91SPaul E. McKenney 	 * leave it in non-RCU-idle state.
716fd581a91SPaul E. McKenney 	 */
717fd581a91SPaul E. McKenney 	if (rdtp->dynticks_nmi_nesting != 1) {
718dec98900SPaul E. McKenney 		trace_rcu_dyntick(TPS("--="), rdtp->dynticks_nmi_nesting, rdtp->dynticks_nmi_nesting - 2, rdtp->dynticks);
719fd581a91SPaul E. McKenney 		WRITE_ONCE(rdtp->dynticks_nmi_nesting, /* No store tearing. */
720fd581a91SPaul E. McKenney 			   rdtp->dynticks_nmi_nesting - 2);
721fd581a91SPaul E. McKenney 		return;
722fd581a91SPaul E. McKenney 	}
723fd581a91SPaul E. McKenney 
724fd581a91SPaul E. McKenney 	/* This NMI interrupted an RCU-idle CPU, restore RCU-idleness. */
725dec98900SPaul E. McKenney 	trace_rcu_dyntick(TPS("Startirq"), rdtp->dynticks_nmi_nesting, 0, rdtp->dynticks);
726fd581a91SPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nmi_nesting, 0); /* Avoid store tearing. */
727cf7614e1SByungchul Park 
728cf7614e1SByungchul Park 	if (irq)
729cf7614e1SByungchul Park 		rcu_prepare_for_idle();
730cf7614e1SByungchul Park 
731fd581a91SPaul E. McKenney 	rcu_dynticks_eqs_enter();
732cf7614e1SByungchul Park 
733cf7614e1SByungchul Park 	if (irq)
734cf7614e1SByungchul Park 		rcu_dynticks_task_enter();
735cf7614e1SByungchul Park }
736cf7614e1SByungchul Park 
737cf7614e1SByungchul Park /**
738cf7614e1SByungchul Park  * rcu_nmi_exit - inform RCU of exit from NMI context
739cf7614e1SByungchul Park  * @irq: Is this call from rcu_irq_exit?
740cf7614e1SByungchul Park  *
741cf7614e1SByungchul Park  * If you add or remove a call to rcu_nmi_exit(), be sure to test
742cf7614e1SByungchul Park  * with CONFIG_RCU_EQS_DEBUG=y.
743cf7614e1SByungchul Park  */
744cf7614e1SByungchul Park void rcu_nmi_exit(void)
745cf7614e1SByungchul Park {
746cf7614e1SByungchul Park 	rcu_nmi_exit_common(false);
747fd581a91SPaul E. McKenney }
748fd581a91SPaul E. McKenney 
749fd581a91SPaul E. McKenney /**
7504102adabSPaul E. McKenney  * rcu_irq_exit - inform RCU that current CPU is exiting irq towards idle
7514102adabSPaul E. McKenney  *
7524102adabSPaul E. McKenney  * Exit from an interrupt handler, which might possibly result in entering
7534102adabSPaul E. McKenney  * idle mode, in other words, leaving the mode in which read-side critical
7547c9906caSPaul E. McKenney  * sections can occur.  The caller must have disabled interrupts.
7554102adabSPaul E. McKenney  *
7564102adabSPaul E. McKenney  * This code assumes that the idle loop never does anything that might
7574102adabSPaul E. McKenney  * result in unbalanced calls to irq_enter() and irq_exit().  If your
75858721f5dSPaul E. McKenney  * architecture's idle loop violates this assumption, RCU will give you what
75958721f5dSPaul E. McKenney  * you deserve, good and hard.  But very infrequently and irreproducibly.
7604102adabSPaul E. McKenney  *
7614102adabSPaul E. McKenney  * Use things like work queues to work around this limitation.
7624102adabSPaul E. McKenney  *
7634102adabSPaul E. McKenney  * You have been warned.
764c0da313eSPaul E. McKenney  *
765c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_irq_exit(), be sure to test with
766c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
7674102adabSPaul E. McKenney  */
7684102adabSPaul E. McKenney void rcu_irq_exit(void)
7694102adabSPaul E. McKenney {
770b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
771cf7614e1SByungchul Park 	rcu_nmi_exit_common(true);
7727c9906caSPaul E. McKenney }
7737c9906caSPaul E. McKenney 
7747c9906caSPaul E. McKenney /*
7757c9906caSPaul E. McKenney  * Wrapper for rcu_irq_exit() where interrupts are enabled.
776c0da313eSPaul E. McKenney  *
777c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_irq_exit_irqson(), be sure to test
778c0da313eSPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
7797c9906caSPaul E. McKenney  */
7807c9906caSPaul E. McKenney void rcu_irq_exit_irqson(void)
7817c9906caSPaul E. McKenney {
7827c9906caSPaul E. McKenney 	unsigned long flags;
7837c9906caSPaul E. McKenney 
7847c9906caSPaul E. McKenney 	local_irq_save(flags);
7857c9906caSPaul E. McKenney 	rcu_irq_exit();
7864102adabSPaul E. McKenney 	local_irq_restore(flags);
7874102adabSPaul E. McKenney }
7884102adabSPaul E. McKenney 
7894102adabSPaul E. McKenney /*
7904102adabSPaul E. McKenney  * Exit an RCU extended quiescent state, which can be either the
7914102adabSPaul E. McKenney  * idle loop or adaptive-tickless usermode execution.
79251a1fd30SPaul E. McKenney  *
79351a1fd30SPaul E. McKenney  * We crowbar the ->dynticks_nmi_nesting field to DYNTICK_IRQ_NONIDLE to
79451a1fd30SPaul E. McKenney  * allow for the possibility of usermode upcalls messing up our count of
79551a1fd30SPaul E. McKenney  * interrupt nesting level during the busy period that is just now starting.
7964102adabSPaul E. McKenney  */
7974102adabSPaul E. McKenney static void rcu_eqs_exit(bool user)
7984102adabSPaul E. McKenney {
7994102adabSPaul E. McKenney 	struct rcu_dynticks *rdtp;
80084585aa8SPaul E. McKenney 	long oldval;
8014102adabSPaul E. McKenney 
802b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
8034102adabSPaul E. McKenney 	rdtp = this_cpu_ptr(&rcu_dynticks);
8044102adabSPaul E. McKenney 	oldval = rdtp->dynticks_nesting;
8051ce46ee5SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && oldval < 0);
80651a1fd30SPaul E. McKenney 	if (oldval) {
80751a1fd30SPaul E. McKenney 		rdtp->dynticks_nesting++;
8089dd238e2SPaul E. McKenney 		return;
8094102adabSPaul E. McKenney 	}
8109dd238e2SPaul E. McKenney 	rcu_dynticks_task_exit();
8119dd238e2SPaul E. McKenney 	rcu_dynticks_eqs_exit();
8129dd238e2SPaul E. McKenney 	rcu_cleanup_after_idle();
8139dd238e2SPaul E. McKenney 	trace_rcu_dyntick(TPS("End"), rdtp->dynticks_nesting, 1, rdtp->dynticks);
814e68bbb26SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && !user && !is_idle_task(current));
8152342172fSPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nesting, 1);
816e11ec65cSPaul E. McKenney 	WARN_ON_ONCE(rdtp->dynticks_nmi_nesting);
8176136d6e4SPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nmi_nesting, DYNTICK_IRQ_NONIDLE);
8183a592405SPaul E. McKenney }
8194102adabSPaul E. McKenney 
8204102adabSPaul E. McKenney /**
8214102adabSPaul E. McKenney  * rcu_idle_exit - inform RCU that current CPU is leaving idle
8224102adabSPaul E. McKenney  *
8234102adabSPaul E. McKenney  * Exit idle mode, in other words, -enter- the mode in which RCU
8244102adabSPaul E. McKenney  * read-side critical sections can occur.
8254102adabSPaul E. McKenney  *
826c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_idle_exit(), be sure to test with
827c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
8284102adabSPaul E. McKenney  */
8294102adabSPaul E. McKenney void rcu_idle_exit(void)
8304102adabSPaul E. McKenney {
8314102adabSPaul E. McKenney 	unsigned long flags;
8324102adabSPaul E. McKenney 
8334102adabSPaul E. McKenney 	local_irq_save(flags);
8344102adabSPaul E. McKenney 	rcu_eqs_exit(false);
8354102adabSPaul E. McKenney 	local_irq_restore(flags);
8364102adabSPaul E. McKenney }
8374102adabSPaul E. McKenney 
838d1ec4c34SPaul E. McKenney #ifdef CONFIG_NO_HZ_FULL
8394102adabSPaul E. McKenney /**
8404102adabSPaul E. McKenney  * rcu_user_exit - inform RCU that we are exiting userspace.
8414102adabSPaul E. McKenney  *
8424102adabSPaul E. McKenney  * Exit RCU idle mode while entering the kernel because it can
8434102adabSPaul E. McKenney  * run a RCU read side critical section anytime.
844c0da313eSPaul E. McKenney  *
845c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_user_exit(), be sure to test with
846c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
8474102adabSPaul E. McKenney  */
8484102adabSPaul E. McKenney void rcu_user_exit(void)
8494102adabSPaul E. McKenney {
8504102adabSPaul E. McKenney 	rcu_eqs_exit(1);
8514102adabSPaul E. McKenney }
852d1ec4c34SPaul E. McKenney #endif /* CONFIG_NO_HZ_FULL */
8534102adabSPaul E. McKenney 
8544102adabSPaul E. McKenney /**
855cf7614e1SByungchul Park  * rcu_nmi_enter_common - inform RCU of entry to NMI context
856cf7614e1SByungchul Park  * @irq: Is this call from rcu_irq_enter?
8574102adabSPaul E. McKenney  *
858734d1680SPaul E. McKenney  * If the CPU was idle from RCU's viewpoint, update rdtp->dynticks and
859734d1680SPaul E. McKenney  * rdtp->dynticks_nmi_nesting to let the RCU grace-period handling know
860734d1680SPaul E. McKenney  * that the CPU is active.  This implementation permits nested NMIs, as
861734d1680SPaul E. McKenney  * long as the nesting level does not overflow an int.  (You will probably
862734d1680SPaul E. McKenney  * run out of stack space first.)
863c0da313eSPaul E. McKenney  *
864cf7614e1SByungchul Park  * If you add or remove a call to rcu_nmi_enter_common(), be sure to test
865c0da313eSPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
8664102adabSPaul E. McKenney  */
867cf7614e1SByungchul Park static __always_inline void rcu_nmi_enter_common(bool irq)
8684102adabSPaul E. McKenney {
8694102adabSPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
87084585aa8SPaul E. McKenney 	long incby = 2;
8714102adabSPaul E. McKenney 
872734d1680SPaul E. McKenney 	/* Complain about underflow. */
873734d1680SPaul E. McKenney 	WARN_ON_ONCE(rdtp->dynticks_nmi_nesting < 0);
874734d1680SPaul E. McKenney 
875734d1680SPaul E. McKenney 	/*
876734d1680SPaul E. McKenney 	 * If idle from RCU viewpoint, atomically increment ->dynticks
877734d1680SPaul E. McKenney 	 * to mark non-idle and increment ->dynticks_nmi_nesting by one.
878734d1680SPaul E. McKenney 	 * Otherwise, increment ->dynticks_nmi_nesting by two.  This means
879734d1680SPaul E. McKenney 	 * if ->dynticks_nmi_nesting is equal to one, we are guaranteed
880734d1680SPaul E. McKenney 	 * to be in the outermost NMI handler that interrupted an RCU-idle
881734d1680SPaul E. McKenney 	 * period (observation due to Andy Lutomirski).
882734d1680SPaul E. McKenney 	 */
88302a5c550SPaul E. McKenney 	if (rcu_dynticks_curr_cpu_in_eqs()) {
884cf7614e1SByungchul Park 
885cf7614e1SByungchul Park 		if (irq)
886cf7614e1SByungchul Park 			rcu_dynticks_task_exit();
887cf7614e1SByungchul Park 
8882625d469SPaul E. McKenney 		rcu_dynticks_eqs_exit();
889cf7614e1SByungchul Park 
890cf7614e1SByungchul Park 		if (irq)
891cf7614e1SByungchul Park 			rcu_cleanup_after_idle();
892cf7614e1SByungchul Park 
893734d1680SPaul E. McKenney 		incby = 1;
894734d1680SPaul E. McKenney 	}
895bd2b879aSPaul E. McKenney 	trace_rcu_dyntick(incby == 1 ? TPS("Endirq") : TPS("++="),
896bd2b879aSPaul E. McKenney 			  rdtp->dynticks_nmi_nesting,
897dec98900SPaul E. McKenney 			  rdtp->dynticks_nmi_nesting + incby, rdtp->dynticks);
898fd581a91SPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nmi_nesting, /* Prevent store tearing. */
899fd581a91SPaul E. McKenney 		   rdtp->dynticks_nmi_nesting + incby);
900734d1680SPaul E. McKenney 	barrier();
9014102adabSPaul E. McKenney }
9024102adabSPaul E. McKenney 
9034102adabSPaul E. McKenney /**
904cf7614e1SByungchul Park  * rcu_nmi_enter - inform RCU of entry to NMI context
905cf7614e1SByungchul Park  */
906cf7614e1SByungchul Park void rcu_nmi_enter(void)
907cf7614e1SByungchul Park {
908cf7614e1SByungchul Park 	rcu_nmi_enter_common(false);
909cf7614e1SByungchul Park }
910cf7614e1SByungchul Park 
911cf7614e1SByungchul Park /**
9124102adabSPaul E. McKenney  * rcu_irq_enter - inform RCU that current CPU is entering irq away from idle
9134102adabSPaul E. McKenney  *
9144102adabSPaul E. McKenney  * Enter an interrupt handler, which might possibly result in exiting
9154102adabSPaul E. McKenney  * idle mode, in other words, entering the mode in which read-side critical
9164102adabSPaul E. McKenney  * sections can occur.  The caller must have disabled interrupts.
917c0da313eSPaul E. McKenney  *
9184102adabSPaul E. McKenney  * Note that the Linux kernel is fully capable of entering an interrupt
91958721f5dSPaul E. McKenney  * handler that it never exits, for example when doing upcalls to user mode!
92058721f5dSPaul E. McKenney  * This code assumes that the idle loop never does upcalls to user mode.
92158721f5dSPaul E. McKenney  * If your architecture's idle loop does do upcalls to user mode (or does
92258721f5dSPaul E. McKenney  * anything else that results in unbalanced calls to the irq_enter() and
92358721f5dSPaul E. McKenney  * irq_exit() functions), RCU will give you what you deserve, good and hard.
92458721f5dSPaul E. McKenney  * But very infrequently and irreproducibly.
9254102adabSPaul E. McKenney  *
9264102adabSPaul E. McKenney  * Use things like work queues to work around this limitation.
9274102adabSPaul E. McKenney  *
9284102adabSPaul E. McKenney  * You have been warned.
9294102adabSPaul E. McKenney  *
9304102adabSPaul E. McKenney  * If you add or remove a call to rcu_irq_enter(), be sure to test with
9314102adabSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
9324102adabSPaul E. McKenney  */
9334102adabSPaul E. McKenney void rcu_irq_enter(void)
9344102adabSPaul E. McKenney {
9354102adabSPaul E. McKenney 	lockdep_assert_irqs_disabled();
936cf7614e1SByungchul Park 	rcu_nmi_enter_common(true);
937734d1680SPaul E. McKenney }
938734d1680SPaul E. McKenney 
9394102adabSPaul E. McKenney /*
9404102adabSPaul E. McKenney  * Wrapper for rcu_irq_enter() where interrupts are enabled.
9414102adabSPaul E. McKenney  *
9424102adabSPaul E. McKenney  * If you add or remove a call to rcu_irq_enter_irqson(), be sure to test
9434102adabSPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
9444102adabSPaul E. McKenney  */
9454102adabSPaul E. McKenney void rcu_irq_enter_irqson(void)
9464102adabSPaul E. McKenney {
9474102adabSPaul E. McKenney 	unsigned long flags;
9484102adabSPaul E. McKenney 
9494102adabSPaul E. McKenney 	local_irq_save(flags);
9504102adabSPaul E. McKenney 	rcu_irq_enter();
9514102adabSPaul E. McKenney 	local_irq_restore(flags);
9524102adabSPaul E. McKenney }
9534102adabSPaul E. McKenney 
9544102adabSPaul E. McKenney /**
9554102adabSPaul E. McKenney  * rcu_is_watching - see if RCU thinks that the current CPU is idle
9564102adabSPaul E. McKenney  *
957791875d1SPaul E. McKenney  * Return true if RCU is watching the running CPU, which means that this
958791875d1SPaul E. McKenney  * CPU can safely enter RCU read-side critical sections.  In other words,
959791875d1SPaul E. McKenney  * if the current CPU is in its idle loop and is neither in an interrupt
9604102adabSPaul E. McKenney  * or NMI handler, return true.
9614102adabSPaul E. McKenney  */
962b29c8306SLinus Torvalds bool notrace rcu_is_watching(void)
9634102adabSPaul E. McKenney {
964f534ed1fSPranith Kumar 	bool ret;
9654102adabSPaul E. McKenney 
96646f00d18SAlexei Starovoitov 	preempt_disable_notrace();
967791875d1SPaul E. McKenney 	ret = !rcu_dynticks_curr_cpu_in_eqs();
96846f00d18SAlexei Starovoitov 	preempt_enable_notrace();
9694102adabSPaul E. McKenney 	return ret;
9704102adabSPaul E. McKenney }
9714102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_is_watching);
9724102adabSPaul E. McKenney 
973bcbfdd01SPaul E. McKenney /*
974bcbfdd01SPaul E. McKenney  * If a holdout task is actually running, request an urgent quiescent
975bcbfdd01SPaul E. McKenney  * state from its CPU.  This is unsynchronized, so migrations can cause
976bcbfdd01SPaul E. McKenney  * the request to go to the wrong CPU.  Which is OK, all that will happen
977bcbfdd01SPaul E. McKenney  * is that the CPU's next context switch will be a bit slower and next
978bcbfdd01SPaul E. McKenney  * time around this task will generate another request.
979bcbfdd01SPaul E. McKenney  */
980bcbfdd01SPaul E. McKenney void rcu_request_urgent_qs_task(struct task_struct *t)
981bcbfdd01SPaul E. McKenney {
982bcbfdd01SPaul E. McKenney 	int cpu;
983bcbfdd01SPaul E. McKenney 
984bcbfdd01SPaul E. McKenney 	barrier();
985bcbfdd01SPaul E. McKenney 	cpu = task_cpu(t);
986bcbfdd01SPaul E. McKenney 	if (!task_curr(t))
987bcbfdd01SPaul E. McKenney 		return; /* This task is not running on that CPU. */
988bcbfdd01SPaul E. McKenney 	smp_store_release(per_cpu_ptr(&rcu_dynticks.rcu_urgent_qs, cpu), true);
989bcbfdd01SPaul E. McKenney }
990bcbfdd01SPaul E. McKenney 
9914102adabSPaul E. McKenney #if defined(CONFIG_PROVE_RCU) && defined(CONFIG_HOTPLUG_CPU)
9924102adabSPaul E. McKenney 
9934102adabSPaul E. McKenney /*
9945554788eSPaul E. McKenney  * Is the current CPU online as far as RCU is concerned?
9954102adabSPaul E. McKenney  *
9965554788eSPaul E. McKenney  * Disable preemption to avoid false positives that could otherwise
9975554788eSPaul E. McKenney  * happen due to the current CPU number being sampled, this task being
9985554788eSPaul E. McKenney  * preempted, its old CPU being taken offline, resuming on some other CPU,
9995554788eSPaul E. McKenney  * then determining that its old CPU is now offline.  Because there are
10005554788eSPaul E. McKenney  * multiple flavors of RCU, and because this function can be called in the
10015554788eSPaul E. McKenney  * midst of updating the flavors while a given CPU coming online or going
10025554788eSPaul E. McKenney  * offline, it is necessary to check all flavors.  If any of the flavors
10035554788eSPaul E. McKenney  * believe that given CPU is online, it is considered to be online.
10044102adabSPaul E. McKenney  *
10055554788eSPaul E. McKenney  * Disable checking if in an NMI handler because we cannot safely
10065554788eSPaul E. McKenney  * report errors from NMI handlers anyway.  In addition, it is OK to use
10075554788eSPaul E. McKenney  * RCU on an offline processor during initial boot, hence the check for
10085554788eSPaul E. McKenney  * rcu_scheduler_fully_active.
10094102adabSPaul E. McKenney  */
10104102adabSPaul E. McKenney bool rcu_lockdep_current_cpu_online(void)
10114102adabSPaul E. McKenney {
10124102adabSPaul E. McKenney 	struct rcu_data *rdp;
10134102adabSPaul E. McKenney 	struct rcu_node *rnp;
1014b97d23c5SPaul E. McKenney 	bool ret = false;
10154102adabSPaul E. McKenney 
10165554788eSPaul E. McKenney 	if (in_nmi() || !rcu_scheduler_fully_active)
1017f6f7ee9aSFengguang Wu 		return true;
10184102adabSPaul E. McKenney 	preempt_disable();
1019da1df50dSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
10204102adabSPaul E. McKenney 	rnp = rdp->mynode;
1021b97d23c5SPaul E. McKenney 	if (rdp->grpmask & rcu_rnp_online_cpus(rnp))
1022b97d23c5SPaul E. McKenney 		ret = true;
10234102adabSPaul E. McKenney 	preempt_enable();
1024b97d23c5SPaul E. McKenney 	return ret;
10254102adabSPaul E. McKenney }
10264102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_lockdep_current_cpu_online);
10274102adabSPaul E. McKenney 
10284102adabSPaul E. McKenney #endif /* #if defined(CONFIG_PROVE_RCU) && defined(CONFIG_HOTPLUG_CPU) */
10294102adabSPaul E. McKenney 
10304102adabSPaul E. McKenney /*
10319b9500daSPaul E. McKenney  * We are reporting a quiescent state on behalf of some other CPU, so
10329b9500daSPaul E. McKenney  * it is our responsibility to check for and handle potential overflow
1033a66ae8aeSPaul E. McKenney  * of the rcu_node ->gp_seq counter with respect to the rcu_data counters.
10349b9500daSPaul E. McKenney  * After all, the CPU might be in deep idle state, and thus executing no
10359b9500daSPaul E. McKenney  * code whatsoever.
10369b9500daSPaul E. McKenney  */
10379b9500daSPaul E. McKenney static void rcu_gpnum_ovf(struct rcu_node *rnp, struct rcu_data *rdp)
10389b9500daSPaul E. McKenney {
1039a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1040a66ae8aeSPaul E. McKenney 	if (ULONG_CMP_LT(rcu_seq_current(&rdp->gp_seq) + ULONG_MAX / 4,
1041a66ae8aeSPaul E. McKenney 			 rnp->gp_seq))
10429b9500daSPaul E. McKenney 		WRITE_ONCE(rdp->gpwrap, true);
10438aa670cdSPaul E. McKenney 	if (ULONG_CMP_LT(rdp->rcu_iw_gp_seq + ULONG_MAX / 4, rnp->gp_seq))
10448aa670cdSPaul E. McKenney 		rdp->rcu_iw_gp_seq = rnp->gp_seq + ULONG_MAX / 4;
10459b9500daSPaul E. McKenney }
10469b9500daSPaul E. McKenney 
10479b9500daSPaul E. McKenney /*
10484102adabSPaul E. McKenney  * Snapshot the specified CPU's dynticks counter so that we can later
10494102adabSPaul E. McKenney  * credit them with an implicit quiescent state.  Return 1 if this CPU
10504102adabSPaul E. McKenney  * is in dynticks idle mode, which is an extended quiescent state.
10514102adabSPaul E. McKenney  */
1052fe5ac724SPaul E. McKenney static int dyntick_save_progress_counter(struct rcu_data *rdp)
10534102adabSPaul E. McKenney {
10548b2f63abSPaul E. McKenney 	rdp->dynticks_snap = rcu_dynticks_snap(rdp->dynticks);
105502a5c550SPaul E. McKenney 	if (rcu_dynticks_in_eqs(rdp->dynticks_snap)) {
105688d1beadSPaul E. McKenney 		trace_rcu_fqs(rcu_state.name, rdp->gp_seq, rdp->cpu, TPS("dti"));
10579b9500daSPaul E. McKenney 		rcu_gpnum_ovf(rdp->mynode, rdp);
105823a9bacdSPaul E. McKenney 		return 1;
10597941dbdeSAndreea-Cristina Bernat 	}
106023a9bacdSPaul E. McKenney 	return 0;
10614102adabSPaul E. McKenney }
10624102adabSPaul E. McKenney 
10634102adabSPaul E. McKenney /*
10649b9500daSPaul E. McKenney  * Handler for the irq_work request posted when a grace period has
10659b9500daSPaul E. McKenney  * gone on for too long, but not yet long enough for an RCU CPU
10669b9500daSPaul E. McKenney  * stall warning.  Set state appropriately, but just complain if
10679b9500daSPaul E. McKenney  * there is unexpected state on entry.
10689b9500daSPaul E. McKenney  */
10699b9500daSPaul E. McKenney static void rcu_iw_handler(struct irq_work *iwp)
10709b9500daSPaul E. McKenney {
10719b9500daSPaul E. McKenney 	struct rcu_data *rdp;
10729b9500daSPaul E. McKenney 	struct rcu_node *rnp;
10739b9500daSPaul E. McKenney 
10749b9500daSPaul E. McKenney 	rdp = container_of(iwp, struct rcu_data, rcu_iw);
10759b9500daSPaul E. McKenney 	rnp = rdp->mynode;
10769b9500daSPaul E. McKenney 	raw_spin_lock_rcu_node(rnp);
10779b9500daSPaul E. McKenney 	if (!WARN_ON_ONCE(!rdp->rcu_iw_pending)) {
10788aa670cdSPaul E. McKenney 		rdp->rcu_iw_gp_seq = rnp->gp_seq;
10799b9500daSPaul E. McKenney 		rdp->rcu_iw_pending = false;
10809b9500daSPaul E. McKenney 	}
10819b9500daSPaul E. McKenney 	raw_spin_unlock_rcu_node(rnp);
10829b9500daSPaul E. McKenney }
10839b9500daSPaul E. McKenney 
10849b9500daSPaul E. McKenney /*
10854102adabSPaul E. McKenney  * Return true if the specified CPU has passed through a quiescent
10864102adabSPaul E. McKenney  * state by virtue of being in or having passed through an dynticks
10874102adabSPaul E. McKenney  * idle state since the last call to dyntick_save_progress_counter()
10884102adabSPaul E. McKenney  * for this same CPU, or by virtue of having been offline.
10894102adabSPaul E. McKenney  */
1090fe5ac724SPaul E. McKenney static int rcu_implicit_dynticks_qs(struct rcu_data *rdp)
10914102adabSPaul E. McKenney {
10923a19b46aSPaul E. McKenney 	unsigned long jtsq;
10930f9be8caSPaul E. McKenney 	bool *rnhqp;
10949226b10dSPaul E. McKenney 	bool *ruqp;
10959b9500daSPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;
10964102adabSPaul E. McKenney 
10974102adabSPaul E. McKenney 	/*
10984102adabSPaul E. McKenney 	 * If the CPU passed through or entered a dynticks idle phase with
10994102adabSPaul E. McKenney 	 * no active irq/NMI handlers, then we can safely pretend that the CPU
11004102adabSPaul E. McKenney 	 * already acknowledged the request to pass through a quiescent
11014102adabSPaul E. McKenney 	 * state.  Either way, that CPU cannot possibly be in an RCU
11024102adabSPaul E. McKenney 	 * read-side critical section that started before the beginning
11034102adabSPaul E. McKenney 	 * of the current RCU grace period.
11044102adabSPaul E. McKenney 	 */
110502a5c550SPaul E. McKenney 	if (rcu_dynticks_in_eqs_since(rdp->dynticks, rdp->dynticks_snap)) {
110688d1beadSPaul E. McKenney 		trace_rcu_fqs(rcu_state.name, rdp->gp_seq, rdp->cpu, TPS("dti"));
11074102adabSPaul E. McKenney 		rdp->dynticks_fqs++;
11089b9500daSPaul E. McKenney 		rcu_gpnum_ovf(rnp, rdp);
11094102adabSPaul E. McKenney 		return 1;
11104102adabSPaul E. McKenney 	}
11114102adabSPaul E. McKenney 
11124102adabSPaul E. McKenney 	/*
1113cee43939SPaul E. McKenney 	 * Has this CPU encountered a cond_resched() since the beginning
1114cee43939SPaul E. McKenney 	 * of the grace period?  For this to be the case, the CPU has to
1115cee43939SPaul E. McKenney 	 * have noticed the current grace period.  This might not be the
1116cee43939SPaul E. McKenney 	 * case for nohz_full CPUs looping in the kernel.
11174102adabSPaul E. McKenney 	 */
1118f79c3ad6SPaul E. McKenney 	jtsq = jiffies_till_sched_qs;
11199226b10dSPaul E. McKenney 	ruqp = per_cpu_ptr(&rcu_dynticks.rcu_urgent_qs, rdp->cpu);
112088d1beadSPaul E. McKenney 	if (time_after(jiffies, rcu_state.gp_start + jtsq) &&
11219577df9aSPaul E. McKenney 	    READ_ONCE(rdp->rcu_qs_ctr_snap) != per_cpu(rcu_dynticks.rcu_qs_ctr, rdp->cpu) &&
1122e05720b0SPaul E. McKenney 	    rcu_seq_current(&rdp->gp_seq) == rnp->gp_seq && !rdp->gpwrap) {
112388d1beadSPaul E. McKenney 		trace_rcu_fqs(rcu_state.name, rdp->gp_seq, rdp->cpu, TPS("rqc"));
11249b9500daSPaul E. McKenney 		rcu_gpnum_ovf(rnp, rdp);
11253a19b46aSPaul E. McKenney 		return 1;
112688d1beadSPaul E. McKenney 	} else if (time_after(jiffies, rcu_state.gp_start + jtsq)) {
11279226b10dSPaul E. McKenney 		/* Load rcu_qs_ctr before store to rcu_urgent_qs. */
11289226b10dSPaul E. McKenney 		smp_store_release(ruqp, true);
11293a19b46aSPaul E. McKenney 	}
11303a19b46aSPaul E. McKenney 
1131f2e2df59SPaul E. McKenney 	/* If waiting too long on an offline CPU, complain. */
1132f2e2df59SPaul E. McKenney 	if (!(rdp->grpmask & rcu_rnp_online_cpus(rnp)) &&
113388d1beadSPaul E. McKenney 	    time_after(jiffies, rcu_state.gp_start + HZ)) {
1134f2e2df59SPaul E. McKenney 		bool onl;
1135f2e2df59SPaul E. McKenney 		struct rcu_node *rnp1;
1136f2e2df59SPaul E. McKenney 
1137f2e2df59SPaul E. McKenney 		WARN_ON(1);  /* Offline CPUs are supposed to report QS! */
1138f2e2df59SPaul E. McKenney 		pr_info("%s: grp: %d-%d level: %d ->gp_seq %ld ->completedqs %ld\n",
1139f2e2df59SPaul E. McKenney 			__func__, rnp->grplo, rnp->grphi, rnp->level,
1140f2e2df59SPaul E. McKenney 			(long)rnp->gp_seq, (long)rnp->completedqs);
1141f2e2df59SPaul E. McKenney 		for (rnp1 = rnp; rnp1; rnp1 = rnp1->parent)
1142f2e2df59SPaul E. McKenney 			pr_info("%s: %d:%d ->qsmask %#lx ->qsmaskinit %#lx ->qsmaskinitnext %#lx ->rcu_gp_init_mask %#lx\n",
1143f2e2df59SPaul E. McKenney 				__func__, rnp1->grplo, rnp1->grphi, rnp1->qsmask, rnp1->qsmaskinit, rnp1->qsmaskinitnext, rnp1->rcu_gp_init_mask);
1144f2e2df59SPaul E. McKenney 		onl = !!(rdp->grpmask & rcu_rnp_online_cpus(rnp));
1145f2e2df59SPaul E. McKenney 		pr_info("%s %d: %c online: %ld(%d) offline: %ld(%d)\n",
1146f2e2df59SPaul E. McKenney 			__func__, rdp->cpu, ".o"[onl],
1147f2e2df59SPaul E. McKenney 			(long)rdp->rcu_onl_gp_seq, rdp->rcu_onl_gp_flags,
1148f2e2df59SPaul E. McKenney 			(long)rdp->rcu_ofl_gp_seq, rdp->rcu_ofl_gp_flags);
1149f2e2df59SPaul E. McKenney 		return 1; /* Break things loose after complaining. */
1150f2e2df59SPaul E. McKenney 	}
1151f2e2df59SPaul E. McKenney 
11524102adabSPaul E. McKenney 	/*
11534a81e832SPaul E. McKenney 	 * A CPU running for an extended time within the kernel can
11544a81e832SPaul E. McKenney 	 * delay RCU grace periods.  When the CPU is in NO_HZ_FULL mode,
11554a81e832SPaul E. McKenney 	 * even context-switching back and forth between a pair of
11564a81e832SPaul E. McKenney 	 * in-kernel CPU-bound tasks cannot advance grace periods.
11574a81e832SPaul E. McKenney 	 * So if the grace period is old enough, make the CPU pay attention.
11584a81e832SPaul E. McKenney 	 * Note that the unsynchronized assignments to the per-CPU
11590f9be8caSPaul E. McKenney 	 * rcu_need_heavy_qs variable are safe.  Yes, setting of
11604a81e832SPaul E. McKenney 	 * bits can be lost, but they will be set again on the next
11614a81e832SPaul E. McKenney 	 * force-quiescent-state pass.  So lost bit sets do not result
11624a81e832SPaul E. McKenney 	 * in incorrect behavior, merely in a grace period lasting
11634a81e832SPaul E. McKenney 	 * a few jiffies longer than it might otherwise.  Because
11644a81e832SPaul E. McKenney 	 * there are at most four threads involved, and because the
11654a81e832SPaul E. McKenney 	 * updates are only once every few jiffies, the probability of
11664a81e832SPaul E. McKenney 	 * lossage (and thus of slight grace-period extension) is
11674a81e832SPaul E. McKenney 	 * quite low.
11684102adabSPaul E. McKenney 	 */
11690f9be8caSPaul E. McKenney 	rnhqp = &per_cpu(rcu_dynticks.rcu_need_heavy_qs, rdp->cpu);
11700f9be8caSPaul E. McKenney 	if (!READ_ONCE(*rnhqp) &&
117188d1beadSPaul E. McKenney 	    (time_after(jiffies, rcu_state.gp_start + jtsq) ||
117288d1beadSPaul E. McKenney 	     time_after(jiffies, rcu_state.jiffies_resched))) {
11730f9be8caSPaul E. McKenney 		WRITE_ONCE(*rnhqp, true);
11749226b10dSPaul E. McKenney 		/* Store rcu_need_heavy_qs before rcu_urgent_qs. */
11759226b10dSPaul E. McKenney 		smp_store_release(ruqp, true);
117688d1beadSPaul E. McKenney 		rcu_state.jiffies_resched += jtsq; /* Re-enable beating. */
11774a81e832SPaul E. McKenney 	}
11784914950aSPaul E. McKenney 
117928053bc7SPaul E. McKenney 	/*
11809b9500daSPaul E. McKenney 	 * If more than halfway to RCU CPU stall-warning time, do a
11819b9500daSPaul E. McKenney 	 * resched_cpu() to try to loosen things up a bit.  Also check to
11829b9500daSPaul E. McKenney 	 * see if the CPU is getting hammered with interrupts, but only
11839b9500daSPaul E. McKenney 	 * once per grace period, just to keep the IPIs down to a dull roar.
118428053bc7SPaul E. McKenney 	 */
118588d1beadSPaul E. McKenney 	if (jiffies - rcu_state.gp_start > rcu_jiffies_till_stall_check() / 2) {
118628053bc7SPaul E. McKenney 		resched_cpu(rdp->cpu);
11879b9500daSPaul E. McKenney 		if (IS_ENABLED(CONFIG_IRQ_WORK) &&
11888aa670cdSPaul E. McKenney 		    !rdp->rcu_iw_pending && rdp->rcu_iw_gp_seq != rnp->gp_seq &&
11899b9500daSPaul E. McKenney 		    (rnp->ffmask & rdp->grpmask)) {
11909b9500daSPaul E. McKenney 			init_irq_work(&rdp->rcu_iw, rcu_iw_handler);
11919b9500daSPaul E. McKenney 			rdp->rcu_iw_pending = true;
11928aa670cdSPaul E. McKenney 			rdp->rcu_iw_gp_seq = rnp->gp_seq;
11939b9500daSPaul E. McKenney 			irq_work_queue_on(&rdp->rcu_iw, rdp->cpu);
11949b9500daSPaul E. McKenney 		}
11959b9500daSPaul E. McKenney 	}
11966193c76aSPaul E. McKenney 
11974102adabSPaul E. McKenney 	return 0;
11984102adabSPaul E. McKenney }
11994102adabSPaul E. McKenney 
1200ad3832e9SPaul E. McKenney static void record_gp_stall_check_time(void)
12014102adabSPaul E. McKenney {
1202cb1e78cfSPaul E. McKenney 	unsigned long j = jiffies;
12036193c76aSPaul E. McKenney 	unsigned long j1;
12044102adabSPaul E. McKenney 
1205ad3832e9SPaul E. McKenney 	rcu_state.gp_start = j;
12066193c76aSPaul E. McKenney 	j1 = rcu_jiffies_till_stall_check();
120791f63cedSPaul E. McKenney 	/* Record ->gp_start before ->jiffies_stall. */
1208ad3832e9SPaul E. McKenney 	smp_store_release(&rcu_state.jiffies_stall, j + j1); /* ^^^ */
1209ad3832e9SPaul E. McKenney 	rcu_state.jiffies_resched = j + j1 / 2;
1210ad3832e9SPaul E. McKenney 	rcu_state.n_force_qs_gpstart = READ_ONCE(rcu_state.n_force_qs);
12114102adabSPaul E. McKenney }
12124102adabSPaul E. McKenney 
12134102adabSPaul E. McKenney /*
12146b50e119SPaul E. McKenney  * Convert a ->gp_state value to a character string.
12156b50e119SPaul E. McKenney  */
12166b50e119SPaul E. McKenney static const char *gp_state_getname(short gs)
12176b50e119SPaul E. McKenney {
12186b50e119SPaul E. McKenney 	if (gs < 0 || gs >= ARRAY_SIZE(gp_state_names))
12196b50e119SPaul E. McKenney 		return "???";
12206b50e119SPaul E. McKenney 	return gp_state_names[gs];
12216b50e119SPaul E. McKenney }
12226b50e119SPaul E. McKenney 
12236b50e119SPaul E. McKenney /*
1224fb81a44bSPaul E. McKenney  * Complain about starvation of grace-period kthread.
1225fb81a44bSPaul E. McKenney  */
12268fd119b6SPaul E. McKenney static void rcu_check_gp_kthread_starvation(void)
1227fb81a44bSPaul E. McKenney {
12287cba4775SPaul E. McKenney 	struct task_struct *gpk = rcu_state.gp_kthread;
1229fb81a44bSPaul E. McKenney 	unsigned long j;
1230fb81a44bSPaul E. McKenney 
12317cba4775SPaul E. McKenney 	j = jiffies - READ_ONCE(rcu_state.gp_activity);
12327cba4775SPaul E. McKenney 	if (j > 2 * HZ) {
123378c5a67fSPaul E. McKenney 		pr_err("%s kthread starved for %ld jiffies! g%ld f%#x %s(%d) ->state=%#lx ->cpu=%d\n",
12347cba4775SPaul E. McKenney 		       rcu_state.name, j,
12357cba4775SPaul E. McKenney 		       (long)rcu_seq_current(&rcu_state.gp_seq),
12367cba4775SPaul E. McKenney 		       rcu_state.gp_flags,
12377cba4775SPaul E. McKenney 		       gp_state_getname(rcu_state.gp_state), rcu_state.gp_state,
12387cba4775SPaul E. McKenney 		       gpk ? gpk->state : ~0, gpk ? task_cpu(gpk) : -1);
12397cba4775SPaul E. McKenney 		if (gpk) {
1240d07aee2cSPaul E. McKenney 			pr_err("RCU grace-period kthread stack dump:\n");
12417cba4775SPaul E. McKenney 			sched_show_task(gpk);
12427cba4775SPaul E. McKenney 			wake_up_process(gpk);
124386057b80SPaul E. McKenney 		}
1244b1adb3e2SPaul E. McKenney 	}
12454102adabSPaul E. McKenney }
12464102adabSPaul E. McKenney 
12474102adabSPaul E. McKenney /*
12487aa92230SPaul E. McKenney  * Dump stacks of all tasks running on stalled CPUs.  First try using
12497aa92230SPaul E. McKenney  * NMIs, but fall back to manual remote stack tracing on architectures
12507aa92230SPaul E. McKenney  * that don't support NMI-based stack dumps.  The NMI-triggered stack
12517aa92230SPaul E. McKenney  * traces are more accurate because they are printed by the target CPU.
12524102adabSPaul E. McKenney  */
125333dbdbf0SPaul E. McKenney static void rcu_dump_cpu_stacks(void)
12544102adabSPaul E. McKenney {
12554102adabSPaul E. McKenney 	int cpu;
12564102adabSPaul E. McKenney 	unsigned long flags;
12574102adabSPaul E. McKenney 	struct rcu_node *rnp;
12584102adabSPaul E. McKenney 
1259aedf4ba9SPaul E. McKenney 	rcu_for_each_leaf_node(rnp) {
12606cf10081SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
1261bc75e999SMark Rutland 		for_each_leaf_node_possible_cpu(rnp, cpu)
1262bc75e999SMark Rutland 			if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu))
12637aa92230SPaul E. McKenney 				if (!trigger_single_cpu_backtrace(cpu))
1264bc75e999SMark Rutland 					dump_cpu_task(cpu);
126567c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
12664102adabSPaul E. McKenney 	}
12674102adabSPaul E. McKenney }
12684102adabSPaul E. McKenney 
12698c7c4829SPaul E. McKenney /*
12708c7c4829SPaul E. McKenney  * If too much time has passed in the current grace period, and if
12718c7c4829SPaul E. McKenney  * so configured, go kick the relevant kthreads.
12728c7c4829SPaul E. McKenney  */
1273e1741c69SPaul E. McKenney static void rcu_stall_kick_kthreads(void)
12748c7c4829SPaul E. McKenney {
12758c7c4829SPaul E. McKenney 	unsigned long j;
12768c7c4829SPaul E. McKenney 
12778c7c4829SPaul E. McKenney 	if (!rcu_kick_kthreads)
12788c7c4829SPaul E. McKenney 		return;
12794c6ed437SPaul E. McKenney 	j = READ_ONCE(rcu_state.jiffies_kick_kthreads);
12804c6ed437SPaul E. McKenney 	if (time_after(jiffies, j) && rcu_state.gp_kthread &&
12814c6ed437SPaul E. McKenney 	    (rcu_gp_in_progress() || READ_ONCE(rcu_state.gp_flags))) {
12824c6ed437SPaul E. McKenney 		WARN_ONCE(1, "Kicking %s grace-period kthread\n",
12834c6ed437SPaul E. McKenney 			  rcu_state.name);
12845dffed1eSPaul E. McKenney 		rcu_ftrace_dump(DUMP_ALL);
12854c6ed437SPaul E. McKenney 		wake_up_process(rcu_state.gp_kthread);
12864c6ed437SPaul E. McKenney 		WRITE_ONCE(rcu_state.jiffies_kick_kthreads, j + HZ);
12878c7c4829SPaul E. McKenney 	}
12888c7c4829SPaul E. McKenney }
12898c7c4829SPaul E. McKenney 
129095394e69SPaul E. McKenney static void panic_on_rcu_stall(void)
1291088e9d25SDaniel Bristot de Oliveira {
1292088e9d25SDaniel Bristot de Oliveira 	if (sysctl_panic_on_rcu_stall)
1293088e9d25SDaniel Bristot de Oliveira 		panic("RCU Stall\n");
1294088e9d25SDaniel Bristot de Oliveira }
1295088e9d25SDaniel Bristot de Oliveira 
1296a91e7e58SPaul E. McKenney static void print_other_cpu_stall(unsigned long gp_seq)
12974102adabSPaul E. McKenney {
12984102adabSPaul E. McKenney 	int cpu;
12994102adabSPaul E. McKenney 	unsigned long flags;
13006ccd2ecdSPaul E. McKenney 	unsigned long gpa;
13016ccd2ecdSPaul E. McKenney 	unsigned long j;
13024102adabSPaul E. McKenney 	int ndetected = 0;
1303336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
13044102adabSPaul E. McKenney 	long totqlen = 0;
13054102adabSPaul E. McKenney 
13068c7c4829SPaul E. McKenney 	/* Kick and suppress, if so configured. */
1307e1741c69SPaul E. McKenney 	rcu_stall_kick_kthreads();
13088c7c4829SPaul E. McKenney 	if (rcu_cpu_stall_suppress)
13098c7c4829SPaul E. McKenney 		return;
13108c7c4829SPaul E. McKenney 
13114102adabSPaul E. McKenney 	/*
13124102adabSPaul E. McKenney 	 * OK, time to rat on our buddy...
13134102adabSPaul E. McKenney 	 * See Documentation/RCU/stallwarn.txt for info on how to debug
13144102adabSPaul E. McKenney 	 * RCU CPU stall warnings.
13154102adabSPaul E. McKenney 	 */
13164c6ed437SPaul E. McKenney 	pr_err("INFO: %s detected stalls on CPUs/tasks:", rcu_state.name);
13174102adabSPaul E. McKenney 	print_cpu_stall_info_begin();
1318aedf4ba9SPaul E. McKenney 	rcu_for_each_leaf_node(rnp) {
13196cf10081SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
13204102adabSPaul E. McKenney 		ndetected += rcu_print_task_stall(rnp);
13214102adabSPaul E. McKenney 		if (rnp->qsmask != 0) {
1322bc75e999SMark Rutland 			for_each_leaf_node_possible_cpu(rnp, cpu)
1323bc75e999SMark Rutland 				if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu)) {
1324b21ebed9SPaul E. McKenney 					print_cpu_stall_info(cpu);
13254102adabSPaul E. McKenney 					ndetected++;
13264102adabSPaul E. McKenney 				}
13274102adabSPaul E. McKenney 		}
132867c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
13294102adabSPaul E. McKenney 	}
13304102adabSPaul E. McKenney 
13314102adabSPaul E. McKenney 	print_cpu_stall_info_end();
13324102adabSPaul E. McKenney 	for_each_possible_cpu(cpu)
1333da1df50dSPaul E. McKenney 		totqlen += rcu_segcblist_n_cbs(&per_cpu_ptr(&rcu_data,
133415fecf89SPaul E. McKenney 							    cpu)->cblist);
1335471f87c3SPaul E. McKenney 	pr_cont("(detected by %d, t=%ld jiffies, g=%ld, q=%lu)\n",
13364c6ed437SPaul E. McKenney 	       smp_processor_id(), (long)(jiffies - rcu_state.gp_start),
13374c6ed437SPaul E. McKenney 	       (long)rcu_seq_current(&rcu_state.gp_seq), totqlen);
13386ccd2ecdSPaul E. McKenney 	if (ndetected) {
133933dbdbf0SPaul E. McKenney 		rcu_dump_cpu_stacks();
1340c4402b27SByungchul Park 
1341c4402b27SByungchul Park 		/* Complain about tasks blocking the grace period. */
1342a2887cd8SPaul E. McKenney 		rcu_print_detail_task_stall();
13436ccd2ecdSPaul E. McKenney 	} else {
13444c6ed437SPaul E. McKenney 		if (rcu_seq_current(&rcu_state.gp_seq) != gp_seq) {
13456ccd2ecdSPaul E. McKenney 			pr_err("INFO: Stall ended before state dump start\n");
13466ccd2ecdSPaul E. McKenney 		} else {
13476ccd2ecdSPaul E. McKenney 			j = jiffies;
13484c6ed437SPaul E. McKenney 			gpa = READ_ONCE(rcu_state.gp_activity);
1349237a0f21SPaul E. McKenney 			pr_err("All QSes seen, last %s kthread activity %ld (%ld-%ld), jiffies_till_next_fqs=%ld, root ->qsmask %#lx\n",
13504c6ed437SPaul E. McKenney 			       rcu_state.name, j - gpa, j, gpa,
1351237a0f21SPaul E. McKenney 			       jiffies_till_next_fqs,
1352336a4f6cSPaul E. McKenney 			       rcu_get_root()->qsmask);
13536ccd2ecdSPaul E. McKenney 			/* In this case, the current CPU might be at fault. */
13546ccd2ecdSPaul E. McKenney 			sched_show_task(current);
13556ccd2ecdSPaul E. McKenney 		}
13566ccd2ecdSPaul E. McKenney 	}
13578c42b1f3SPaul E. McKenney 	/* Rewrite if needed in case of slow consoles. */
13584c6ed437SPaul E. McKenney 	if (ULONG_CMP_GE(jiffies, READ_ONCE(rcu_state.jiffies_stall)))
13594c6ed437SPaul E. McKenney 		WRITE_ONCE(rcu_state.jiffies_stall,
13608c42b1f3SPaul E. McKenney 			   jiffies + 3 * rcu_jiffies_till_stall_check() + 3);
13614102adabSPaul E. McKenney 
13628fd119b6SPaul E. McKenney 	rcu_check_gp_kthread_starvation();
1363fb81a44bSPaul E. McKenney 
1364088e9d25SDaniel Bristot de Oliveira 	panic_on_rcu_stall();
1365088e9d25SDaniel Bristot de Oliveira 
1366e9ecb780SPaul E. McKenney 	force_quiescent_state();  /* Kick them all. */
13674102adabSPaul E. McKenney }
13684102adabSPaul E. McKenney 
13694e8b8e08SPaul E. McKenney static void print_cpu_stall(void)
13704102adabSPaul E. McKenney {
13714102adabSPaul E. McKenney 	int cpu;
13724102adabSPaul E. McKenney 	unsigned long flags;
1373da1df50dSPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
1374336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
13754102adabSPaul E. McKenney 	long totqlen = 0;
13764102adabSPaul E. McKenney 
13778c7c4829SPaul E. McKenney 	/* Kick and suppress, if so configured. */
1378e1741c69SPaul E. McKenney 	rcu_stall_kick_kthreads();
13798c7c4829SPaul E. McKenney 	if (rcu_cpu_stall_suppress)
13808c7c4829SPaul E. McKenney 		return;
13818c7c4829SPaul E. McKenney 
13824102adabSPaul E. McKenney 	/*
13834102adabSPaul E. McKenney 	 * OK, time to rat on ourselves...
13844102adabSPaul E. McKenney 	 * See Documentation/RCU/stallwarn.txt for info on how to debug
13854102adabSPaul E. McKenney 	 * RCU CPU stall warnings.
13864102adabSPaul E. McKenney 	 */
13874c6ed437SPaul E. McKenney 	pr_err("INFO: %s self-detected stall on CPU", rcu_state.name);
13884102adabSPaul E. McKenney 	print_cpu_stall_info_begin();
13899b9500daSPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rdp->mynode, flags);
1390b21ebed9SPaul E. McKenney 	print_cpu_stall_info(smp_processor_id());
13919b9500daSPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rdp->mynode, flags);
13924102adabSPaul E. McKenney 	print_cpu_stall_info_end();
13934102adabSPaul E. McKenney 	for_each_possible_cpu(cpu)
1394da1df50dSPaul E. McKenney 		totqlen += rcu_segcblist_n_cbs(&per_cpu_ptr(&rcu_data,
139515fecf89SPaul E. McKenney 							    cpu)->cblist);
1396471f87c3SPaul E. McKenney 	pr_cont(" (t=%lu jiffies g=%ld q=%lu)\n",
13974c6ed437SPaul E. McKenney 		jiffies - rcu_state.gp_start,
13984c6ed437SPaul E. McKenney 		(long)rcu_seq_current(&rcu_state.gp_seq), totqlen);
1399fb81a44bSPaul E. McKenney 
14008fd119b6SPaul E. McKenney 	rcu_check_gp_kthread_starvation();
1401fb81a44bSPaul E. McKenney 
140233dbdbf0SPaul E. McKenney 	rcu_dump_cpu_stacks();
14034102adabSPaul E. McKenney 
14046cf10081SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
14058c42b1f3SPaul E. McKenney 	/* Rewrite if needed in case of slow consoles. */
14064c6ed437SPaul E. McKenney 	if (ULONG_CMP_GE(jiffies, READ_ONCE(rcu_state.jiffies_stall)))
14074c6ed437SPaul E. McKenney 		WRITE_ONCE(rcu_state.jiffies_stall,
14087d0ae808SPaul E. McKenney 			   jiffies + 3 * rcu_jiffies_till_stall_check() + 3);
140967c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
14104102adabSPaul E. McKenney 
1411088e9d25SDaniel Bristot de Oliveira 	panic_on_rcu_stall();
1412088e9d25SDaniel Bristot de Oliveira 
141339cf275aSLinus Torvalds 	/*
141439cf275aSLinus Torvalds 	 * Attempt to revive the RCU machinery by forcing a context switch.
141539cf275aSLinus Torvalds 	 *
141639cf275aSLinus Torvalds 	 * A context switch would normally allow the RCU state machine to make
141739cf275aSLinus Torvalds 	 * progress and it could be we're stuck in kernel space without context
141839cf275aSLinus Torvalds 	 * switches for an entirely unreasonable amount of time.
141939cf275aSLinus Torvalds 	 */
142039cf275aSLinus Torvalds 	resched_cpu(smp_processor_id());
14214102adabSPaul E. McKenney }
14224102adabSPaul E. McKenney 
1423ea12ff2bSPaul E. McKenney static void check_cpu_stall(struct rcu_data *rdp)
14244102adabSPaul E. McKenney {
1425471f87c3SPaul E. McKenney 	unsigned long gs1;
1426471f87c3SPaul E. McKenney 	unsigned long gs2;
14274102adabSPaul E. McKenney 	unsigned long gps;
14284102adabSPaul E. McKenney 	unsigned long j;
14298c42b1f3SPaul E. McKenney 	unsigned long jn;
14304102adabSPaul E. McKenney 	unsigned long js;
14314102adabSPaul E. McKenney 	struct rcu_node *rnp;
14324102adabSPaul E. McKenney 
14338c7c4829SPaul E. McKenney 	if ((rcu_cpu_stall_suppress && !rcu_kick_kthreads) ||
1434de8e8730SPaul E. McKenney 	    !rcu_gp_in_progress())
14354102adabSPaul E. McKenney 		return;
1436e1741c69SPaul E. McKenney 	rcu_stall_kick_kthreads();
1437cb1e78cfSPaul E. McKenney 	j = jiffies;
14384102adabSPaul E. McKenney 
14394102adabSPaul E. McKenney 	/*
14404102adabSPaul E. McKenney 	 * Lots of memory barriers to reject false positives.
14414102adabSPaul E. McKenney 	 *
14424c6ed437SPaul E. McKenney 	 * The idea is to pick up rcu_state.gp_seq, then
14434c6ed437SPaul E. McKenney 	 * rcu_state.jiffies_stall, then rcu_state.gp_start, and finally
14444c6ed437SPaul E. McKenney 	 * another copy of rcu_state.gp_seq.  These values are updated in
14454c6ed437SPaul E. McKenney 	 * the opposite order with memory barriers (or equivalent) during
14464c6ed437SPaul E. McKenney 	 * grace-period initialization and cleanup.  Now, a false positive
14474c6ed437SPaul E. McKenney 	 * can occur if we get an new value of rcu_state.gp_start and a old
14484c6ed437SPaul E. McKenney 	 * value of rcu_state.jiffies_stall.  But given the memory barriers,
14494c6ed437SPaul E. McKenney 	 * the only way that this can happen is if one grace period ends
14504c6ed437SPaul E. McKenney 	 * and another starts between these two fetches.  This is detected
14514c6ed437SPaul E. McKenney 	 * by comparing the second fetch of rcu_state.gp_seq with the
14524c6ed437SPaul E. McKenney 	 * previous fetch from rcu_state.gp_seq.
14534102adabSPaul E. McKenney 	 *
14544c6ed437SPaul E. McKenney 	 * Given this check, comparisons of jiffies, rcu_state.jiffies_stall,
14554c6ed437SPaul E. McKenney 	 * and rcu_state.gp_start suffice to forestall false positives.
14564102adabSPaul E. McKenney 	 */
14574c6ed437SPaul E. McKenney 	gs1 = READ_ONCE(rcu_state.gp_seq);
1458471f87c3SPaul E. McKenney 	smp_rmb(); /* Pick up ->gp_seq first... */
14594c6ed437SPaul E. McKenney 	js = READ_ONCE(rcu_state.jiffies_stall);
14604102adabSPaul E. McKenney 	smp_rmb(); /* ...then ->jiffies_stall before the rest... */
14614c6ed437SPaul E. McKenney 	gps = READ_ONCE(rcu_state.gp_start);
1462471f87c3SPaul E. McKenney 	smp_rmb(); /* ...and finally ->gp_start before ->gp_seq again. */
14634c6ed437SPaul E. McKenney 	gs2 = READ_ONCE(rcu_state.gp_seq);
1464471f87c3SPaul E. McKenney 	if (gs1 != gs2 ||
14654102adabSPaul E. McKenney 	    ULONG_CMP_LT(j, js) ||
14664102adabSPaul E. McKenney 	    ULONG_CMP_GE(gps, js))
14674102adabSPaul E. McKenney 		return; /* No stall or GP completed since entering function. */
14684102adabSPaul E. McKenney 	rnp = rdp->mynode;
14698c42b1f3SPaul E. McKenney 	jn = jiffies + 3 * rcu_jiffies_till_stall_check() + 3;
1470de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress() &&
14718c42b1f3SPaul E. McKenney 	    (READ_ONCE(rnp->qsmask) & rdp->grpmask) &&
14724c6ed437SPaul E. McKenney 	    cmpxchg(&rcu_state.jiffies_stall, js, jn) == js) {
14734102adabSPaul E. McKenney 
14744102adabSPaul E. McKenney 		/* We haven't checked in, so go dump stack. */
14754e8b8e08SPaul E. McKenney 		print_cpu_stall();
14764102adabSPaul E. McKenney 
1477de8e8730SPaul E. McKenney 	} else if (rcu_gp_in_progress() &&
14788c42b1f3SPaul E. McKenney 		   ULONG_CMP_GE(j, js + RCU_STALL_RAT_DELAY) &&
14794c6ed437SPaul E. McKenney 		   cmpxchg(&rcu_state.jiffies_stall, js, jn) == js) {
14804102adabSPaul E. McKenney 
14814102adabSPaul E. McKenney 		/* They had a few time units to dump stack, so complain. */
1482a91e7e58SPaul E. McKenney 		print_other_cpu_stall(gs2);
14834102adabSPaul E. McKenney 	}
14844102adabSPaul E. McKenney }
14854102adabSPaul E. McKenney 
14864102adabSPaul E. McKenney /**
14874102adabSPaul E. McKenney  * rcu_cpu_stall_reset - prevent further stall warnings in current grace period
14884102adabSPaul E. McKenney  *
14894102adabSPaul E. McKenney  * Set the stall-warning timeout way off into the future, thus preventing
14904102adabSPaul E. McKenney  * any RCU CPU stall-warning messages from appearing in the current set of
14914102adabSPaul E. McKenney  * RCU grace periods.
14924102adabSPaul E. McKenney  *
14934102adabSPaul E. McKenney  * The caller must disable hard irqs.
14944102adabSPaul E. McKenney  */
14954102adabSPaul E. McKenney void rcu_cpu_stall_reset(void)
14964102adabSPaul E. McKenney {
1497b97d23c5SPaul E. McKenney 	WRITE_ONCE(rcu_state.jiffies_stall, jiffies + ULONG_MAX / 2);
14984102adabSPaul E. McKenney }
14994102adabSPaul E. McKenney 
150041e80595SPaul E. McKenney /* Trace-event wrapper function for trace_rcu_future_grace_period.  */
150141e80595SPaul E. McKenney static void trace_rcu_this_gp(struct rcu_node *rnp, struct rcu_data *rdp,
1502b73de91dSJoel Fernandes 			      unsigned long gp_seq_req, const char *s)
15034102adabSPaul E. McKenney {
150488d1beadSPaul E. McKenney 	trace_rcu_future_grace_period(rcu_state.name, rnp->gp_seq, gp_seq_req,
1505abd13fddSPaul E. McKenney 				      rnp->level, rnp->grplo, rnp->grphi, s);
15064102adabSPaul E. McKenney }
15074102adabSPaul E. McKenney 
15084102adabSPaul E. McKenney /*
1509b73de91dSJoel Fernandes  * rcu_start_this_gp - Request the start of a particular grace period
1510df2bf8f7SJoel Fernandes (Google)  * @rnp_start: The leaf node of the CPU from which to start.
1511b73de91dSJoel Fernandes  * @rdp: The rcu_data corresponding to the CPU from which to start.
1512b73de91dSJoel Fernandes  * @gp_seq_req: The gp_seq of the grace period to start.
1513b73de91dSJoel Fernandes  *
151441e80595SPaul E. McKenney  * Start the specified grace period, as needed to handle newly arrived
15154102adabSPaul E. McKenney  * callbacks.  The required future grace periods are recorded in each
15167a1d0f23SPaul E. McKenney  * rcu_node structure's ->gp_seq_needed field.  Returns true if there
151748a7639cSPaul E. McKenney  * is reason to awaken the grace-period kthread.
15184102adabSPaul E. McKenney  *
1519d5cd9685SPaul E. McKenney  * The caller must hold the specified rcu_node structure's ->lock, which
1520d5cd9685SPaul E. McKenney  * is why the caller is responsible for waking the grace-period kthread.
1521b73de91dSJoel Fernandes  *
1522b73de91dSJoel Fernandes  * Returns true if the GP thread needs to be awakened else false.
15234102adabSPaul E. McKenney  */
1524df2bf8f7SJoel Fernandes (Google) static bool rcu_start_this_gp(struct rcu_node *rnp_start, struct rcu_data *rdp,
1525b73de91dSJoel Fernandes 			      unsigned long gp_seq_req)
15264102adabSPaul E. McKenney {
152748a7639cSPaul E. McKenney 	bool ret = false;
1528df2bf8f7SJoel Fernandes (Google) 	struct rcu_node *rnp;
15294102adabSPaul E. McKenney 
1530360e0da6SPaul E. McKenney 	/*
1531360e0da6SPaul E. McKenney 	 * Use funnel locking to either acquire the root rcu_node
1532360e0da6SPaul E. McKenney 	 * structure's lock or bail out if the need for this grace period
1533df2bf8f7SJoel Fernandes (Google) 	 * has already been recorded -- or if that grace period has in
1534df2bf8f7SJoel Fernandes (Google) 	 * fact already started.  If there is already a grace period in
1535df2bf8f7SJoel Fernandes (Google) 	 * progress in a non-leaf node, no recording is needed because the
1536df2bf8f7SJoel Fernandes (Google) 	 * end of the grace period will scan the leaf rcu_node structures.
1537df2bf8f7SJoel Fernandes (Google) 	 * Note that rnp_start->lock must not be released.
1538360e0da6SPaul E. McKenney 	 */
1539df2bf8f7SJoel Fernandes (Google) 	raw_lockdep_assert_held_rcu_node(rnp_start);
1540df2bf8f7SJoel Fernandes (Google) 	trace_rcu_this_gp(rnp_start, rdp, gp_seq_req, TPS("Startleaf"));
1541df2bf8f7SJoel Fernandes (Google) 	for (rnp = rnp_start; 1; rnp = rnp->parent) {
1542df2bf8f7SJoel Fernandes (Google) 		if (rnp != rnp_start)
1543df2bf8f7SJoel Fernandes (Google) 			raw_spin_lock_rcu_node(rnp);
1544df2bf8f7SJoel Fernandes (Google) 		if (ULONG_CMP_GE(rnp->gp_seq_needed, gp_seq_req) ||
1545df2bf8f7SJoel Fernandes (Google) 		    rcu_seq_started(&rnp->gp_seq, gp_seq_req) ||
1546df2bf8f7SJoel Fernandes (Google) 		    (rnp != rnp_start &&
1547df2bf8f7SJoel Fernandes (Google) 		     rcu_seq_state(rcu_seq_current(&rnp->gp_seq)))) {
1548df2bf8f7SJoel Fernandes (Google) 			trace_rcu_this_gp(rnp, rdp, gp_seq_req,
1549b73de91dSJoel Fernandes 					  TPS("Prestarted"));
15504102adabSPaul E. McKenney 			goto unlock_out;
15514102adabSPaul E. McKenney 		}
1552df2bf8f7SJoel Fernandes (Google) 		rnp->gp_seq_needed = gp_seq_req;
1553226ca5e7SJoel Fernandes (Google) 		if (rcu_seq_state(rcu_seq_current(&rnp->gp_seq))) {
1554a2165e41SPaul E. McKenney 			/*
1555226ca5e7SJoel Fernandes (Google) 			 * We just marked the leaf or internal node, and a
1556226ca5e7SJoel Fernandes (Google) 			 * grace period is in progress, which means that
1557226ca5e7SJoel Fernandes (Google) 			 * rcu_gp_cleanup() will see the marking.  Bail to
1558226ca5e7SJoel Fernandes (Google) 			 * reduce contention.
1559a2165e41SPaul E. McKenney 			 */
1560df2bf8f7SJoel Fernandes (Google) 			trace_rcu_this_gp(rnp_start, rdp, gp_seq_req,
1561b73de91dSJoel Fernandes 					  TPS("Startedleaf"));
1562a2165e41SPaul E. McKenney 			goto unlock_out;
1563a2165e41SPaul E. McKenney 		}
1564df2bf8f7SJoel Fernandes (Google) 		if (rnp != rnp_start && rnp->parent != NULL)
1565df2bf8f7SJoel Fernandes (Google) 			raw_spin_unlock_rcu_node(rnp);
1566df2bf8f7SJoel Fernandes (Google) 		if (!rnp->parent)
1567360e0da6SPaul E. McKenney 			break;  /* At root, and perhaps also leaf. */
15684102adabSPaul E. McKenney 	}
1569360e0da6SPaul E. McKenney 
1570360e0da6SPaul E. McKenney 	/* If GP already in progress, just leave, otherwise start one. */
1571de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress()) {
1572df2bf8f7SJoel Fernandes (Google) 		trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedleafroot"));
1573360e0da6SPaul E. McKenney 		goto unlock_out;
1574360e0da6SPaul E. McKenney 	}
1575df2bf8f7SJoel Fernandes (Google) 	trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedroot"));
15769cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_flags, rcu_state.gp_flags | RCU_GP_FLAG_INIT);
15779cbc5b97SPaul E. McKenney 	rcu_state.gp_req_activity = jiffies;
15789cbc5b97SPaul E. McKenney 	if (!rcu_state.gp_kthread) {
1579df2bf8f7SJoel Fernandes (Google) 		trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("NoGPkthread"));
1580360e0da6SPaul E. McKenney 		goto unlock_out;
1581360e0da6SPaul E. McKenney 	}
15829cbc5b97SPaul E. McKenney 	trace_rcu_grace_period(rcu_state.name, READ_ONCE(rcu_state.gp_seq), TPS("newreq"));
1583360e0da6SPaul E. McKenney 	ret = true;  /* Caller must wake GP kthread. */
15844102adabSPaul E. McKenney unlock_out:
1585ab5e869cSPaul E. McKenney 	/* Push furthest requested GP to leaf node and rcu_data structure. */
1586df2bf8f7SJoel Fernandes (Google) 	if (ULONG_CMP_LT(gp_seq_req, rnp->gp_seq_needed)) {
1587df2bf8f7SJoel Fernandes (Google) 		rnp_start->gp_seq_needed = rnp->gp_seq_needed;
1588df2bf8f7SJoel Fernandes (Google) 		rdp->gp_seq_needed = rnp->gp_seq_needed;
1589ab5e869cSPaul E. McKenney 	}
1590df2bf8f7SJoel Fernandes (Google) 	if (rnp != rnp_start)
1591df2bf8f7SJoel Fernandes (Google) 		raw_spin_unlock_rcu_node(rnp);
159248a7639cSPaul E. McKenney 	return ret;
15934102adabSPaul E. McKenney }
15944102adabSPaul E. McKenney 
15954102adabSPaul E. McKenney /*
15964102adabSPaul E. McKenney  * Clean up any old requests for the just-ended grace period.  Also return
1597d1e4f01dSPaul E. McKenney  * whether any additional grace periods have been requested.
15984102adabSPaul E. McKenney  */
15993481f2eaSPaul E. McKenney static bool rcu_future_gp_cleanup(struct rcu_node *rnp)
16004102adabSPaul E. McKenney {
1601fb31340fSPaul E. McKenney 	bool needmore;
1602da1df50dSPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
16034102adabSPaul E. McKenney 
16047a1d0f23SPaul E. McKenney 	needmore = ULONG_CMP_LT(rnp->gp_seq, rnp->gp_seq_needed);
16057a1d0f23SPaul E. McKenney 	if (!needmore)
16067a1d0f23SPaul E. McKenney 		rnp->gp_seq_needed = rnp->gp_seq; /* Avoid counter wrap. */
1607b73de91dSJoel Fernandes 	trace_rcu_this_gp(rnp, rdp, rnp->gp_seq,
16084102adabSPaul E. McKenney 			  needmore ? TPS("CleanupMore") : TPS("Cleanup"));
16094102adabSPaul E. McKenney 	return needmore;
16104102adabSPaul E. McKenney }
16114102adabSPaul E. McKenney 
16124102adabSPaul E. McKenney /*
161348a7639cSPaul E. McKenney  * Awaken the grace-period kthread for the specified flavor of RCU.
161448a7639cSPaul E. McKenney  * Don't do a self-awaken, and don't bother awakening when there is
161548a7639cSPaul E. McKenney  * nothing for the grace-period kthread to do (as in several CPUs
161648a7639cSPaul E. McKenney  * raced to awaken, and we lost), and finally don't try to awaken
161748a7639cSPaul E. McKenney  * a kthread that has not yet been created.
161848a7639cSPaul E. McKenney  */
1619532c00c9SPaul E. McKenney static void rcu_gp_kthread_wake(void)
162048a7639cSPaul E. McKenney {
1621532c00c9SPaul E. McKenney 	if (current == rcu_state.gp_kthread ||
1622532c00c9SPaul E. McKenney 	    !READ_ONCE(rcu_state.gp_flags) ||
1623532c00c9SPaul E. McKenney 	    !rcu_state.gp_kthread)
162448a7639cSPaul E. McKenney 		return;
1625532c00c9SPaul E. McKenney 	swake_up_one(&rcu_state.gp_wq);
162648a7639cSPaul E. McKenney }
162748a7639cSPaul E. McKenney 
162848a7639cSPaul E. McKenney /*
162929365e56SPaul E. McKenney  * If there is room, assign a ->gp_seq number to any callbacks on this
163029365e56SPaul E. McKenney  * CPU that have not already been assigned.  Also accelerate any callbacks
163129365e56SPaul E. McKenney  * that were previously assigned a ->gp_seq number that has since proven
163229365e56SPaul E. McKenney  * to be too conservative, which can happen if callbacks get assigned a
163329365e56SPaul E. McKenney  * ->gp_seq number while RCU is idle, but with reference to a non-root
163429365e56SPaul E. McKenney  * rcu_node structure.  This function is idempotent, so it does not hurt
163529365e56SPaul E. McKenney  * to call it repeatedly.  Returns an flag saying that we should awaken
163629365e56SPaul E. McKenney  * the RCU grace-period kthread.
16374102adabSPaul E. McKenney  *
16384102adabSPaul E. McKenney  * The caller must hold rnp->lock with interrupts disabled.
16394102adabSPaul E. McKenney  */
164002f50142SPaul E. McKenney static bool rcu_accelerate_cbs(struct rcu_node *rnp, struct rcu_data *rdp)
16414102adabSPaul E. McKenney {
1642b73de91dSJoel Fernandes 	unsigned long gp_seq_req;
164315fecf89SPaul E. McKenney 	bool ret = false;
16444102adabSPaul E. McKenney 
1645a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1646c0b334c5SPaul E. McKenney 
164715fecf89SPaul E. McKenney 	/* If no pending (not yet ready to invoke) callbacks, nothing to do. */
164815fecf89SPaul E. McKenney 	if (!rcu_segcblist_pend_cbs(&rdp->cblist))
164948a7639cSPaul E. McKenney 		return false;
16504102adabSPaul E. McKenney 
16514102adabSPaul E. McKenney 	/*
165215fecf89SPaul E. McKenney 	 * Callbacks are often registered with incomplete grace-period
165315fecf89SPaul E. McKenney 	 * information.  Something about the fact that getting exact
165415fecf89SPaul E. McKenney 	 * information requires acquiring a global lock...  RCU therefore
165515fecf89SPaul E. McKenney 	 * makes a conservative estimate of the grace period number at which
165615fecf89SPaul E. McKenney 	 * a given callback will become ready to invoke.	The following
165715fecf89SPaul E. McKenney 	 * code checks this estimate and improves it when possible, thus
165815fecf89SPaul E. McKenney 	 * accelerating callback invocation to an earlier grace-period
165915fecf89SPaul E. McKenney 	 * number.
16604102adabSPaul E. McKenney 	 */
16619cbc5b97SPaul E. McKenney 	gp_seq_req = rcu_seq_snap(&rcu_state.gp_seq);
1662b73de91dSJoel Fernandes 	if (rcu_segcblist_accelerate(&rdp->cblist, gp_seq_req))
1663b73de91dSJoel Fernandes 		ret = rcu_start_this_gp(rnp, rdp, gp_seq_req);
16644102adabSPaul E. McKenney 
16654102adabSPaul E. McKenney 	/* Trace depending on how much we were able to accelerate. */
166615fecf89SPaul E. McKenney 	if (rcu_segcblist_restempty(&rdp->cblist, RCU_WAIT_TAIL))
16679cbc5b97SPaul E. McKenney 		trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("AccWaitCB"));
16684102adabSPaul E. McKenney 	else
16699cbc5b97SPaul E. McKenney 		trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("AccReadyCB"));
167048a7639cSPaul E. McKenney 	return ret;
16714102adabSPaul E. McKenney }
16724102adabSPaul E. McKenney 
16734102adabSPaul E. McKenney /*
1674e44e73caSPaul E. McKenney  * Similar to rcu_accelerate_cbs(), but does not require that the leaf
1675e44e73caSPaul E. McKenney  * rcu_node structure's ->lock be held.  It consults the cached value
1676e44e73caSPaul E. McKenney  * of ->gp_seq_needed in the rcu_data structure, and if that indicates
1677e44e73caSPaul E. McKenney  * that a new grace-period request be made, invokes rcu_accelerate_cbs()
1678e44e73caSPaul E. McKenney  * while holding the leaf rcu_node structure's ->lock.
1679e44e73caSPaul E. McKenney  */
1680c6e09b97SPaul E. McKenney static void rcu_accelerate_cbs_unlocked(struct rcu_node *rnp,
1681e44e73caSPaul E. McKenney 					struct rcu_data *rdp)
1682e44e73caSPaul E. McKenney {
1683e44e73caSPaul E. McKenney 	unsigned long c;
1684e44e73caSPaul E. McKenney 	bool needwake;
1685e44e73caSPaul E. McKenney 
1686e44e73caSPaul E. McKenney 	lockdep_assert_irqs_disabled();
1687c6e09b97SPaul E. McKenney 	c = rcu_seq_snap(&rcu_state.gp_seq);
1688e44e73caSPaul E. McKenney 	if (!rdp->gpwrap && ULONG_CMP_GE(rdp->gp_seq_needed, c)) {
1689e44e73caSPaul E. McKenney 		/* Old request still live, so mark recent callbacks. */
1690e44e73caSPaul E. McKenney 		(void)rcu_segcblist_accelerate(&rdp->cblist, c);
1691e44e73caSPaul E. McKenney 		return;
1692e44e73caSPaul E. McKenney 	}
1693e44e73caSPaul E. McKenney 	raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
169402f50142SPaul E. McKenney 	needwake = rcu_accelerate_cbs(rnp, rdp);
1695e44e73caSPaul E. McKenney 	raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */
1696e44e73caSPaul E. McKenney 	if (needwake)
1697532c00c9SPaul E. McKenney 		rcu_gp_kthread_wake();
1698e44e73caSPaul E. McKenney }
1699e44e73caSPaul E. McKenney 
1700e44e73caSPaul E. McKenney /*
17014102adabSPaul E. McKenney  * Move any callbacks whose grace period has completed to the
17024102adabSPaul E. McKenney  * RCU_DONE_TAIL sublist, then compact the remaining sublists and
170329365e56SPaul E. McKenney  * assign ->gp_seq numbers to any callbacks in the RCU_NEXT_TAIL
17044102adabSPaul E. McKenney  * sublist.  This function is idempotent, so it does not hurt to
17054102adabSPaul E. McKenney  * invoke it repeatedly.  As long as it is not invoked -too- often...
170648a7639cSPaul E. McKenney  * Returns true if the RCU grace-period kthread needs to be awakened.
17074102adabSPaul E. McKenney  *
17084102adabSPaul E. McKenney  * The caller must hold rnp->lock with interrupts disabled.
17094102adabSPaul E. McKenney  */
1710834f56bfSPaul E. McKenney static bool rcu_advance_cbs(struct rcu_node *rnp, struct rcu_data *rdp)
17114102adabSPaul E. McKenney {
1712a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1713c0b334c5SPaul E. McKenney 
171415fecf89SPaul E. McKenney 	/* If no pending (not yet ready to invoke) callbacks, nothing to do. */
171515fecf89SPaul E. McKenney 	if (!rcu_segcblist_pend_cbs(&rdp->cblist))
171648a7639cSPaul E. McKenney 		return false;
17174102adabSPaul E. McKenney 
17184102adabSPaul E. McKenney 	/*
171929365e56SPaul E. McKenney 	 * Find all callbacks whose ->gp_seq numbers indicate that they
17204102adabSPaul E. McKenney 	 * are ready to invoke, and put them into the RCU_DONE_TAIL sublist.
17214102adabSPaul E. McKenney 	 */
172229365e56SPaul E. McKenney 	rcu_segcblist_advance(&rdp->cblist, rnp->gp_seq);
17234102adabSPaul E. McKenney 
17244102adabSPaul E. McKenney 	/* Classify any remaining callbacks. */
172502f50142SPaul E. McKenney 	return rcu_accelerate_cbs(rnp, rdp);
17264102adabSPaul E. McKenney }
17274102adabSPaul E. McKenney 
17284102adabSPaul E. McKenney /*
17294102adabSPaul E. McKenney  * Update CPU-local rcu_data state to record the beginnings and ends of
17304102adabSPaul E. McKenney  * grace periods.  The caller must hold the ->lock of the leaf rcu_node
17314102adabSPaul E. McKenney  * structure corresponding to the current CPU, and must have irqs disabled.
173248a7639cSPaul E. McKenney  * Returns true if the grace-period kthread needs to be awakened.
17334102adabSPaul E. McKenney  */
1734c7e48f7bSPaul E. McKenney static bool __note_gp_changes(struct rcu_node *rnp, struct rcu_data *rdp)
17354102adabSPaul E. McKenney {
173648a7639cSPaul E. McKenney 	bool ret;
17373563a438SPaul E. McKenney 	bool need_gp;
173848a7639cSPaul E. McKenney 
1739a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1740c0b334c5SPaul E. McKenney 
174167e14c1eSPaul E. McKenney 	if (rdp->gp_seq == rnp->gp_seq)
174267e14c1eSPaul E. McKenney 		return false; /* Nothing to do. */
174367e14c1eSPaul E. McKenney 
17444102adabSPaul E. McKenney 	/* Handle the ends of any preceding grace periods first. */
174567e14c1eSPaul E. McKenney 	if (rcu_seq_completed_gp(rdp->gp_seq, rnp->gp_seq) ||
174667e14c1eSPaul E. McKenney 	    unlikely(READ_ONCE(rdp->gpwrap))) {
1747834f56bfSPaul E. McKenney 		ret = rcu_advance_cbs(rnp, rdp); /* Advance callbacks. */
17489cbc5b97SPaul E. McKenney 		trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("cpuend"));
174967e14c1eSPaul E. McKenney 	} else {
175002f50142SPaul E. McKenney 		ret = rcu_accelerate_cbs(rnp, rdp); /* Recent callbacks. */
17514102adabSPaul E. McKenney 	}
17524102adabSPaul E. McKenney 
175367e14c1eSPaul E. McKenney 	/* Now handle the beginnings of any new-to-this-CPU grace periods. */
175467e14c1eSPaul E. McKenney 	if (rcu_seq_new_gp(rdp->gp_seq, rnp->gp_seq) ||
175567e14c1eSPaul E. McKenney 	    unlikely(READ_ONCE(rdp->gpwrap))) {
17564102adabSPaul E. McKenney 		/*
17574102adabSPaul E. McKenney 		 * If the current grace period is waiting for this CPU,
17584102adabSPaul E. McKenney 		 * set up to detect a quiescent state, otherwise don't
17594102adabSPaul E. McKenney 		 * go looking for one.
17604102adabSPaul E. McKenney 		 */
17619cbc5b97SPaul E. McKenney 		trace_rcu_grace_period(rcu_state.name, rnp->gp_seq, TPS("cpustart"));
17623563a438SPaul E. McKenney 		need_gp = !!(rnp->qsmask & rdp->grpmask);
17633563a438SPaul E. McKenney 		rdp->cpu_no_qs.b.norm = need_gp;
17649577df9aSPaul E. McKenney 		rdp->rcu_qs_ctr_snap = __this_cpu_read(rcu_dynticks.rcu_qs_ctr);
17653563a438SPaul E. McKenney 		rdp->core_needs_qs = need_gp;
17664102adabSPaul E. McKenney 		zero_cpu_stall_ticks(rdp);
17674102adabSPaul E. McKenney 	}
176867e14c1eSPaul E. McKenney 	rdp->gp_seq = rnp->gp_seq;  /* Remember new grace-period state. */
17693d18469aSPaul E. McKenney 	if (ULONG_CMP_GE(rnp->gp_seq_needed, rdp->gp_seq_needed) || rdp->gpwrap)
17703d18469aSPaul E. McKenney 		rdp->gp_seq_needed = rnp->gp_seq_needed;
17713d18469aSPaul E. McKenney 	WRITE_ONCE(rdp->gpwrap, false);
17723d18469aSPaul E. McKenney 	rcu_gpnum_ovf(rnp, rdp);
177348a7639cSPaul E. McKenney 	return ret;
17744102adabSPaul E. McKenney }
17754102adabSPaul E. McKenney 
177615cabdffSPaul E. McKenney static void note_gp_changes(struct rcu_data *rdp)
17774102adabSPaul E. McKenney {
17784102adabSPaul E. McKenney 	unsigned long flags;
177948a7639cSPaul E. McKenney 	bool needwake;
17804102adabSPaul E. McKenney 	struct rcu_node *rnp;
17814102adabSPaul E. McKenney 
17824102adabSPaul E. McKenney 	local_irq_save(flags);
17834102adabSPaul E. McKenney 	rnp = rdp->mynode;
178467e14c1eSPaul E. McKenney 	if ((rdp->gp_seq == rcu_seq_current(&rnp->gp_seq) &&
17857d0ae808SPaul E. McKenney 	     !unlikely(READ_ONCE(rdp->gpwrap))) || /* w/out lock. */
17862a67e741SPeter Zijlstra 	    !raw_spin_trylock_rcu_node(rnp)) { /* irqs already off, so later. */
17874102adabSPaul E. McKenney 		local_irq_restore(flags);
17884102adabSPaul E. McKenney 		return;
17894102adabSPaul E. McKenney 	}
1790c7e48f7bSPaul E. McKenney 	needwake = __note_gp_changes(rnp, rdp);
179167c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
179248a7639cSPaul E. McKenney 	if (needwake)
1793532c00c9SPaul E. McKenney 		rcu_gp_kthread_wake();
17944102adabSPaul E. McKenney }
17954102adabSPaul E. McKenney 
179622212332SPaul E. McKenney static void rcu_gp_slow(int delay)
17970f41c0ddSPaul E. McKenney {
17980f41c0ddSPaul E. McKenney 	if (delay > 0 &&
179922212332SPaul E. McKenney 	    !(rcu_seq_ctr(rcu_state.gp_seq) %
1800dee4f422SPaul E. McKenney 	      (rcu_num_nodes * PER_RCU_NODE_PERIOD * delay)))
18010f41c0ddSPaul E. McKenney 		schedule_timeout_uninterruptible(delay);
18020f41c0ddSPaul E. McKenney }
18030f41c0ddSPaul E. McKenney 
18044102adabSPaul E. McKenney /*
180545fed3e7SPaul E. McKenney  * Initialize a new grace period.  Return false if no grace period required.
18064102adabSPaul E. McKenney  */
18070854a05cSPaul E. McKenney static bool rcu_gp_init(void)
18084102adabSPaul E. McKenney {
1809ec2c2976SPaul E. McKenney 	unsigned long flags;
18100aa04b05SPaul E. McKenney 	unsigned long oldmask;
1811ec2c2976SPaul E. McKenney 	unsigned long mask;
18124102adabSPaul E. McKenney 	struct rcu_data *rdp;
1813336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
18144102adabSPaul E. McKenney 
18159cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_activity, jiffies);
18162a67e741SPeter Zijlstra 	raw_spin_lock_irq_rcu_node(rnp);
18179cbc5b97SPaul E. McKenney 	if (!READ_ONCE(rcu_state.gp_flags)) {
18184102adabSPaul E. McKenney 		/* Spurious wakeup, tell caller to go back to sleep.  */
181967c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
182045fed3e7SPaul E. McKenney 		return false;
18214102adabSPaul E. McKenney 	}
18229cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_flags, 0); /* Clear all flags: New GP. */
18234102adabSPaul E. McKenney 
1824de8e8730SPaul E. McKenney 	if (WARN_ON_ONCE(rcu_gp_in_progress())) {
18254102adabSPaul E. McKenney 		/*
18264102adabSPaul E. McKenney 		 * Grace period already in progress, don't start another.
18274102adabSPaul E. McKenney 		 * Not supposed to be able to happen.
18284102adabSPaul E. McKenney 		 */
182967c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
183045fed3e7SPaul E. McKenney 		return false;
18314102adabSPaul E. McKenney 	}
18324102adabSPaul E. McKenney 
18334102adabSPaul E. McKenney 	/* Advance to a new grace period and initialize state. */
1834ad3832e9SPaul E. McKenney 	record_gp_stall_check_time();
1835ff3bb6f4SPaul E. McKenney 	/* Record GP times before starting GP, hence rcu_seq_start(). */
18369cbc5b97SPaul E. McKenney 	rcu_seq_start(&rcu_state.gp_seq);
18379cbc5b97SPaul E. McKenney 	trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq, TPS("start"));
183867c583a7SBoqun Feng 	raw_spin_unlock_irq_rcu_node(rnp);
18394102adabSPaul E. McKenney 
18404102adabSPaul E. McKenney 	/*
18410aa04b05SPaul E. McKenney 	 * Apply per-leaf buffered online and offline operations to the
18420aa04b05SPaul E. McKenney 	 * rcu_node tree.  Note that this new grace period need not wait
18430aa04b05SPaul E. McKenney 	 * for subsequent online CPUs, and that quiescent-state forcing
18440aa04b05SPaul E. McKenney 	 * will handle subsequent offline CPUs.
18450aa04b05SPaul E. McKenney 	 */
18469cbc5b97SPaul E. McKenney 	rcu_state.gp_state = RCU_GP_ONOFF;
1847aedf4ba9SPaul E. McKenney 	rcu_for_each_leaf_node(rnp) {
18489cbc5b97SPaul E. McKenney 		spin_lock(&rcu_state.ofl_lock);
18492a67e741SPeter Zijlstra 		raw_spin_lock_irq_rcu_node(rnp);
18500aa04b05SPaul E. McKenney 		if (rnp->qsmaskinit == rnp->qsmaskinitnext &&
18510aa04b05SPaul E. McKenney 		    !rnp->wait_blkd_tasks) {
18520aa04b05SPaul E. McKenney 			/* Nothing to do on this leaf rcu_node structure. */
185367c583a7SBoqun Feng 			raw_spin_unlock_irq_rcu_node(rnp);
18549cbc5b97SPaul E. McKenney 			spin_unlock(&rcu_state.ofl_lock);
18550aa04b05SPaul E. McKenney 			continue;
18560aa04b05SPaul E. McKenney 		}
18570aa04b05SPaul E. McKenney 
18580aa04b05SPaul E. McKenney 		/* Record old state, apply changes to ->qsmaskinit field. */
18590aa04b05SPaul E. McKenney 		oldmask = rnp->qsmaskinit;
18600aa04b05SPaul E. McKenney 		rnp->qsmaskinit = rnp->qsmaskinitnext;
18610aa04b05SPaul E. McKenney 
18620aa04b05SPaul E. McKenney 		/* If zero-ness of ->qsmaskinit changed, propagate up tree. */
18630aa04b05SPaul E. McKenney 		if (!oldmask != !rnp->qsmaskinit) {
1864962aff03SPaul E. McKenney 			if (!oldmask) { /* First online CPU for rcu_node. */
1865962aff03SPaul E. McKenney 				if (!rnp->wait_blkd_tasks) /* Ever offline? */
18660aa04b05SPaul E. McKenney 					rcu_init_new_rnp(rnp);
1867962aff03SPaul E. McKenney 			} else if (rcu_preempt_has_tasks(rnp)) {
1868962aff03SPaul E. McKenney 				rnp->wait_blkd_tasks = true; /* blocked tasks */
1869962aff03SPaul E. McKenney 			} else { /* Last offline CPU and can propagate. */
18700aa04b05SPaul E. McKenney 				rcu_cleanup_dead_rnp(rnp);
18710aa04b05SPaul E. McKenney 			}
1872962aff03SPaul E. McKenney 		}
18730aa04b05SPaul E. McKenney 
18740aa04b05SPaul E. McKenney 		/*
18750aa04b05SPaul E. McKenney 		 * If all waited-on tasks from prior grace period are
18760aa04b05SPaul E. McKenney 		 * done, and if all this rcu_node structure's CPUs are
18770aa04b05SPaul E. McKenney 		 * still offline, propagate up the rcu_node tree and
18780aa04b05SPaul E. McKenney 		 * clear ->wait_blkd_tasks.  Otherwise, if one of this
18790aa04b05SPaul E. McKenney 		 * rcu_node structure's CPUs has since come back online,
1880962aff03SPaul E. McKenney 		 * simply clear ->wait_blkd_tasks.
18810aa04b05SPaul E. McKenney 		 */
18820aa04b05SPaul E. McKenney 		if (rnp->wait_blkd_tasks &&
1883962aff03SPaul E. McKenney 		    (!rcu_preempt_has_tasks(rnp) || rnp->qsmaskinit)) {
18840aa04b05SPaul E. McKenney 			rnp->wait_blkd_tasks = false;
1885962aff03SPaul E. McKenney 			if (!rnp->qsmaskinit)
18860aa04b05SPaul E. McKenney 				rcu_cleanup_dead_rnp(rnp);
18870aa04b05SPaul E. McKenney 		}
18880aa04b05SPaul E. McKenney 
188967c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
18909cbc5b97SPaul E. McKenney 		spin_unlock(&rcu_state.ofl_lock);
18910aa04b05SPaul E. McKenney 	}
189222212332SPaul E. McKenney 	rcu_gp_slow(gp_preinit_delay); /* Races with CPU hotplug. */
18934102adabSPaul E. McKenney 
18944102adabSPaul E. McKenney 	/*
18954102adabSPaul E. McKenney 	 * Set the quiescent-state-needed bits in all the rcu_node
18969cbc5b97SPaul E. McKenney 	 * structures for all currently online CPUs in breadth-first
18979cbc5b97SPaul E. McKenney 	 * order, starting from the root rcu_node structure, relying on the
18989cbc5b97SPaul E. McKenney 	 * layout of the tree within the rcu_state.node[] array.  Note that
18999cbc5b97SPaul E. McKenney 	 * other CPUs will access only the leaves of the hierarchy, thus
19009cbc5b97SPaul E. McKenney 	 * seeing that no grace period is in progress, at least until the
19019cbc5b97SPaul E. McKenney 	 * corresponding leaf node has been initialized.
19024102adabSPaul E. McKenney 	 *
19034102adabSPaul E. McKenney 	 * The grace period cannot complete until the initialization
19044102adabSPaul E. McKenney 	 * process finishes, because this kthread handles both.
19054102adabSPaul E. McKenney 	 */
19069cbc5b97SPaul E. McKenney 	rcu_state.gp_state = RCU_GP_INIT;
1907aedf4ba9SPaul E. McKenney 	rcu_for_each_node_breadth_first(rnp) {
190822212332SPaul E. McKenney 		rcu_gp_slow(gp_init_delay);
1909ec2c2976SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
1910da1df50dSPaul E. McKenney 		rdp = this_cpu_ptr(&rcu_data);
191181ab59a3SPaul E. McKenney 		rcu_preempt_check_blocked_tasks(rnp);
19124102adabSPaul E. McKenney 		rnp->qsmask = rnp->qsmaskinit;
19139cbc5b97SPaul E. McKenney 		WRITE_ONCE(rnp->gp_seq, rcu_state.gp_seq);
19144102adabSPaul E. McKenney 		if (rnp == rdp->mynode)
1915c7e48f7bSPaul E. McKenney 			(void)__note_gp_changes(rnp, rdp);
19164102adabSPaul E. McKenney 		rcu_preempt_boost_start_gp(rnp);
19179cbc5b97SPaul E. McKenney 		trace_rcu_grace_period_init(rcu_state.name, rnp->gp_seq,
19184102adabSPaul E. McKenney 					    rnp->level, rnp->grplo,
19194102adabSPaul E. McKenney 					    rnp->grphi, rnp->qsmask);
1920ec2c2976SPaul E. McKenney 		/* Quiescent states for tasks on any now-offline CPUs. */
1921ec2c2976SPaul E. McKenney 		mask = rnp->qsmask & ~rnp->qsmaskinitnext;
1922f2e2df59SPaul E. McKenney 		rnp->rcu_gp_init_mask = mask;
1923ec2c2976SPaul E. McKenney 		if ((mask || rnp->wait_blkd_tasks) && rcu_is_leaf_node(rnp))
1924b50912d0SPaul E. McKenney 			rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
1925ec2c2976SPaul E. McKenney 		else
192667c583a7SBoqun Feng 			raw_spin_unlock_irq_rcu_node(rnp);
1927cee43939SPaul E. McKenney 		cond_resched_tasks_rcu_qs();
19289cbc5b97SPaul E. McKenney 		WRITE_ONCE(rcu_state.gp_activity, jiffies);
19294102adabSPaul E. McKenney 	}
19304102adabSPaul E. McKenney 
193145fed3e7SPaul E. McKenney 	return true;
19324102adabSPaul E. McKenney }
19334102adabSPaul E. McKenney 
19344102adabSPaul E. McKenney /*
1935b3dae109SPeter Zijlstra  * Helper function for swait_event_idle_exclusive() wakeup at force-quiescent-state
1936d5374226SLuis R. Rodriguez  * time.
1937b9a425cfSPaul E. McKenney  */
19380854a05cSPaul E. McKenney static bool rcu_gp_fqs_check_wake(int *gfp)
1939b9a425cfSPaul E. McKenney {
1940336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
1941b9a425cfSPaul E. McKenney 
1942b9a425cfSPaul E. McKenney 	/* Someone like call_rcu() requested a force-quiescent-state scan. */
19430854a05cSPaul E. McKenney 	*gfp = READ_ONCE(rcu_state.gp_flags);
1944b9a425cfSPaul E. McKenney 	if (*gfp & RCU_GP_FLAG_FQS)
1945b9a425cfSPaul E. McKenney 		return true;
1946b9a425cfSPaul E. McKenney 
1947b9a425cfSPaul E. McKenney 	/* The current grace period has completed. */
1948b9a425cfSPaul E. McKenney 	if (!READ_ONCE(rnp->qsmask) && !rcu_preempt_blocked_readers_cgp(rnp))
1949b9a425cfSPaul E. McKenney 		return true;
1950b9a425cfSPaul E. McKenney 
1951b9a425cfSPaul E. McKenney 	return false;
1952b9a425cfSPaul E. McKenney }
1953b9a425cfSPaul E. McKenney 
1954b9a425cfSPaul E. McKenney /*
19554102adabSPaul E. McKenney  * Do one round of quiescent-state forcing.
19564102adabSPaul E. McKenney  */
19570854a05cSPaul E. McKenney static void rcu_gp_fqs(bool first_time)
19584102adabSPaul E. McKenney {
1959336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
19604102adabSPaul E. McKenney 
19619cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_activity, jiffies);
19629cbc5b97SPaul E. McKenney 	rcu_state.n_force_qs++;
196377f81fe0SPetr Mladek 	if (first_time) {
19644102adabSPaul E. McKenney 		/* Collect dyntick-idle snapshots. */
1965e9ecb780SPaul E. McKenney 		force_qs_rnp(dyntick_save_progress_counter);
19664102adabSPaul E. McKenney 	} else {
19674102adabSPaul E. McKenney 		/* Handle dyntick-idle and offline CPUs. */
1968e9ecb780SPaul E. McKenney 		force_qs_rnp(rcu_implicit_dynticks_qs);
19694102adabSPaul E. McKenney 	}
19704102adabSPaul E. McKenney 	/* Clear flag to prevent immediate re-entry. */
19719cbc5b97SPaul E. McKenney 	if (READ_ONCE(rcu_state.gp_flags) & RCU_GP_FLAG_FQS) {
19722a67e741SPeter Zijlstra 		raw_spin_lock_irq_rcu_node(rnp);
19739cbc5b97SPaul E. McKenney 		WRITE_ONCE(rcu_state.gp_flags,
19749cbc5b97SPaul E. McKenney 			   READ_ONCE(rcu_state.gp_flags) & ~RCU_GP_FLAG_FQS);
197567c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
19764102adabSPaul E. McKenney 	}
19774102adabSPaul E. McKenney }
19784102adabSPaul E. McKenney 
19794102adabSPaul E. McKenney /*
19804102adabSPaul E. McKenney  * Clean up after the old grace period.
19814102adabSPaul E. McKenney  */
19820854a05cSPaul E. McKenney static void rcu_gp_cleanup(void)
19834102adabSPaul E. McKenney {
19844102adabSPaul E. McKenney 	unsigned long gp_duration;
198548a7639cSPaul E. McKenney 	bool needgp = false;
1986de30ad51SPaul E. McKenney 	unsigned long new_gp_seq;
19874102adabSPaul E. McKenney 	struct rcu_data *rdp;
1988336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
1989abedf8e2SPaul Gortmaker 	struct swait_queue_head *sq;
19904102adabSPaul E. McKenney 
19919cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_activity, jiffies);
19922a67e741SPeter Zijlstra 	raw_spin_lock_irq_rcu_node(rnp);
19939cbc5b97SPaul E. McKenney 	gp_duration = jiffies - rcu_state.gp_start;
19949cbc5b97SPaul E. McKenney 	if (gp_duration > rcu_state.gp_max)
19959cbc5b97SPaul E. McKenney 		rcu_state.gp_max = gp_duration;
19964102adabSPaul E. McKenney 
19974102adabSPaul E. McKenney 	/*
19984102adabSPaul E. McKenney 	 * We know the grace period is complete, but to everyone else
19994102adabSPaul E. McKenney 	 * it appears to still be ongoing.  But it is also the case
20004102adabSPaul E. McKenney 	 * that to everyone else it looks like there is nothing that
20014102adabSPaul E. McKenney 	 * they can do to advance the grace period.  It is therefore
20024102adabSPaul E. McKenney 	 * safe for us to drop the lock in order to mark the grace
20034102adabSPaul E. McKenney 	 * period as completed in all of the rcu_node structures.
20044102adabSPaul E. McKenney 	 */
200567c583a7SBoqun Feng 	raw_spin_unlock_irq_rcu_node(rnp);
20064102adabSPaul E. McKenney 
20074102adabSPaul E. McKenney 	/*
2008ff3bb6f4SPaul E. McKenney 	 * Propagate new ->gp_seq value to rcu_node structures so that
2009ff3bb6f4SPaul E. McKenney 	 * other CPUs don't have to wait until the start of the next grace
2010ff3bb6f4SPaul E. McKenney 	 * period to process their callbacks.  This also avoids some nasty
2011ff3bb6f4SPaul E. McKenney 	 * RCU grace-period initialization races by forcing the end of
2012ff3bb6f4SPaul E. McKenney 	 * the current grace period to be completely recorded in all of
2013ff3bb6f4SPaul E. McKenney 	 * the rcu_node structures before the beginning of the next grace
2014ff3bb6f4SPaul E. McKenney 	 * period is recorded in any of the rcu_node structures.
20154102adabSPaul E. McKenney 	 */
20169cbc5b97SPaul E. McKenney 	new_gp_seq = rcu_state.gp_seq;
2017de30ad51SPaul E. McKenney 	rcu_seq_end(&new_gp_seq);
2018aedf4ba9SPaul E. McKenney 	rcu_for_each_node_breadth_first(rnp) {
20192a67e741SPeter Zijlstra 		raw_spin_lock_irq_rcu_node(rnp);
20204bc8d555SPaul E. McKenney 		if (WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp)))
202181ab59a3SPaul E. McKenney 			dump_blkd_tasks(rnp, 10);
20225c60d25fSPaul E. McKenney 		WARN_ON_ONCE(rnp->qsmask);
2023de30ad51SPaul E. McKenney 		WRITE_ONCE(rnp->gp_seq, new_gp_seq);
2024da1df50dSPaul E. McKenney 		rdp = this_cpu_ptr(&rcu_data);
20254102adabSPaul E. McKenney 		if (rnp == rdp->mynode)
2026c7e48f7bSPaul E. McKenney 			needgp = __note_gp_changes(rnp, rdp) || needgp;
202778e4bc34SPaul E. McKenney 		/* smp_mb() provided by prior unlock-lock pair. */
20283481f2eaSPaul E. McKenney 		needgp = rcu_future_gp_cleanup(rnp) || needgp;
2029065bb78cSDaniel Wagner 		sq = rcu_nocb_gp_get(rnp);
203067c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
2031065bb78cSDaniel Wagner 		rcu_nocb_gp_cleanup(sq);
2032cee43939SPaul E. McKenney 		cond_resched_tasks_rcu_qs();
20339cbc5b97SPaul E. McKenney 		WRITE_ONCE(rcu_state.gp_activity, jiffies);
203422212332SPaul E. McKenney 		rcu_gp_slow(gp_cleanup_delay);
20354102adabSPaul E. McKenney 	}
2036336a4f6cSPaul E. McKenney 	rnp = rcu_get_root();
20379cbc5b97SPaul E. McKenney 	raw_spin_lock_irq_rcu_node(rnp); /* GP before ->gp_seq update. */
20384102adabSPaul E. McKenney 
2039765a3f4fSPaul E. McKenney 	/* Declare grace period done. */
20409cbc5b97SPaul E. McKenney 	rcu_seq_end(&rcu_state.gp_seq);
20419cbc5b97SPaul E. McKenney 	trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq, TPS("end"));
20429cbc5b97SPaul E. McKenney 	rcu_state.gp_state = RCU_GP_IDLE;
2043fb31340fSPaul E. McKenney 	/* Check for GP requests since above loop. */
2044da1df50dSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
20455b55072fSJoel Fernandes (Google) 	if (!needgp && ULONG_CMP_LT(rnp->gp_seq, rnp->gp_seq_needed)) {
2046abd13fddSPaul E. McKenney 		trace_rcu_this_gp(rnp, rdp, rnp->gp_seq_needed,
2047fb31340fSPaul E. McKenney 				  TPS("CleanupMore"));
2048fb31340fSPaul E. McKenney 		needgp = true;
2049fb31340fSPaul E. McKenney 	}
205048a7639cSPaul E. McKenney 	/* Advance CBs to reduce false positives below. */
205102f50142SPaul E. McKenney 	if (!rcu_accelerate_cbs(rnp, rdp) && needgp) {
20529cbc5b97SPaul E. McKenney 		WRITE_ONCE(rcu_state.gp_flags, RCU_GP_FLAG_INIT);
20539cbc5b97SPaul E. McKenney 		rcu_state.gp_req_activity = jiffies;
20549cbc5b97SPaul E. McKenney 		trace_rcu_grace_period(rcu_state.name,
20559cbc5b97SPaul E. McKenney 				       READ_ONCE(rcu_state.gp_seq),
20564102adabSPaul E. McKenney 				       TPS("newreq"));
205718390aeaSPaul E. McKenney 	} else {
20589cbc5b97SPaul E. McKenney 		WRITE_ONCE(rcu_state.gp_flags,
20599cbc5b97SPaul E. McKenney 			   rcu_state.gp_flags & RCU_GP_FLAG_INIT);
206018390aeaSPaul E. McKenney 	}
206167c583a7SBoqun Feng 	raw_spin_unlock_irq_rcu_node(rnp);
20624102adabSPaul E. McKenney }
20634102adabSPaul E. McKenney 
20644102adabSPaul E. McKenney /*
20654102adabSPaul E. McKenney  * Body of kthread that handles grace periods.
20664102adabSPaul E. McKenney  */
20670854a05cSPaul E. McKenney static int __noreturn rcu_gp_kthread(void *unused)
20684102adabSPaul E. McKenney {
206977f81fe0SPetr Mladek 	bool first_gp_fqs;
20704102adabSPaul E. McKenney 	int gf;
20714102adabSPaul E. McKenney 	unsigned long j;
20724102adabSPaul E. McKenney 	int ret;
2073336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
20744102adabSPaul E. McKenney 
20755871968dSPaul E. McKenney 	rcu_bind_gp_kthread();
20764102adabSPaul E. McKenney 	for (;;) {
20774102adabSPaul E. McKenney 
20784102adabSPaul E. McKenney 		/* Handle grace-period start. */
20794102adabSPaul E. McKenney 		for (;;) {
20809cbc5b97SPaul E. McKenney 			trace_rcu_grace_period(rcu_state.name,
20819cbc5b97SPaul E. McKenney 					       READ_ONCE(rcu_state.gp_seq),
20824102adabSPaul E. McKenney 					       TPS("reqwait"));
20839cbc5b97SPaul E. McKenney 			rcu_state.gp_state = RCU_GP_WAIT_GPS;
20849cbc5b97SPaul E. McKenney 			swait_event_idle_exclusive(rcu_state.gp_wq,
20859cbc5b97SPaul E. McKenney 					 READ_ONCE(rcu_state.gp_flags) &
20864102adabSPaul E. McKenney 					 RCU_GP_FLAG_INIT);
20879cbc5b97SPaul E. McKenney 			rcu_state.gp_state = RCU_GP_DONE_GPS;
208878e4bc34SPaul E. McKenney 			/* Locking provides needed memory barrier. */
20890854a05cSPaul E. McKenney 			if (rcu_gp_init())
20904102adabSPaul E. McKenney 				break;
2091cee43939SPaul E. McKenney 			cond_resched_tasks_rcu_qs();
20929cbc5b97SPaul E. McKenney 			WRITE_ONCE(rcu_state.gp_activity, jiffies);
209373a860cdSPaul E. McKenney 			WARN_ON(signal_pending(current));
20949cbc5b97SPaul E. McKenney 			trace_rcu_grace_period(rcu_state.name,
20959cbc5b97SPaul E. McKenney 					       READ_ONCE(rcu_state.gp_seq),
20964102adabSPaul E. McKenney 					       TPS("reqwaitsig"));
20974102adabSPaul E. McKenney 		}
20984102adabSPaul E. McKenney 
20994102adabSPaul E. McKenney 		/* Handle quiescent-state forcing. */
210077f81fe0SPetr Mladek 		first_gp_fqs = true;
21014102adabSPaul E. McKenney 		j = jiffies_till_first_fqs;
21024102adabSPaul E. McKenney 		ret = 0;
21034102adabSPaul E. McKenney 		for (;;) {
21048c7c4829SPaul E. McKenney 			if (!ret) {
21059cbc5b97SPaul E. McKenney 				rcu_state.jiffies_force_qs = jiffies + j;
21069cbc5b97SPaul E. McKenney 				WRITE_ONCE(rcu_state.jiffies_kick_kthreads,
21078c7c4829SPaul E. McKenney 					   jiffies + 3 * j);
21088c7c4829SPaul E. McKenney 			}
21099cbc5b97SPaul E. McKenney 			trace_rcu_grace_period(rcu_state.name,
21109cbc5b97SPaul E. McKenney 					       READ_ONCE(rcu_state.gp_seq),
21114102adabSPaul E. McKenney 					       TPS("fqswait"));
21129cbc5b97SPaul E. McKenney 			rcu_state.gp_state = RCU_GP_WAIT_FQS;
21139cbc5b97SPaul E. McKenney 			ret = swait_event_idle_timeout_exclusive(rcu_state.gp_wq,
21140854a05cSPaul E. McKenney 					rcu_gp_fqs_check_wake(&gf), j);
21159cbc5b97SPaul E. McKenney 			rcu_state.gp_state = RCU_GP_DOING_FQS;
211678e4bc34SPaul E. McKenney 			/* Locking provides needed memory barriers. */
21174102adabSPaul E. McKenney 			/* If grace period done, leave loop. */
21187d0ae808SPaul E. McKenney 			if (!READ_ONCE(rnp->qsmask) &&
21194102adabSPaul E. McKenney 			    !rcu_preempt_blocked_readers_cgp(rnp))
21204102adabSPaul E. McKenney 				break;
21214102adabSPaul E. McKenney 			/* If time for quiescent-state forcing, do it. */
21229cbc5b97SPaul E. McKenney 			if (ULONG_CMP_GE(jiffies, rcu_state.jiffies_force_qs) ||
21234102adabSPaul E. McKenney 			    (gf & RCU_GP_FLAG_FQS)) {
21249cbc5b97SPaul E. McKenney 				trace_rcu_grace_period(rcu_state.name,
21259cbc5b97SPaul E. McKenney 						       READ_ONCE(rcu_state.gp_seq),
21264102adabSPaul E. McKenney 						       TPS("fqsstart"));
21270854a05cSPaul E. McKenney 				rcu_gp_fqs(first_gp_fqs);
212877f81fe0SPetr Mladek 				first_gp_fqs = false;
21299cbc5b97SPaul E. McKenney 				trace_rcu_grace_period(rcu_state.name,
21309cbc5b97SPaul E. McKenney 						       READ_ONCE(rcu_state.gp_seq),
21314102adabSPaul E. McKenney 						       TPS("fqsend"));
2132cee43939SPaul E. McKenney 				cond_resched_tasks_rcu_qs();
21339cbc5b97SPaul E. McKenney 				WRITE_ONCE(rcu_state.gp_activity, jiffies);
2134fcfd0a23SPaul E. McKenney 				ret = 0; /* Force full wait till next FQS. */
2135fcfd0a23SPaul E. McKenney 				j = jiffies_till_next_fqs;
21364102adabSPaul E. McKenney 			} else {
21374102adabSPaul E. McKenney 				/* Deal with stray signal. */
2138cee43939SPaul E. McKenney 				cond_resched_tasks_rcu_qs();
21399cbc5b97SPaul E. McKenney 				WRITE_ONCE(rcu_state.gp_activity, jiffies);
214073a860cdSPaul E. McKenney 				WARN_ON(signal_pending(current));
21419cbc5b97SPaul E. McKenney 				trace_rcu_grace_period(rcu_state.name,
21429cbc5b97SPaul E. McKenney 						       READ_ONCE(rcu_state.gp_seq),
21434102adabSPaul E. McKenney 						       TPS("fqswaitsig"));
2144fcfd0a23SPaul E. McKenney 				ret = 1; /* Keep old FQS timing. */
2145fcfd0a23SPaul E. McKenney 				j = jiffies;
21469cbc5b97SPaul E. McKenney 				if (time_after(jiffies,
21479cbc5b97SPaul E. McKenney 					       rcu_state.jiffies_force_qs))
21484102adabSPaul E. McKenney 					j = 1;
2149fcfd0a23SPaul E. McKenney 				else
21509cbc5b97SPaul E. McKenney 					j = rcu_state.jiffies_force_qs - j;
21514102adabSPaul E. McKenney 			}
21524102adabSPaul E. McKenney 		}
21534102adabSPaul E. McKenney 
21544102adabSPaul E. McKenney 		/* Handle grace-period end. */
21559cbc5b97SPaul E. McKenney 		rcu_state.gp_state = RCU_GP_CLEANUP;
21560854a05cSPaul E. McKenney 		rcu_gp_cleanup();
21579cbc5b97SPaul E. McKenney 		rcu_state.gp_state = RCU_GP_CLEANED;
21584102adabSPaul E. McKenney 	}
21594102adabSPaul E. McKenney }
21604102adabSPaul E. McKenney 
21614102adabSPaul E. McKenney /*
21628994515cSPaul E. McKenney  * Report a full set of quiescent states to the specified rcu_state data
21638994515cSPaul E. McKenney  * structure.  Invoke rcu_gp_kthread_wake() to awaken the grace-period
21648994515cSPaul E. McKenney  * kthread if another grace period is required.  Whether we wake
21658994515cSPaul E. McKenney  * the grace-period kthread or it awakens itself for the next round
21668994515cSPaul E. McKenney  * of quiescent-state forcing, that kthread will clean up after the
21678994515cSPaul E. McKenney  * just-completed grace period.  Note that the caller must hold rnp->lock,
21688994515cSPaul E. McKenney  * which is released before return.
21694102adabSPaul E. McKenney  */
2170aff4e9edSPaul E. McKenney static void rcu_report_qs_rsp(unsigned long flags)
2171336a4f6cSPaul E. McKenney 	__releases(rcu_get_root()->lock)
21724102adabSPaul E. McKenney {
2173336a4f6cSPaul E. McKenney 	raw_lockdep_assert_held_rcu_node(rcu_get_root());
2174de8e8730SPaul E. McKenney 	WARN_ON_ONCE(!rcu_gp_in_progress());
21759cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_flags,
21769cbc5b97SPaul E. McKenney 		   READ_ONCE(rcu_state.gp_flags) | RCU_GP_FLAG_FQS);
2177336a4f6cSPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rcu_get_root(), flags);
2178532c00c9SPaul E. McKenney 	rcu_gp_kthread_wake();
21794102adabSPaul E. McKenney }
21804102adabSPaul E. McKenney 
21814102adabSPaul E. McKenney /*
21824102adabSPaul E. McKenney  * Similar to rcu_report_qs_rdp(), for which it is a helper function.
21834102adabSPaul E. McKenney  * Allows quiescent states for a group of CPUs to be reported at one go
21844102adabSPaul E. McKenney  * to the specified rcu_node structure, though all the CPUs in the group
2185654e9533SPaul E. McKenney  * must be represented by the same rcu_node structure (which need not be a
2186654e9533SPaul E. McKenney  * leaf rcu_node structure, though it often will be).  The gps parameter
2187654e9533SPaul E. McKenney  * is the grace-period snapshot, which means that the quiescent states
2188c9a24e2dSPaul E. McKenney  * are valid only if rnp->gp_seq is equal to gps.  That structure's lock
2189654e9533SPaul E. McKenney  * must be held upon entry, and it is released before return.
2190ec2c2976SPaul E. McKenney  *
2191ec2c2976SPaul E. McKenney  * As a special case, if mask is zero, the bit-already-cleared check is
2192ec2c2976SPaul E. McKenney  * disabled.  This allows propagating quiescent state due to resumed tasks
2193ec2c2976SPaul E. McKenney  * during grace-period initialization.
21944102adabSPaul E. McKenney  */
2195b50912d0SPaul E. McKenney static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp,
2196b50912d0SPaul E. McKenney 			      unsigned long gps, unsigned long flags)
21974102adabSPaul E. McKenney 	__releases(rnp->lock)
21984102adabSPaul E. McKenney {
2199654e9533SPaul E. McKenney 	unsigned long oldmask = 0;
22004102adabSPaul E. McKenney 	struct rcu_node *rnp_c;
22014102adabSPaul E. McKenney 
2202a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
2203c0b334c5SPaul E. McKenney 
22044102adabSPaul E. McKenney 	/* Walk up the rcu_node hierarchy. */
22054102adabSPaul E. McKenney 	for (;;) {
2206ec2c2976SPaul E. McKenney 		if ((!(rnp->qsmask & mask) && mask) || rnp->gp_seq != gps) {
22074102adabSPaul E. McKenney 
2208654e9533SPaul E. McKenney 			/*
2209654e9533SPaul E. McKenney 			 * Our bit has already been cleared, or the
2210654e9533SPaul E. McKenney 			 * relevant grace period is already over, so done.
2211654e9533SPaul E. McKenney 			 */
221267c583a7SBoqun Feng 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
22134102adabSPaul E. McKenney 			return;
22144102adabSPaul E. McKenney 		}
2215654e9533SPaul E. McKenney 		WARN_ON_ONCE(oldmask); /* Any child must be all zeroed! */
22165b4c11d5SPaul E. McKenney 		WARN_ON_ONCE(!rcu_is_leaf_node(rnp) &&
22172dee9404SPaul E. McKenney 			     rcu_preempt_blocked_readers_cgp(rnp));
22184102adabSPaul E. McKenney 		rnp->qsmask &= ~mask;
221967a0edbfSPaul E. McKenney 		trace_rcu_quiescent_state_report(rcu_state.name, rnp->gp_seq,
22204102adabSPaul E. McKenney 						 mask, rnp->qsmask, rnp->level,
22214102adabSPaul E. McKenney 						 rnp->grplo, rnp->grphi,
22224102adabSPaul E. McKenney 						 !!rnp->gp_tasks);
22234102adabSPaul E. McKenney 		if (rnp->qsmask != 0 || rcu_preempt_blocked_readers_cgp(rnp)) {
22244102adabSPaul E. McKenney 
22254102adabSPaul E. McKenney 			/* Other bits still set at this level, so done. */
222667c583a7SBoqun Feng 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
22274102adabSPaul E. McKenney 			return;
22284102adabSPaul E. McKenney 		}
2229d43a5d32SPaul E. McKenney 		rnp->completedqs = rnp->gp_seq;
22304102adabSPaul E. McKenney 		mask = rnp->grpmask;
22314102adabSPaul E. McKenney 		if (rnp->parent == NULL) {
22324102adabSPaul E. McKenney 
22334102adabSPaul E. McKenney 			/* No more levels.  Exit loop holding root lock. */
22344102adabSPaul E. McKenney 
22354102adabSPaul E. McKenney 			break;
22364102adabSPaul E. McKenney 		}
223767c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
22384102adabSPaul E. McKenney 		rnp_c = rnp;
22394102adabSPaul E. McKenney 		rnp = rnp->parent;
22402a67e741SPeter Zijlstra 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
2241654e9533SPaul E. McKenney 		oldmask = rnp_c->qsmask;
22424102adabSPaul E. McKenney 	}
22434102adabSPaul E. McKenney 
22444102adabSPaul E. McKenney 	/*
22454102adabSPaul E. McKenney 	 * Get here if we are the last CPU to pass through a quiescent
22464102adabSPaul E. McKenney 	 * state for this grace period.  Invoke rcu_report_qs_rsp()
22474102adabSPaul E. McKenney 	 * to clean up and start the next grace period if one is needed.
22484102adabSPaul E. McKenney 	 */
2249aff4e9edSPaul E. McKenney 	rcu_report_qs_rsp(flags); /* releases rnp->lock. */
22504102adabSPaul E. McKenney }
22514102adabSPaul E. McKenney 
22524102adabSPaul E. McKenney /*
2253cc99a310SPaul E. McKenney  * Record a quiescent state for all tasks that were previously queued
2254cc99a310SPaul E. McKenney  * on the specified rcu_node structure and that were blocking the current
2255cc99a310SPaul E. McKenney  * RCU grace period.  The caller must hold the specified rnp->lock with
2256cc99a310SPaul E. McKenney  * irqs disabled, and this lock is released upon return, but irqs remain
2257cc99a310SPaul E. McKenney  * disabled.
2258cc99a310SPaul E. McKenney  */
225917a8212bSPaul E. McKenney static void __maybe_unused
2260139ad4daSPaul E. McKenney rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags)
2261cc99a310SPaul E. McKenney 	__releases(rnp->lock)
2262cc99a310SPaul E. McKenney {
2263654e9533SPaul E. McKenney 	unsigned long gps;
2264cc99a310SPaul E. McKenney 	unsigned long mask;
2265cc99a310SPaul E. McKenney 	struct rcu_node *rnp_p;
2266cc99a310SPaul E. McKenney 
2267a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
226845975c7dSPaul E. McKenney 	if (WARN_ON_ONCE(!IS_ENABLED(CONFIG_PREEMPT)) ||
2269c74859d1SPaul E. McKenney 	    WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp)) ||
2270c74859d1SPaul E. McKenney 	    rnp->qsmask != 0) {
227167c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2272cc99a310SPaul E. McKenney 		return;  /* Still need more quiescent states! */
2273cc99a310SPaul E. McKenney 	}
2274cc99a310SPaul E. McKenney 
227577cfc7bfSPaul E. McKenney 	rnp->completedqs = rnp->gp_seq;
2276cc99a310SPaul E. McKenney 	rnp_p = rnp->parent;
2277cc99a310SPaul E. McKenney 	if (rnp_p == NULL) {
2278cc99a310SPaul E. McKenney 		/*
2279a77da14cSPaul E. McKenney 		 * Only one rcu_node structure in the tree, so don't
2280a77da14cSPaul E. McKenney 		 * try to report up to its nonexistent parent!
2281cc99a310SPaul E. McKenney 		 */
2282aff4e9edSPaul E. McKenney 		rcu_report_qs_rsp(flags);
2283cc99a310SPaul E. McKenney 		return;
2284cc99a310SPaul E. McKenney 	}
2285cc99a310SPaul E. McKenney 
2286c9a24e2dSPaul E. McKenney 	/* Report up the rest of the hierarchy, tracking current ->gp_seq. */
2287c9a24e2dSPaul E. McKenney 	gps = rnp->gp_seq;
2288cc99a310SPaul E. McKenney 	mask = rnp->grpmask;
228967c583a7SBoqun Feng 	raw_spin_unlock_rcu_node(rnp);	/* irqs remain disabled. */
22902a67e741SPeter Zijlstra 	raw_spin_lock_rcu_node(rnp_p);	/* irqs already disabled. */
2291b50912d0SPaul E. McKenney 	rcu_report_qs_rnp(mask, rnp_p, gps, flags);
2292cc99a310SPaul E. McKenney }
2293cc99a310SPaul E. McKenney 
2294cc99a310SPaul E. McKenney /*
22954102adabSPaul E. McKenney  * Record a quiescent state for the specified CPU to that CPU's rcu_data
22964b455dc3SPaul E. McKenney  * structure.  This must be called from the specified CPU.
22974102adabSPaul E. McKenney  */
22984102adabSPaul E. McKenney static void
229933085c46SPaul E. McKenney rcu_report_qs_rdp(int cpu, struct rcu_data *rdp)
23004102adabSPaul E. McKenney {
23014102adabSPaul E. McKenney 	unsigned long flags;
23024102adabSPaul E. McKenney 	unsigned long mask;
230348a7639cSPaul E. McKenney 	bool needwake;
23044102adabSPaul E. McKenney 	struct rcu_node *rnp;
23054102adabSPaul E. McKenney 
23064102adabSPaul E. McKenney 	rnp = rdp->mynode;
23072a67e741SPeter Zijlstra 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
2308c9a24e2dSPaul E. McKenney 	if (rdp->cpu_no_qs.b.norm || rdp->gp_seq != rnp->gp_seq ||
2309c9a24e2dSPaul E. McKenney 	    rdp->gpwrap) {
23104102adabSPaul E. McKenney 
23114102adabSPaul E. McKenney 		/*
23124102adabSPaul E. McKenney 		 * The grace period in which this quiescent state was
23134102adabSPaul E. McKenney 		 * recorded has ended, so don't report it upwards.
23144102adabSPaul E. McKenney 		 * We will instead need a new quiescent state that lies
23154102adabSPaul E. McKenney 		 * within the current grace period.
23164102adabSPaul E. McKenney 		 */
23175b74c458SPaul E. McKenney 		rdp->cpu_no_qs.b.norm = true;	/* need qs for new gp. */
23189577df9aSPaul E. McKenney 		rdp->rcu_qs_ctr_snap = __this_cpu_read(rcu_dynticks.rcu_qs_ctr);
231967c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
23204102adabSPaul E. McKenney 		return;
23214102adabSPaul E. McKenney 	}
23224102adabSPaul E. McKenney 	mask = rdp->grpmask;
23234102adabSPaul E. McKenney 	if ((rnp->qsmask & mask) == 0) {
232467c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
23254102adabSPaul E. McKenney 	} else {
2326bb53e416SPaul E. McKenney 		rdp->core_needs_qs = false;
23274102adabSPaul E. McKenney 
23284102adabSPaul E. McKenney 		/*
23294102adabSPaul E. McKenney 		 * This GP can't end until cpu checks in, so all of our
23304102adabSPaul E. McKenney 		 * callbacks can be processed during the next GP.
23314102adabSPaul E. McKenney 		 */
233202f50142SPaul E. McKenney 		needwake = rcu_accelerate_cbs(rnp, rdp);
23334102adabSPaul E. McKenney 
2334b50912d0SPaul E. McKenney 		rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
2335654e9533SPaul E. McKenney 		/* ^^^ Released rnp->lock */
233648a7639cSPaul E. McKenney 		if (needwake)
2337532c00c9SPaul E. McKenney 			rcu_gp_kthread_wake();
23384102adabSPaul E. McKenney 	}
23394102adabSPaul E. McKenney }
23404102adabSPaul E. McKenney 
23414102adabSPaul E. McKenney /*
23424102adabSPaul E. McKenney  * Check to see if there is a new grace period of which this CPU
23434102adabSPaul E. McKenney  * is not yet aware, and if so, set up local rcu_data state for it.
23444102adabSPaul E. McKenney  * Otherwise, see if this CPU has just passed through its first
23454102adabSPaul E. McKenney  * quiescent state for this grace period, and record that fact if so.
23464102adabSPaul E. McKenney  */
23474102adabSPaul E. McKenney static void
23488087d3e3SPaul E. McKenney rcu_check_quiescent_state(struct rcu_data *rdp)
23494102adabSPaul E. McKenney {
23504102adabSPaul E. McKenney 	/* Check for grace-period ends and beginnings. */
235115cabdffSPaul E. McKenney 	note_gp_changes(rdp);
23524102adabSPaul E. McKenney 
23534102adabSPaul E. McKenney 	/*
23544102adabSPaul E. McKenney 	 * Does this CPU still need to do its part for current grace period?
23554102adabSPaul E. McKenney 	 * If no, return and let the other CPUs do their part as well.
23564102adabSPaul E. McKenney 	 */
235797c668b8SPaul E. McKenney 	if (!rdp->core_needs_qs)
23584102adabSPaul E. McKenney 		return;
23594102adabSPaul E. McKenney 
23604102adabSPaul E. McKenney 	/*
23614102adabSPaul E. McKenney 	 * Was there a quiescent state since the beginning of the grace
23624102adabSPaul E. McKenney 	 * period? If no, then exit and wait for the next call.
23634102adabSPaul E. McKenney 	 */
23643a19b46aSPaul E. McKenney 	if (rdp->cpu_no_qs.b.norm)
23654102adabSPaul E. McKenney 		return;
23664102adabSPaul E. McKenney 
23674102adabSPaul E. McKenney 	/*
23684102adabSPaul E. McKenney 	 * Tell RCU we are done (but rcu_report_qs_rdp() will be the
23694102adabSPaul E. McKenney 	 * judge of that).
23704102adabSPaul E. McKenney 	 */
237133085c46SPaul E. McKenney 	rcu_report_qs_rdp(rdp->cpu, rdp);
23724102adabSPaul E. McKenney }
23734102adabSPaul E. McKenney 
23744102adabSPaul E. McKenney /*
2375780cd590SPaul E. McKenney  * Near the end of the offline process.  Trace the fact that this CPU
2376780cd590SPaul E. McKenney  * is going offline.
23774102adabSPaul E. McKenney  */
2378780cd590SPaul E. McKenney int rcutree_dying_cpu(unsigned int cpu)
23794102adabSPaul E. McKenney {
2380477351f7SPaul E. McKenney 	RCU_TRACE(bool blkd;)
2381da1df50dSPaul E. McKenney 	RCU_TRACE(struct rcu_data *rdp = this_cpu_ptr(&rcu_data);)
238288a4976dSPaul E. McKenney 	RCU_TRACE(struct rcu_node *rnp = rdp->mynode;)
23834102adabSPaul E. McKenney 
2384ea46351cSPaul E. McKenney 	if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
2385780cd590SPaul E. McKenney 		return 0;
2386ea46351cSPaul E. McKenney 
2387477351f7SPaul E. McKenney 	RCU_TRACE(blkd = !!(rnp->qsmask & rdp->grpmask);)
2388780cd590SPaul E. McKenney 	trace_rcu_grace_period(rcu_state.name, rnp->gp_seq,
2389477351f7SPaul E. McKenney 			       blkd ? TPS("cpuofl") : TPS("cpuofl-bgp"));
2390780cd590SPaul E. McKenney 	return 0;
23914102adabSPaul E. McKenney }
23924102adabSPaul E. McKenney 
23934102adabSPaul E. McKenney /*
23948af3a5e7SPaul E. McKenney  * All CPUs for the specified rcu_node structure have gone offline,
23958af3a5e7SPaul E. McKenney  * and all tasks that were preempted within an RCU read-side critical
23968af3a5e7SPaul E. McKenney  * section while running on one of those CPUs have since exited their RCU
23978af3a5e7SPaul E. McKenney  * read-side critical section.  Some other CPU is reporting this fact with
23988af3a5e7SPaul E. McKenney  * the specified rcu_node structure's ->lock held and interrupts disabled.
23998af3a5e7SPaul E. McKenney  * This function therefore goes up the tree of rcu_node structures,
24008af3a5e7SPaul E. McKenney  * clearing the corresponding bits in the ->qsmaskinit fields.  Note that
24018af3a5e7SPaul E. McKenney  * the leaf rcu_node structure's ->qsmaskinit field has already been
2402c50cbe53SPaul E. McKenney  * updated.
24038af3a5e7SPaul E. McKenney  *
24048af3a5e7SPaul E. McKenney  * This function does check that the specified rcu_node structure has
24058af3a5e7SPaul E. McKenney  * all CPUs offline and no blocked tasks, so it is OK to invoke it
24068af3a5e7SPaul E. McKenney  * prematurely.  That said, invoking it after the fact will cost you
24078af3a5e7SPaul E. McKenney  * a needless lock acquisition.  So once it has done its work, don't
24088af3a5e7SPaul E. McKenney  * invoke it again.
24098af3a5e7SPaul E. McKenney  */
24108af3a5e7SPaul E. McKenney static void rcu_cleanup_dead_rnp(struct rcu_node *rnp_leaf)
24118af3a5e7SPaul E. McKenney {
24128af3a5e7SPaul E. McKenney 	long mask;
24138af3a5e7SPaul E. McKenney 	struct rcu_node *rnp = rnp_leaf;
24148af3a5e7SPaul E. McKenney 
2415962aff03SPaul E. McKenney 	raw_lockdep_assert_held_rcu_node(rnp_leaf);
2416ea46351cSPaul E. McKenney 	if (!IS_ENABLED(CONFIG_HOTPLUG_CPU) ||
2417962aff03SPaul E. McKenney 	    WARN_ON_ONCE(rnp_leaf->qsmaskinit) ||
2418962aff03SPaul E. McKenney 	    WARN_ON_ONCE(rcu_preempt_has_tasks(rnp_leaf)))
24198af3a5e7SPaul E. McKenney 		return;
24208af3a5e7SPaul E. McKenney 	for (;;) {
24218af3a5e7SPaul E. McKenney 		mask = rnp->grpmask;
24228af3a5e7SPaul E. McKenney 		rnp = rnp->parent;
24238af3a5e7SPaul E. McKenney 		if (!rnp)
24248af3a5e7SPaul E. McKenney 			break;
24252a67e741SPeter Zijlstra 		raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
24268af3a5e7SPaul E. McKenney 		rnp->qsmaskinit &= ~mask;
2427962aff03SPaul E. McKenney 		/* Between grace periods, so better already be zero! */
2428962aff03SPaul E. McKenney 		WARN_ON_ONCE(rnp->qsmask);
24298af3a5e7SPaul E. McKenney 		if (rnp->qsmaskinit) {
243067c583a7SBoqun Feng 			raw_spin_unlock_rcu_node(rnp);
243167c583a7SBoqun Feng 			/* irqs remain disabled. */
24328af3a5e7SPaul E. McKenney 			return;
24338af3a5e7SPaul E. McKenney 		}
243467c583a7SBoqun Feng 		raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */
24358af3a5e7SPaul E. McKenney 	}
24368af3a5e7SPaul E. McKenney }
24378af3a5e7SPaul E. McKenney 
24388af3a5e7SPaul E. McKenney /*
24394102adabSPaul E. McKenney  * The CPU has been completely removed, and some other CPU is reporting
2440a58163d8SPaul E. McKenney  * this fact from process context.  Do the remainder of the cleanup.
2441a58163d8SPaul E. McKenney  * There can only be one CPU hotplug operation at a time, so no need for
2442a58163d8SPaul E. McKenney  * explicit locking.
24434102adabSPaul E. McKenney  */
2444780cd590SPaul E. McKenney int rcutree_dead_cpu(unsigned int cpu)
24454102adabSPaul E. McKenney {
2446da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
24474102adabSPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;  /* Outgoing CPU's rdp & rnp. */
24484102adabSPaul E. McKenney 
2449ea46351cSPaul E. McKenney 	if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
2450780cd590SPaul E. McKenney 		return 0;
2451ea46351cSPaul E. McKenney 
24524102adabSPaul E. McKenney 	/* Adjust any no-longer-needed kthreads. */
24534102adabSPaul E. McKenney 	rcu_boost_kthread_setaffinity(rnp, -1);
2454780cd590SPaul E. McKenney 	/* Do any needed no-CB deferred wakeups from this CPU. */
2455780cd590SPaul E. McKenney 	do_nocb_deferred_wakeup(per_cpu_ptr(&rcu_data, cpu));
2456780cd590SPaul E. McKenney 	return 0;
24574102adabSPaul E. McKenney }
24584102adabSPaul E. McKenney 
24594102adabSPaul E. McKenney /*
24604102adabSPaul E. McKenney  * Invoke any RCU callbacks that have made it to the end of their grace
24614102adabSPaul E. McKenney  * period.  Thottle as specified by rdp->blimit.
24624102adabSPaul E. McKenney  */
24635bb5d09cSPaul E. McKenney static void rcu_do_batch(struct rcu_data *rdp)
24644102adabSPaul E. McKenney {
24654102adabSPaul E. McKenney 	unsigned long flags;
246615fecf89SPaul E. McKenney 	struct rcu_head *rhp;
246715fecf89SPaul E. McKenney 	struct rcu_cblist rcl = RCU_CBLIST_INITIALIZER(rcl);
246815fecf89SPaul E. McKenney 	long bl, count;
24694102adabSPaul E. McKenney 
24704102adabSPaul E. McKenney 	/* If no callbacks are ready, just return. */
247115fecf89SPaul E. McKenney 	if (!rcu_segcblist_ready_cbs(&rdp->cblist)) {
24723c779dfeSPaul E. McKenney 		trace_rcu_batch_start(rcu_state.name,
247315fecf89SPaul E. McKenney 				      rcu_segcblist_n_lazy_cbs(&rdp->cblist),
247415fecf89SPaul E. McKenney 				      rcu_segcblist_n_cbs(&rdp->cblist), 0);
24753c779dfeSPaul E. McKenney 		trace_rcu_batch_end(rcu_state.name, 0,
247615fecf89SPaul E. McKenney 				    !rcu_segcblist_empty(&rdp->cblist),
24774102adabSPaul E. McKenney 				    need_resched(), is_idle_task(current),
24784102adabSPaul E. McKenney 				    rcu_is_callbacks_kthread());
24794102adabSPaul E. McKenney 		return;
24804102adabSPaul E. McKenney 	}
24814102adabSPaul E. McKenney 
24824102adabSPaul E. McKenney 	/*
24834102adabSPaul E. McKenney 	 * Extract the list of ready callbacks, disabling to prevent
248415fecf89SPaul E. McKenney 	 * races with call_rcu() from interrupt handlers.  Leave the
248515fecf89SPaul E. McKenney 	 * callback counts, as rcu_barrier() needs to be conservative.
24864102adabSPaul E. McKenney 	 */
24874102adabSPaul E. McKenney 	local_irq_save(flags);
24884102adabSPaul E. McKenney 	WARN_ON_ONCE(cpu_is_offline(smp_processor_id()));
24894102adabSPaul E. McKenney 	bl = rdp->blimit;
24903c779dfeSPaul E. McKenney 	trace_rcu_batch_start(rcu_state.name,
24913c779dfeSPaul E. McKenney 			      rcu_segcblist_n_lazy_cbs(&rdp->cblist),
249215fecf89SPaul E. McKenney 			      rcu_segcblist_n_cbs(&rdp->cblist), bl);
249315fecf89SPaul E. McKenney 	rcu_segcblist_extract_done_cbs(&rdp->cblist, &rcl);
24944102adabSPaul E. McKenney 	local_irq_restore(flags);
24954102adabSPaul E. McKenney 
24964102adabSPaul E. McKenney 	/* Invoke callbacks. */
249715fecf89SPaul E. McKenney 	rhp = rcu_cblist_dequeue(&rcl);
249815fecf89SPaul E. McKenney 	for (; rhp; rhp = rcu_cblist_dequeue(&rcl)) {
249915fecf89SPaul E. McKenney 		debug_rcu_head_unqueue(rhp);
25003c779dfeSPaul E. McKenney 		if (__rcu_reclaim(rcu_state.name, rhp))
250115fecf89SPaul E. McKenney 			rcu_cblist_dequeued_lazy(&rcl);
250215fecf89SPaul E. McKenney 		/*
250315fecf89SPaul E. McKenney 		 * Stop only if limit reached and CPU has something to do.
250415fecf89SPaul E. McKenney 		 * Note: The rcl structure counts down from zero.
250515fecf89SPaul E. McKenney 		 */
25064b27f20bSPaul E. McKenney 		if (-rcl.len >= bl &&
25074102adabSPaul E. McKenney 		    (need_resched() ||
25084102adabSPaul E. McKenney 		     (!is_idle_task(current) && !rcu_is_callbacks_kthread())))
25094102adabSPaul E. McKenney 			break;
25104102adabSPaul E. McKenney 	}
25114102adabSPaul E. McKenney 
25124102adabSPaul E. McKenney 	local_irq_save(flags);
25134b27f20bSPaul E. McKenney 	count = -rcl.len;
25143c779dfeSPaul E. McKenney 	trace_rcu_batch_end(rcu_state.name, count, !!rcl.head, need_resched(),
25158ef0f37eSPaul E. McKenney 			    is_idle_task(current), rcu_is_callbacks_kthread());
25164102adabSPaul E. McKenney 
251715fecf89SPaul E. McKenney 	/* Update counts and requeue any remaining callbacks. */
251815fecf89SPaul E. McKenney 	rcu_segcblist_insert_done_cbs(&rdp->cblist, &rcl);
25194102adabSPaul E. McKenney 	smp_mb(); /* List handling before counting for rcu_barrier(). */
252015fecf89SPaul E. McKenney 	rcu_segcblist_insert_count(&rdp->cblist, &rcl);
25214102adabSPaul E. McKenney 
25224102adabSPaul E. McKenney 	/* Reinstate batch limit if we have worked down the excess. */
252315fecf89SPaul E. McKenney 	count = rcu_segcblist_n_cbs(&rdp->cblist);
252415fecf89SPaul E. McKenney 	if (rdp->blimit == LONG_MAX && count <= qlowmark)
25254102adabSPaul E. McKenney 		rdp->blimit = blimit;
25264102adabSPaul E. McKenney 
25274102adabSPaul E. McKenney 	/* Reset ->qlen_last_fqs_check trigger if enough CBs have drained. */
252815fecf89SPaul E. McKenney 	if (count == 0 && rdp->qlen_last_fqs_check != 0) {
25294102adabSPaul E. McKenney 		rdp->qlen_last_fqs_check = 0;
25303c779dfeSPaul E. McKenney 		rdp->n_force_qs_snap = rcu_state.n_force_qs;
253115fecf89SPaul E. McKenney 	} else if (count < rdp->qlen_last_fqs_check - qhimark)
253215fecf89SPaul E. McKenney 		rdp->qlen_last_fqs_check = count;
2533efd88b02SPaul E. McKenney 
2534efd88b02SPaul E. McKenney 	/*
2535efd88b02SPaul E. McKenney 	 * The following usually indicates a double call_rcu().  To track
2536efd88b02SPaul E. McKenney 	 * this down, try building with CONFIG_DEBUG_OBJECTS_RCU_HEAD=y.
2537efd88b02SPaul E. McKenney 	 */
253815fecf89SPaul E. McKenney 	WARN_ON_ONCE(rcu_segcblist_empty(&rdp->cblist) != (count == 0));
25394102adabSPaul E. McKenney 
25404102adabSPaul E. McKenney 	local_irq_restore(flags);
25414102adabSPaul E. McKenney 
25424102adabSPaul E. McKenney 	/* Re-invoke RCU core processing if there are callbacks remaining. */
254315fecf89SPaul E. McKenney 	if (rcu_segcblist_ready_cbs(&rdp->cblist))
25444102adabSPaul E. McKenney 		invoke_rcu_core();
25454102adabSPaul E. McKenney }
25464102adabSPaul E. McKenney 
25474102adabSPaul E. McKenney /*
25484102adabSPaul E. McKenney  * Check to see if this CPU is in a non-context-switch quiescent state
25494102adabSPaul E. McKenney  * (user mode or idle loop for rcu, non-softirq execution for rcu_bh).
25504102adabSPaul E. McKenney  * Also schedule RCU core processing.
25514102adabSPaul E. McKenney  *
25524102adabSPaul E. McKenney  * This function must be called from hardirq context.  It is normally
25535403d367SPaul E. McKenney  * invoked from the scheduling-clock interrupt.
25544102adabSPaul E. McKenney  */
2555c3377c2dSPaul E. McKenney void rcu_check_callbacks(int user)
25564102adabSPaul E. McKenney {
25574102adabSPaul E. McKenney 	trace_rcu_utilization(TPS("Start scheduler-tick"));
25584102adabSPaul E. McKenney 	increment_cpu_stall_ticks();
255945975c7dSPaul E. McKenney 	rcu_flavor_check_callbacks(user);
2560e3950ecdSPaul E. McKenney 	if (rcu_pending())
25614102adabSPaul E. McKenney 		invoke_rcu_core();
256207f27570SByungchul Park 
25634102adabSPaul E. McKenney 	trace_rcu_utilization(TPS("End scheduler-tick"));
25644102adabSPaul E. McKenney }
25654102adabSPaul E. McKenney 
25664102adabSPaul E. McKenney /*
25674102adabSPaul E. McKenney  * Scan the leaf rcu_node structures, processing dyntick state for any that
25684102adabSPaul E. McKenney  * have not yet encountered a quiescent state, using the function specified.
25694102adabSPaul E. McKenney  * Also initiate boosting for any threads blocked on the root rcu_node.
25704102adabSPaul E. McKenney  *
25714102adabSPaul E. McKenney  * The caller must have suppressed start of new grace periods.
25724102adabSPaul E. McKenney  */
2573e9ecb780SPaul E. McKenney static void force_qs_rnp(int (*f)(struct rcu_data *rsp))
25744102adabSPaul E. McKenney {
25754102adabSPaul E. McKenney 	int cpu;
25764102adabSPaul E. McKenney 	unsigned long flags;
25774102adabSPaul E. McKenney 	unsigned long mask;
25784102adabSPaul E. McKenney 	struct rcu_node *rnp;
25794102adabSPaul E. McKenney 
2580aedf4ba9SPaul E. McKenney 	rcu_for_each_leaf_node(rnp) {
2581cee43939SPaul E. McKenney 		cond_resched_tasks_rcu_qs();
25824102adabSPaul E. McKenney 		mask = 0;
25832a67e741SPeter Zijlstra 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
25844102adabSPaul E. McKenney 		if (rnp->qsmask == 0) {
258545975c7dSPaul E. McKenney 			if (!IS_ENABLED(CONFIG_PREEMPT) ||
2586a77da14cSPaul E. McKenney 			    rcu_preempt_blocked_readers_cgp(rnp)) {
2587a77da14cSPaul E. McKenney 				/*
2588a77da14cSPaul E. McKenney 				 * No point in scanning bits because they
2589a77da14cSPaul E. McKenney 				 * are all zero.  But we might need to
2590a77da14cSPaul E. McKenney 				 * priority-boost blocked readers.
2591a77da14cSPaul E. McKenney 				 */
2592a77da14cSPaul E. McKenney 				rcu_initiate_boost(rnp, flags);
2593a77da14cSPaul E. McKenney 				/* rcu_initiate_boost() releases rnp->lock */
25944102adabSPaul E. McKenney 				continue;
25954102adabSPaul E. McKenney 			}
259692816435SPaul E. McKenney 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
259792816435SPaul E. McKenney 			continue;
2598a77da14cSPaul E. McKenney 		}
2599bc75e999SMark Rutland 		for_each_leaf_node_possible_cpu(rnp, cpu) {
2600bc75e999SMark Rutland 			unsigned long bit = leaf_node_cpu_bit(rnp, cpu);
26014102adabSPaul E. McKenney 			if ((rnp->qsmask & bit) != 0) {
2602da1df50dSPaul E. McKenney 				if (f(per_cpu_ptr(&rcu_data, cpu)))
26034102adabSPaul E. McKenney 					mask |= bit;
26044102adabSPaul E. McKenney 			}
26054102adabSPaul E. McKenney 		}
26064102adabSPaul E. McKenney 		if (mask != 0) {
2607c9a24e2dSPaul E. McKenney 			/* Idle/offline CPUs, report (releases rnp->lock). */
2608b50912d0SPaul E. McKenney 			rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
26090aa04b05SPaul E. McKenney 		} else {
26100aa04b05SPaul E. McKenney 			/* Nothing to do here, so just drop the lock. */
261167c583a7SBoqun Feng 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
26124102adabSPaul E. McKenney 		}
26134102adabSPaul E. McKenney 	}
26140aa04b05SPaul E. McKenney }
26154102adabSPaul E. McKenney 
26164102adabSPaul E. McKenney /*
26174102adabSPaul E. McKenney  * Force quiescent states on reluctant CPUs, and also detect which
26184102adabSPaul E. McKenney  * CPUs are in dyntick-idle mode.
26194102adabSPaul E. McKenney  */
2620e9ecb780SPaul E. McKenney static void force_quiescent_state(void)
26214102adabSPaul E. McKenney {
26224102adabSPaul E. McKenney 	unsigned long flags;
26234102adabSPaul E. McKenney 	bool ret;
26244102adabSPaul E. McKenney 	struct rcu_node *rnp;
26254102adabSPaul E. McKenney 	struct rcu_node *rnp_old = NULL;
26264102adabSPaul E. McKenney 
26274102adabSPaul E. McKenney 	/* Funnel through hierarchy to reduce memory contention. */
2628da1df50dSPaul E. McKenney 	rnp = __this_cpu_read(rcu_data.mynode);
26294102adabSPaul E. McKenney 	for (; rnp != NULL; rnp = rnp->parent) {
263067a0edbfSPaul E. McKenney 		ret = (READ_ONCE(rcu_state.gp_flags) & RCU_GP_FLAG_FQS) ||
26314102adabSPaul E. McKenney 		      !raw_spin_trylock(&rnp->fqslock);
26324102adabSPaul E. McKenney 		if (rnp_old != NULL)
26334102adabSPaul E. McKenney 			raw_spin_unlock(&rnp_old->fqslock);
2634d62df573SPaul E. McKenney 		if (ret)
26354102adabSPaul E. McKenney 			return;
26364102adabSPaul E. McKenney 		rnp_old = rnp;
26374102adabSPaul E. McKenney 	}
2638336a4f6cSPaul E. McKenney 	/* rnp_old == rcu_get_root(), rnp == NULL. */
26394102adabSPaul E. McKenney 
26404102adabSPaul E. McKenney 	/* Reached the root of the rcu_node tree, acquire lock. */
26412a67e741SPeter Zijlstra 	raw_spin_lock_irqsave_rcu_node(rnp_old, flags);
26424102adabSPaul E. McKenney 	raw_spin_unlock(&rnp_old->fqslock);
264367a0edbfSPaul E. McKenney 	if (READ_ONCE(rcu_state.gp_flags) & RCU_GP_FLAG_FQS) {
264467c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp_old, flags);
26454102adabSPaul E. McKenney 		return;  /* Someone beat us to it. */
26464102adabSPaul E. McKenney 	}
264767a0edbfSPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_flags,
264867a0edbfSPaul E. McKenney 		   READ_ONCE(rcu_state.gp_flags) | RCU_GP_FLAG_FQS);
264967c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp_old, flags);
2650532c00c9SPaul E. McKenney 	rcu_gp_kthread_wake();
26514102adabSPaul E. McKenney }
26524102adabSPaul E. McKenney 
26534102adabSPaul E. McKenney /*
265426d950a9SPaul E. McKenney  * This function checks for grace-period requests that fail to motivate
265526d950a9SPaul E. McKenney  * RCU to come out of its idle mode.
265626d950a9SPaul E. McKenney  */
265726d950a9SPaul E. McKenney static void
2658b96f9dc4SPaul E. McKenney rcu_check_gp_start_stall(struct rcu_node *rnp, struct rcu_data *rdp)
265926d950a9SPaul E. McKenney {
2660b06ae25aSPaul E. McKenney 	const unsigned long gpssdelay = rcu_jiffies_till_stall_check() * HZ;
266126d950a9SPaul E. McKenney 	unsigned long flags;
266226d950a9SPaul E. McKenney 	unsigned long j;
2663336a4f6cSPaul E. McKenney 	struct rcu_node *rnp_root = rcu_get_root();
266426d950a9SPaul E. McKenney 	static atomic_t warned = ATOMIC_INIT(0);
266526d950a9SPaul E. McKenney 
2666de8e8730SPaul E. McKenney 	if (!IS_ENABLED(CONFIG_PROVE_RCU) || rcu_gp_in_progress() ||
26677a1d0f23SPaul E. McKenney 	    ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed))
266826d950a9SPaul E. McKenney 		return;
266926d950a9SPaul E. McKenney 	j = jiffies; /* Expensive access, and in common case don't get here. */
267067a0edbfSPaul E. McKenney 	if (time_before(j, READ_ONCE(rcu_state.gp_req_activity) + gpssdelay) ||
267167a0edbfSPaul E. McKenney 	    time_before(j, READ_ONCE(rcu_state.gp_activity) + gpssdelay) ||
267226d950a9SPaul E. McKenney 	    atomic_read(&warned))
267326d950a9SPaul E. McKenney 		return;
267426d950a9SPaul E. McKenney 
267526d950a9SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
267626d950a9SPaul E. McKenney 	j = jiffies;
2677de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress() ||
26787a1d0f23SPaul E. McKenney 	    ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed) ||
267967a0edbfSPaul E. McKenney 	    time_before(j, READ_ONCE(rcu_state.gp_req_activity) + gpssdelay) ||
268067a0edbfSPaul E. McKenney 	    time_before(j, READ_ONCE(rcu_state.gp_activity) + gpssdelay) ||
268126d950a9SPaul E. McKenney 	    atomic_read(&warned)) {
268226d950a9SPaul E. McKenney 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
268326d950a9SPaul E. McKenney 		return;
268426d950a9SPaul E. McKenney 	}
268526d950a9SPaul E. McKenney 	/* Hold onto the leaf lock to make others see warned==1. */
268626d950a9SPaul E. McKenney 
268726d950a9SPaul E. McKenney 	if (rnp_root != rnp)
268826d950a9SPaul E. McKenney 		raw_spin_lock_rcu_node(rnp_root); /* irqs already disabled. */
268926d950a9SPaul E. McKenney 	j = jiffies;
2690de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress() ||
26917a1d0f23SPaul E. McKenney 	    ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed) ||
269267a0edbfSPaul E. McKenney 	    time_before(j, rcu_state.gp_req_activity + gpssdelay) ||
269367a0edbfSPaul E. McKenney 	    time_before(j, rcu_state.gp_activity + gpssdelay) ||
269426d950a9SPaul E. McKenney 	    atomic_xchg(&warned, 1)) {
269526d950a9SPaul E. McKenney 		raw_spin_unlock_rcu_node(rnp_root); /* irqs remain disabled. */
269626d950a9SPaul E. McKenney 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
269726d950a9SPaul E. McKenney 		return;
269826d950a9SPaul E. McKenney 	}
2699b06ae25aSPaul E. McKenney 	pr_alert("%s: g%ld->%ld gar:%lu ga:%lu f%#x gs:%d %s->state:%#lx\n",
270067a0edbfSPaul E. McKenney 		 __func__, (long)READ_ONCE(rcu_state.gp_seq),
27017a1d0f23SPaul E. McKenney 		 (long)READ_ONCE(rnp_root->gp_seq_needed),
270267a0edbfSPaul E. McKenney 		 j - rcu_state.gp_req_activity, j - rcu_state.gp_activity,
270367a0edbfSPaul E. McKenney 		 rcu_state.gp_flags, rcu_state.gp_state, rcu_state.name,
270467a0edbfSPaul E. McKenney 		 rcu_state.gp_kthread ? rcu_state.gp_kthread->state : 0x1ffffL);
270526d950a9SPaul E. McKenney 	WARN_ON(1);
270626d950a9SPaul E. McKenney 	if (rnp_root != rnp)
270726d950a9SPaul E. McKenney 		raw_spin_unlock_rcu_node(rnp_root);
270826d950a9SPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
270926d950a9SPaul E. McKenney }
271026d950a9SPaul E. McKenney 
271126d950a9SPaul E. McKenney /*
2712b049fdf8SPaul E. McKenney  * This does the RCU core processing work for the specified rcu_data
2713b049fdf8SPaul E. McKenney  * structures.  This may be called only from the CPU to whom the rdp
2714b049fdf8SPaul E. McKenney  * belongs.
27154102adabSPaul E. McKenney  */
2716b049fdf8SPaul E. McKenney static __latent_entropy void rcu_process_callbacks(struct softirq_action *unused)
27174102adabSPaul E. McKenney {
27184102adabSPaul E. McKenney 	unsigned long flags;
2719da1df50dSPaul E. McKenney 	struct rcu_data *rdp = raw_cpu_ptr(&rcu_data);
272026d950a9SPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;
27214102adabSPaul E. McKenney 
2722b049fdf8SPaul E. McKenney 	if (cpu_is_offline(smp_processor_id()))
2723b049fdf8SPaul E. McKenney 		return;
2724b049fdf8SPaul E. McKenney 	trace_rcu_utilization(TPS("Start RCU core"));
272550dc7defSNicholas Mc Guire 	WARN_ON_ONCE(!rdp->beenonline);
27264102adabSPaul E. McKenney 
27273e310098SPaul E. McKenney 	/* Report any deferred quiescent states if preemption enabled. */
27283e310098SPaul E. McKenney 	if (!(preempt_count() & PREEMPT_MASK))
27293e310098SPaul E. McKenney 		rcu_preempt_deferred_qs(current);
27303e310098SPaul E. McKenney 	else if (rcu_preempt_need_deferred_qs(current))
27313e310098SPaul E. McKenney 		resched_cpu(rdp->cpu); /* Provoke future context switch. */
27323e310098SPaul E. McKenney 
27334102adabSPaul E. McKenney 	/* Update RCU state based on any recent quiescent states. */
27348087d3e3SPaul E. McKenney 	rcu_check_quiescent_state(rdp);
27354102adabSPaul E. McKenney 
2736bd7af846SPaul E. McKenney 	/* No grace period and unregistered callbacks? */
2737de8e8730SPaul E. McKenney 	if (!rcu_gp_in_progress() &&
2738bd7af846SPaul E. McKenney 	    rcu_segcblist_is_enabled(&rdp->cblist)) {
27394102adabSPaul E. McKenney 		local_irq_save(flags);
2740e44e73caSPaul E. McKenney 		if (!rcu_segcblist_restempty(&rdp->cblist, RCU_NEXT_READY_TAIL))
2741c6e09b97SPaul E. McKenney 			rcu_accelerate_cbs_unlocked(rnp, rdp);
2742bd7af846SPaul E. McKenney 		local_irq_restore(flags);
27434102adabSPaul E. McKenney 	}
27444102adabSPaul E. McKenney 
2745b96f9dc4SPaul E. McKenney 	rcu_check_gp_start_stall(rnp, rdp);
274626d950a9SPaul E. McKenney 
27474102adabSPaul E. McKenney 	/* If there are callbacks ready, invoke them. */
274815fecf89SPaul E. McKenney 	if (rcu_segcblist_ready_cbs(&rdp->cblist))
2749aff4e9edSPaul E. McKenney 		invoke_rcu_callbacks(rdp);
275096d3fd0dSPaul E. McKenney 
275196d3fd0dSPaul E. McKenney 	/* Do any needed deferred wakeups of rcuo kthreads. */
275296d3fd0dSPaul E. McKenney 	do_nocb_deferred_wakeup(rdp);
27534102adabSPaul E. McKenney 	trace_rcu_utilization(TPS("End RCU core"));
27544102adabSPaul E. McKenney }
27554102adabSPaul E. McKenney 
27564102adabSPaul E. McKenney /*
27574102adabSPaul E. McKenney  * Schedule RCU callback invocation.  If the specified type of RCU
27584102adabSPaul E. McKenney  * does not support RCU priority boosting, just do a direct call,
27594102adabSPaul E. McKenney  * otherwise wake up the per-CPU kernel kthread.  Note that because we
2760924df8a0SPaul E. McKenney  * are running on the current CPU with softirqs disabled, the
27614102adabSPaul E. McKenney  * rcu_cpu_kthread_task cannot disappear out from under us.
27624102adabSPaul E. McKenney  */
2763aff4e9edSPaul E. McKenney static void invoke_rcu_callbacks(struct rcu_data *rdp)
27644102adabSPaul E. McKenney {
27657d0ae808SPaul E. McKenney 	if (unlikely(!READ_ONCE(rcu_scheduler_fully_active)))
27664102adabSPaul E. McKenney 		return;
27673c779dfeSPaul E. McKenney 	if (likely(!rcu_state.boost)) {
27685bb5d09cSPaul E. McKenney 		rcu_do_batch(rdp);
27694102adabSPaul E. McKenney 		return;
27704102adabSPaul E. McKenney 	}
27714102adabSPaul E. McKenney 	invoke_rcu_callbacks_kthread();
27724102adabSPaul E. McKenney }
27734102adabSPaul E. McKenney 
27744102adabSPaul E. McKenney static void invoke_rcu_core(void)
27754102adabSPaul E. McKenney {
27764102adabSPaul E. McKenney 	if (cpu_online(smp_processor_id()))
27774102adabSPaul E. McKenney 		raise_softirq(RCU_SOFTIRQ);
27784102adabSPaul E. McKenney }
27794102adabSPaul E. McKenney 
27804102adabSPaul E. McKenney /*
27814102adabSPaul E. McKenney  * Handle any core-RCU processing required by a call_rcu() invocation.
27824102adabSPaul E. McKenney  */
27835c7d8967SPaul E. McKenney static void __call_rcu_core(struct rcu_data *rdp, struct rcu_head *head,
27845c7d8967SPaul E. McKenney 			    unsigned long flags)
27854102adabSPaul E. McKenney {
27864102adabSPaul E. McKenney 	/*
27874102adabSPaul E. McKenney 	 * If called from an extended quiescent state, invoke the RCU
27884102adabSPaul E. McKenney 	 * core in order to force a re-evaluation of RCU's idleness.
27894102adabSPaul E. McKenney 	 */
27909910affaSYao Dongdong 	if (!rcu_is_watching())
27914102adabSPaul E. McKenney 		invoke_rcu_core();
27924102adabSPaul E. McKenney 
27934102adabSPaul E. McKenney 	/* If interrupts were disabled or CPU offline, don't invoke RCU core. */
27944102adabSPaul E. McKenney 	if (irqs_disabled_flags(flags) || cpu_is_offline(smp_processor_id()))
27954102adabSPaul E. McKenney 		return;
27964102adabSPaul E. McKenney 
27974102adabSPaul E. McKenney 	/*
27984102adabSPaul E. McKenney 	 * Force the grace period if too many callbacks or too long waiting.
27994102adabSPaul E. McKenney 	 * Enforce hysteresis, and don't invoke force_quiescent_state()
28004102adabSPaul E. McKenney 	 * if some other CPU has recently done so.  Also, don't bother
28014102adabSPaul E. McKenney 	 * invoking force_quiescent_state() if the newly enqueued callback
28024102adabSPaul E. McKenney 	 * is the only one waiting for a grace period to complete.
28034102adabSPaul E. McKenney 	 */
280415fecf89SPaul E. McKenney 	if (unlikely(rcu_segcblist_n_cbs(&rdp->cblist) >
280515fecf89SPaul E. McKenney 		     rdp->qlen_last_fqs_check + qhimark)) {
28064102adabSPaul E. McKenney 
28074102adabSPaul E. McKenney 		/* Are we ignoring a completed grace period? */
280815cabdffSPaul E. McKenney 		note_gp_changes(rdp);
28094102adabSPaul E. McKenney 
28104102adabSPaul E. McKenney 		/* Start a new grace period if one not already started. */
2811de8e8730SPaul E. McKenney 		if (!rcu_gp_in_progress()) {
2812c6e09b97SPaul E. McKenney 			rcu_accelerate_cbs_unlocked(rdp->mynode, rdp);
28134102adabSPaul E. McKenney 		} else {
28144102adabSPaul E. McKenney 			/* Give the grace period a kick. */
28154102adabSPaul E. McKenney 			rdp->blimit = LONG_MAX;
28165c7d8967SPaul E. McKenney 			if (rcu_state.n_force_qs == rdp->n_force_qs_snap &&
281715fecf89SPaul E. McKenney 			    rcu_segcblist_first_pend_cb(&rdp->cblist) != head)
2818e9ecb780SPaul E. McKenney 				force_quiescent_state();
28195c7d8967SPaul E. McKenney 			rdp->n_force_qs_snap = rcu_state.n_force_qs;
282015fecf89SPaul E. McKenney 			rdp->qlen_last_fqs_check = rcu_segcblist_n_cbs(&rdp->cblist);
28214102adabSPaul E. McKenney 		}
28224102adabSPaul E. McKenney 	}
28234102adabSPaul E. McKenney }
28244102adabSPaul E. McKenney 
28254102adabSPaul E. McKenney /*
28264102adabSPaul E. McKenney  * RCU callback function to leak a callback.
28274102adabSPaul E. McKenney  */
28284102adabSPaul E. McKenney static void rcu_leak_callback(struct rcu_head *rhp)
28294102adabSPaul E. McKenney {
28304102adabSPaul E. McKenney }
28314102adabSPaul E. McKenney 
28324102adabSPaul E. McKenney /*
28334102adabSPaul E. McKenney  * Helper function for call_rcu() and friends.  The cpu argument will
28344102adabSPaul E. McKenney  * normally be -1, indicating "currently running CPU".  It may specify
28354102adabSPaul E. McKenney  * a CPU only if that CPU is a no-CBs CPU.  Currently, only _rcu_barrier()
28364102adabSPaul E. McKenney  * is expected to specify a CPU.
28374102adabSPaul E. McKenney  */
28384102adabSPaul E. McKenney static void
28395c7d8967SPaul E. McKenney __call_rcu(struct rcu_head *head, rcu_callback_t func, int cpu, bool lazy)
28404102adabSPaul E. McKenney {
28414102adabSPaul E. McKenney 	unsigned long flags;
28424102adabSPaul E. McKenney 	struct rcu_data *rdp;
28434102adabSPaul E. McKenney 
2844b8f2ed53SPaul E. McKenney 	/* Misaligned rcu_head! */
2845b8f2ed53SPaul E. McKenney 	WARN_ON_ONCE((unsigned long)head & (sizeof(void *) - 1));
2846b8f2ed53SPaul E. McKenney 
28474102adabSPaul E. McKenney 	if (debug_rcu_head_queue(head)) {
2848fa3c6647SPaul E. McKenney 		/*
2849fa3c6647SPaul E. McKenney 		 * Probable double call_rcu(), so leak the callback.
2850fa3c6647SPaul E. McKenney 		 * Use rcu:rcu_callback trace event to find the previous
2851fa3c6647SPaul E. McKenney 		 * time callback was passed to __call_rcu().
2852fa3c6647SPaul E. McKenney 		 */
2853fa3c6647SPaul E. McKenney 		WARN_ONCE(1, "__call_rcu(): Double-freed CB %p->%pF()!!!\n",
2854fa3c6647SPaul E. McKenney 			  head, head->func);
28557d0ae808SPaul E. McKenney 		WRITE_ONCE(head->func, rcu_leak_callback);
28564102adabSPaul E. McKenney 		return;
28574102adabSPaul E. McKenney 	}
28584102adabSPaul E. McKenney 	head->func = func;
28594102adabSPaul E. McKenney 	head->next = NULL;
28604102adabSPaul E. McKenney 	local_irq_save(flags);
2861da1df50dSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
28624102adabSPaul E. McKenney 
28634102adabSPaul E. McKenney 	/* Add the callback to our list. */
286415fecf89SPaul E. McKenney 	if (unlikely(!rcu_segcblist_is_enabled(&rdp->cblist)) || cpu != -1) {
28654102adabSPaul E. McKenney 		int offline;
28664102adabSPaul E. McKenney 
28674102adabSPaul E. McKenney 		if (cpu != -1)
2868da1df50dSPaul E. McKenney 			rdp = per_cpu_ptr(&rcu_data, cpu);
2869143da9c2SPaul E. McKenney 		if (likely(rdp->mynode)) {
2870143da9c2SPaul E. McKenney 			/* Post-boot, so this should be for a no-CBs CPU. */
287196d3fd0dSPaul E. McKenney 			offline = !__call_rcu_nocb(rdp, head, lazy, flags);
28724102adabSPaul E. McKenney 			WARN_ON_ONCE(offline);
2873143da9c2SPaul E. McKenney 			/* Offline CPU, _call_rcu() illegal, leak callback.  */
28744102adabSPaul E. McKenney 			local_irq_restore(flags);
28754102adabSPaul E. McKenney 			return;
28764102adabSPaul E. McKenney 		}
2877143da9c2SPaul E. McKenney 		/*
2878143da9c2SPaul E. McKenney 		 * Very early boot, before rcu_init().  Initialize if needed
2879143da9c2SPaul E. McKenney 		 * and then drop through to queue the callback.
2880143da9c2SPaul E. McKenney 		 */
2881143da9c2SPaul E. McKenney 		BUG_ON(cpu != -1);
288234404ca8SPaul E. McKenney 		WARN_ON_ONCE(!rcu_is_watching());
288315fecf89SPaul E. McKenney 		if (rcu_segcblist_empty(&rdp->cblist))
288415fecf89SPaul E. McKenney 			rcu_segcblist_init(&rdp->cblist);
2885143da9c2SPaul E. McKenney 	}
288615fecf89SPaul E. McKenney 	rcu_segcblist_enqueue(&rdp->cblist, head, lazy);
288715fecf89SPaul E. McKenney 	if (!lazy)
28884102adabSPaul E. McKenney 		rcu_idle_count_callbacks_posted();
28894102adabSPaul E. McKenney 
28904102adabSPaul E. McKenney 	if (__is_kfree_rcu_offset((unsigned long)func))
28913c779dfeSPaul E. McKenney 		trace_rcu_kfree_callback(rcu_state.name, head,
28923c779dfeSPaul E. McKenney 					 (unsigned long)func,
289315fecf89SPaul E. McKenney 					 rcu_segcblist_n_lazy_cbs(&rdp->cblist),
289415fecf89SPaul E. McKenney 					 rcu_segcblist_n_cbs(&rdp->cblist));
28954102adabSPaul E. McKenney 	else
28963c779dfeSPaul E. McKenney 		trace_rcu_callback(rcu_state.name, head,
289715fecf89SPaul E. McKenney 				   rcu_segcblist_n_lazy_cbs(&rdp->cblist),
289815fecf89SPaul E. McKenney 				   rcu_segcblist_n_cbs(&rdp->cblist));
28994102adabSPaul E. McKenney 
29004102adabSPaul E. McKenney 	/* Go handle any RCU core processing required. */
29015c7d8967SPaul E. McKenney 	__call_rcu_core(rdp, head, flags);
29024102adabSPaul E. McKenney 	local_irq_restore(flags);
29034102adabSPaul E. McKenney }
29044102adabSPaul E. McKenney 
2905a68a2bb2SPaul E. McKenney /**
290645975c7dSPaul E. McKenney  * call_rcu() - Queue an RCU callback for invocation after a grace period.
2907a68a2bb2SPaul E. McKenney  * @head: structure to be used for queueing the RCU updates.
2908a68a2bb2SPaul E. McKenney  * @func: actual callback function to be invoked after the grace period
2909a68a2bb2SPaul E. McKenney  *
2910a68a2bb2SPaul E. McKenney  * The callback function will be invoked some time after a full grace
291145975c7dSPaul E. McKenney  * period elapses, in other words after all pre-existing RCU read-side
291245975c7dSPaul E. McKenney  * critical sections have completed.  However, the callback function
291345975c7dSPaul E. McKenney  * might well execute concurrently with RCU read-side critical sections
291445975c7dSPaul E. McKenney  * that started after call_rcu() was invoked.  RCU read-side critical
291545975c7dSPaul E. McKenney  * sections are delimited by rcu_read_lock() and rcu_read_unlock(), and
291645975c7dSPaul E. McKenney  * may be nested.  In addition, regions of code across which interrupts,
291745975c7dSPaul E. McKenney  * preemption, or softirqs have been disabled also serve as RCU read-side
291845975c7dSPaul E. McKenney  * critical sections.  This includes hardware interrupt handlers, softirq
291945975c7dSPaul E. McKenney  * handlers, and NMI handlers.
292027fdb35fSPaul E. McKenney  *
292145975c7dSPaul E. McKenney  * Note that all CPUs must agree that the grace period extended beyond
292245975c7dSPaul E. McKenney  * all pre-existing RCU read-side critical section.  On systems with more
292345975c7dSPaul E. McKenney  * than one CPU, this means that when "func()" is invoked, each CPU is
292445975c7dSPaul E. McKenney  * guaranteed to have executed a full memory barrier since the end of its
292545975c7dSPaul E. McKenney  * last RCU read-side critical section whose beginning preceded the call
292645975c7dSPaul E. McKenney  * to call_rcu().  It also means that each CPU executing an RCU read-side
292745975c7dSPaul E. McKenney  * critical section that continues beyond the start of "func()" must have
292845975c7dSPaul E. McKenney  * executed a memory barrier after the call_rcu() but before the beginning
292945975c7dSPaul E. McKenney  * of that RCU read-side critical section.  Note that these guarantees
293045975c7dSPaul E. McKenney  * include CPUs that are offline, idle, or executing in user mode, as
293145975c7dSPaul E. McKenney  * well as CPUs that are executing in the kernel.
2932a68a2bb2SPaul E. McKenney  *
293345975c7dSPaul E. McKenney  * Furthermore, if CPU A invoked call_rcu() and CPU B invoked the
293445975c7dSPaul E. McKenney  * resulting RCU callback function "func()", then both CPU A and CPU B are
293545975c7dSPaul E. McKenney  * guaranteed to execute a full memory barrier during the time interval
293645975c7dSPaul E. McKenney  * between the call to call_rcu() and the invocation of "func()" -- even
293745975c7dSPaul E. McKenney  * if CPU A and CPU B are the same CPU (but again only if the system has
293845975c7dSPaul E. McKenney  * more than one CPU).
293945975c7dSPaul E. McKenney  */
294045975c7dSPaul E. McKenney void call_rcu(struct rcu_head *head, rcu_callback_t func)
294145975c7dSPaul E. McKenney {
29425c7d8967SPaul E. McKenney 	__call_rcu(head, func, -1, 0);
294345975c7dSPaul E. McKenney }
294445975c7dSPaul E. McKenney EXPORT_SYMBOL_GPL(call_rcu);
294545975c7dSPaul E. McKenney 
294645975c7dSPaul E. McKenney /**
294745975c7dSPaul E. McKenney  * call_rcu_sched() - Queue an RCU for invocation after sched grace period.
294845975c7dSPaul E. McKenney  * @head: structure to be used for queueing the RCU updates.
294945975c7dSPaul E. McKenney  * @func: actual callback function to be invoked after the grace period
2950a68a2bb2SPaul E. McKenney  *
295145975c7dSPaul E. McKenney  * This is transitional.
29524102adabSPaul E. McKenney  */
2953b6a4ae76SBoqun Feng void call_rcu_sched(struct rcu_head *head, rcu_callback_t func)
29544102adabSPaul E. McKenney {
295545975c7dSPaul E. McKenney 	call_rcu(head, func);
29564102adabSPaul E. McKenney }
29574102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(call_rcu_sched);
29584102adabSPaul E. McKenney 
29594102adabSPaul E. McKenney /*
2960495aa969SAndreea-Cristina Bernat  * Queue an RCU callback for lazy invocation after a grace period.
2961495aa969SAndreea-Cristina Bernat  * This will likely be later named something like "call_rcu_lazy()",
2962495aa969SAndreea-Cristina Bernat  * but this change will require some way of tagging the lazy RCU
2963495aa969SAndreea-Cristina Bernat  * callbacks in the list of pending callbacks. Until then, this
2964495aa969SAndreea-Cristina Bernat  * function may only be called from __kfree_rcu().
2965495aa969SAndreea-Cristina Bernat  */
296698ece508SPaul E. McKenney void kfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
2967495aa969SAndreea-Cristina Bernat {
29685c7d8967SPaul E. McKenney 	__call_rcu(head, func, -1, 1);
2969495aa969SAndreea-Cristina Bernat }
2970495aa969SAndreea-Cristina Bernat EXPORT_SYMBOL_GPL(kfree_call_rcu);
2971495aa969SAndreea-Cristina Bernat 
29724102adabSPaul E. McKenney /**
29734102adabSPaul E. McKenney  * synchronize_sched - wait until an rcu-sched grace period has elapsed.
29744102adabSPaul E. McKenney  *
297545975c7dSPaul E. McKenney  * This is transitional.
29764102adabSPaul E. McKenney  */
29774102adabSPaul E. McKenney void synchronize_sched(void)
29784102adabSPaul E. McKenney {
297945975c7dSPaul E. McKenney 	synchronize_rcu();
29804102adabSPaul E. McKenney }
29814102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(synchronize_sched);
29824102adabSPaul E. McKenney 
29834102adabSPaul E. McKenney /**
2984765a3f4fSPaul E. McKenney  * get_state_synchronize_rcu - Snapshot current RCU state
2985765a3f4fSPaul E. McKenney  *
2986765a3f4fSPaul E. McKenney  * Returns a cookie that is used by a later call to cond_synchronize_rcu()
2987765a3f4fSPaul E. McKenney  * to determine whether or not a full grace period has elapsed in the
2988765a3f4fSPaul E. McKenney  * meantime.
2989765a3f4fSPaul E. McKenney  */
2990765a3f4fSPaul E. McKenney unsigned long get_state_synchronize_rcu(void)
2991765a3f4fSPaul E. McKenney {
2992765a3f4fSPaul E. McKenney 	/*
2993765a3f4fSPaul E. McKenney 	 * Any prior manipulation of RCU-protected data must happen
2994e4be81a2SPaul E. McKenney 	 * before the load from ->gp_seq.
2995765a3f4fSPaul E. McKenney 	 */
2996765a3f4fSPaul E. McKenney 	smp_mb();  /* ^^^ */
299716fc9c60SPaul E. McKenney 	return rcu_seq_snap(&rcu_state.gp_seq);
2998765a3f4fSPaul E. McKenney }
2999765a3f4fSPaul E. McKenney EXPORT_SYMBOL_GPL(get_state_synchronize_rcu);
3000765a3f4fSPaul E. McKenney 
3001765a3f4fSPaul E. McKenney /**
3002765a3f4fSPaul E. McKenney  * cond_synchronize_rcu - Conditionally wait for an RCU grace period
3003765a3f4fSPaul E. McKenney  *
3004765a3f4fSPaul E. McKenney  * @oldstate: return value from earlier call to get_state_synchronize_rcu()
3005765a3f4fSPaul E. McKenney  *
3006765a3f4fSPaul E. McKenney  * If a full RCU grace period has elapsed since the earlier call to
3007765a3f4fSPaul E. McKenney  * get_state_synchronize_rcu(), just return.  Otherwise, invoke
3008765a3f4fSPaul E. McKenney  * synchronize_rcu() to wait for a full grace period.
3009765a3f4fSPaul E. McKenney  *
3010765a3f4fSPaul E. McKenney  * Yes, this function does not take counter wrap into account.  But
3011765a3f4fSPaul E. McKenney  * counter wrap is harmless.  If the counter wraps, we have waited for
3012765a3f4fSPaul E. McKenney  * more than 2 billion grace periods (and way more on a 64-bit system!),
3013765a3f4fSPaul E. McKenney  * so waiting for one additional grace period should be just fine.
3014765a3f4fSPaul E. McKenney  */
3015765a3f4fSPaul E. McKenney void cond_synchronize_rcu(unsigned long oldstate)
3016765a3f4fSPaul E. McKenney {
301716fc9c60SPaul E. McKenney 	if (!rcu_seq_done(&rcu_state.gp_seq, oldstate))
3018765a3f4fSPaul E. McKenney 		synchronize_rcu();
3019e4be81a2SPaul E. McKenney 	else
3020e4be81a2SPaul E. McKenney 		smp_mb(); /* Ensure GP ends before subsequent accesses. */
3021765a3f4fSPaul E. McKenney }
3022765a3f4fSPaul E. McKenney EXPORT_SYMBOL_GPL(cond_synchronize_rcu);
3023765a3f4fSPaul E. McKenney 
302424560056SPaul E. McKenney /**
302524560056SPaul E. McKenney  * get_state_synchronize_sched - Snapshot current RCU-sched state
302624560056SPaul E. McKenney  *
302745975c7dSPaul E. McKenney  * This is transitional, and only used by rcutorture.
302824560056SPaul E. McKenney  */
302924560056SPaul E. McKenney unsigned long get_state_synchronize_sched(void)
303024560056SPaul E. McKenney {
303145975c7dSPaul E. McKenney 	return get_state_synchronize_rcu();
303224560056SPaul E. McKenney }
303324560056SPaul E. McKenney EXPORT_SYMBOL_GPL(get_state_synchronize_sched);
303424560056SPaul E. McKenney 
303524560056SPaul E. McKenney /**
303624560056SPaul E. McKenney  * cond_synchronize_sched - Conditionally wait for an RCU-sched grace period
303724560056SPaul E. McKenney  * @oldstate: return value from earlier call to get_state_synchronize_sched()
303824560056SPaul E. McKenney  *
303945975c7dSPaul E. McKenney  * This is transitional and only used by rcutorture.
304024560056SPaul E. McKenney  */
304124560056SPaul E. McKenney void cond_synchronize_sched(unsigned long oldstate)
304224560056SPaul E. McKenney {
304345975c7dSPaul E. McKenney 	cond_synchronize_rcu(oldstate);
304424560056SPaul E. McKenney }
304524560056SPaul E. McKenney EXPORT_SYMBOL_GPL(cond_synchronize_sched);
304624560056SPaul E. McKenney 
30474102adabSPaul E. McKenney /*
304898ece508SPaul E. McKenney  * Check to see if there is any immediate RCU-related work to be done by
304998ece508SPaul E. McKenney  * the current CPU, for the specified type of RCU, returning 1 if so and
305098ece508SPaul E. McKenney  * zero otherwise.  The checks are in order of increasing expense: checks
305198ece508SPaul E. McKenney  * that can be carried out against CPU-local state are performed first.
305298ece508SPaul E. McKenney  * However, we must check for CPU stalls first, else we might not get
305398ece508SPaul E. McKenney  * a chance.
30544102adabSPaul E. McKenney  */
305598ece508SPaul E. McKenney static int rcu_pending(void)
30564102adabSPaul E. McKenney {
305798ece508SPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
30584102adabSPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;
30594102adabSPaul E. McKenney 
30604102adabSPaul E. McKenney 	/* Check for CPU stalls, if enabled. */
3061ea12ff2bSPaul E. McKenney 	check_cpu_stall(rdp);
30624102adabSPaul E. McKenney 
3063a096932fSPaul E. McKenney 	/* Is this CPU a NO_HZ_FULL CPU that should ignore RCU? */
30644580b054SPaul E. McKenney 	if (rcu_nohz_full_cpu())
3065a096932fSPaul E. McKenney 		return 0;
3066a096932fSPaul E. McKenney 
30674102adabSPaul E. McKenney 	/* Is the RCU core waiting for a quiescent state from this CPU? */
306801c495f7SPaul E. McKenney 	if (rdp->core_needs_qs && !rdp->cpu_no_qs.b.norm)
30694102adabSPaul E. McKenney 		return 1;
30704102adabSPaul E. McKenney 
30714102adabSPaul E. McKenney 	/* Does this CPU have callbacks ready to invoke? */
307201c495f7SPaul E. McKenney 	if (rcu_segcblist_ready_cbs(&rdp->cblist))
30734102adabSPaul E. McKenney 		return 1;
30744102adabSPaul E. McKenney 
30754102adabSPaul E. McKenney 	/* Has RCU gone idle with this CPU needing another grace period? */
3076de8e8730SPaul E. McKenney 	if (!rcu_gp_in_progress() &&
3077c1935209SPaul E. McKenney 	    rcu_segcblist_is_enabled(&rdp->cblist) &&
3078c1935209SPaul E. McKenney 	    !rcu_segcblist_restempty(&rdp->cblist, RCU_NEXT_READY_TAIL))
30794102adabSPaul E. McKenney 		return 1;
30804102adabSPaul E. McKenney 
308167e14c1eSPaul E. McKenney 	/* Have RCU grace period completed or started?  */
308267e14c1eSPaul E. McKenney 	if (rcu_seq_current(&rnp->gp_seq) != rdp->gp_seq ||
308301c495f7SPaul E. McKenney 	    unlikely(READ_ONCE(rdp->gpwrap))) /* outside lock */
30844102adabSPaul E. McKenney 		return 1;
30854102adabSPaul E. McKenney 
308696d3fd0dSPaul E. McKenney 	/* Does this CPU need a deferred NOCB wakeup? */
308701c495f7SPaul E. McKenney 	if (rcu_nocb_need_deferred_wakeup(rdp))
308896d3fd0dSPaul E. McKenney 		return 1;
308996d3fd0dSPaul E. McKenney 
30904102adabSPaul E. McKenney 	/* nothing to do */
30914102adabSPaul E. McKenney 	return 0;
30924102adabSPaul E. McKenney }
30934102adabSPaul E. McKenney 
30944102adabSPaul E. McKenney /*
30954102adabSPaul E. McKenney  * Return true if the specified CPU has any callback.  If all_lazy is
30964102adabSPaul E. McKenney  * non-NULL, store an indication of whether all callbacks are lazy.
30974102adabSPaul E. McKenney  * (If there are no callbacks, all of them are deemed to be lazy.)
30984102adabSPaul E. McKenney  */
309951fbb910SPaul E. McKenney static bool rcu_cpu_has_callbacks(bool *all_lazy)
31004102adabSPaul E. McKenney {
31014102adabSPaul E. McKenney 	bool al = true;
31024102adabSPaul E. McKenney 	bool hc = false;
31034102adabSPaul E. McKenney 	struct rcu_data *rdp;
31044102adabSPaul E. McKenney 
3105da1df50dSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
3106b97d23c5SPaul E. McKenney 	if (!rcu_segcblist_empty(&rdp->cblist)) {
31074102adabSPaul E. McKenney 		hc = true;
3108b97d23c5SPaul E. McKenney 		if (rcu_segcblist_n_nonlazy_cbs(&rdp->cblist))
31094102adabSPaul E. McKenney 			al = false;
31104102adabSPaul E. McKenney 	}
31114102adabSPaul E. McKenney 	if (all_lazy)
31124102adabSPaul E. McKenney 		*all_lazy = al;
31134102adabSPaul E. McKenney 	return hc;
31144102adabSPaul E. McKenney }
31154102adabSPaul E. McKenney 
31164102adabSPaul E. McKenney /*
31174102adabSPaul E. McKenney  * Helper function for _rcu_barrier() tracing.  If tracing is disabled,
31184102adabSPaul E. McKenney  * the compiler is expected to optimize this away.
31194102adabSPaul E. McKenney  */
31208344b871SPaul E. McKenney static void _rcu_barrier_trace(const char *s, int cpu, unsigned long done)
31214102adabSPaul E. McKenney {
31228344b871SPaul E. McKenney 	trace_rcu_barrier(rcu_state.name, s, cpu,
31238344b871SPaul E. McKenney 			  atomic_read(&rcu_state.barrier_cpu_count), done);
31244102adabSPaul E. McKenney }
31254102adabSPaul E. McKenney 
31264102adabSPaul E. McKenney /*
31274102adabSPaul E. McKenney  * RCU callback function for _rcu_barrier().  If we are last, wake
31284102adabSPaul E. McKenney  * up the task executing _rcu_barrier().
31294102adabSPaul E. McKenney  */
31304102adabSPaul E. McKenney static void rcu_barrier_callback(struct rcu_head *rhp)
31314102adabSPaul E. McKenney {
3132*ec9f5835SPaul E. McKenney 	if (atomic_dec_and_test(&rcu_state.barrier_cpu_count)) {
3133*ec9f5835SPaul E. McKenney 		_rcu_barrier_trace(TPS("LastCB"), -1,
3134*ec9f5835SPaul E. McKenney 				   rcu_state.barrier_sequence);
3135*ec9f5835SPaul E. McKenney 		complete(&rcu_state.barrier_completion);
31364102adabSPaul E. McKenney 	} else {
3137*ec9f5835SPaul E. McKenney 		_rcu_barrier_trace(TPS("CB"), -1, rcu_state.barrier_sequence);
31384102adabSPaul E. McKenney 	}
31394102adabSPaul E. McKenney }
31404102adabSPaul E. McKenney 
31414102adabSPaul E. McKenney /*
31424102adabSPaul E. McKenney  * Called with preemption disabled, and from cross-cpu IRQ context.
31434102adabSPaul E. McKenney  */
3144*ec9f5835SPaul E. McKenney static void rcu_barrier_func(void *unused)
31454102adabSPaul E. McKenney {
3146da1df50dSPaul E. McKenney 	struct rcu_data *rdp = raw_cpu_ptr(&rcu_data);
31474102adabSPaul E. McKenney 
3148*ec9f5835SPaul E. McKenney 	_rcu_barrier_trace(TPS("IRQ"), -1, rcu_state.barrier_sequence);
3149f92c734fSPaul E. McKenney 	rdp->barrier_head.func = rcu_barrier_callback;
3150f92c734fSPaul E. McKenney 	debug_rcu_head_queue(&rdp->barrier_head);
3151f92c734fSPaul E. McKenney 	if (rcu_segcblist_entrain(&rdp->cblist, &rdp->barrier_head, 0)) {
3152*ec9f5835SPaul E. McKenney 		atomic_inc(&rcu_state.barrier_cpu_count);
3153f92c734fSPaul E. McKenney 	} else {
3154f92c734fSPaul E. McKenney 		debug_rcu_head_unqueue(&rdp->barrier_head);
3155*ec9f5835SPaul E. McKenney 		_rcu_barrier_trace(TPS("IRQNQ"), -1,
3156*ec9f5835SPaul E. McKenney 				   rcu_state.barrier_sequence);
3157f92c734fSPaul E. McKenney 	}
31584102adabSPaul E. McKenney }
31594102adabSPaul E. McKenney 
31604102adabSPaul E. McKenney /*
31614102adabSPaul E. McKenney  * Orchestrate the specified type of RCU barrier, waiting for all
31624102adabSPaul E. McKenney  * RCU callbacks of the specified type to complete.
31634102adabSPaul E. McKenney  */
31648344b871SPaul E. McKenney static void _rcu_barrier(void)
31654102adabSPaul E. McKenney {
31664102adabSPaul E. McKenney 	int cpu;
31674102adabSPaul E. McKenney 	struct rcu_data *rdp;
3168*ec9f5835SPaul E. McKenney 	unsigned long s = rcu_seq_snap(&rcu_state.barrier_sequence);
31694102adabSPaul E. McKenney 
31708344b871SPaul E. McKenney 	_rcu_barrier_trace(TPS("Begin"), -1, s);
31714102adabSPaul E. McKenney 
31724102adabSPaul E. McKenney 	/* Take mutex to serialize concurrent rcu_barrier() requests. */
3173*ec9f5835SPaul E. McKenney 	mutex_lock(&rcu_state.barrier_mutex);
31744102adabSPaul E. McKenney 
31754f525a52SPaul E. McKenney 	/* Did someone else do our work for us? */
3176*ec9f5835SPaul E. McKenney 	if (rcu_seq_done(&rcu_state.barrier_sequence, s)) {
3177*ec9f5835SPaul E. McKenney 		_rcu_barrier_trace(TPS("EarlyExit"), -1,
3178*ec9f5835SPaul E. McKenney 				   rcu_state.barrier_sequence);
31794102adabSPaul E. McKenney 		smp_mb(); /* caller's subsequent code after above check. */
3180*ec9f5835SPaul E. McKenney 		mutex_unlock(&rcu_state.barrier_mutex);
31814102adabSPaul E. McKenney 		return;
31824102adabSPaul E. McKenney 	}
31834102adabSPaul E. McKenney 
31844f525a52SPaul E. McKenney 	/* Mark the start of the barrier operation. */
3185*ec9f5835SPaul E. McKenney 	rcu_seq_start(&rcu_state.barrier_sequence);
3186*ec9f5835SPaul E. McKenney 	_rcu_barrier_trace(TPS("Inc1"), -1, rcu_state.barrier_sequence);
31874102adabSPaul E. McKenney 
31884102adabSPaul E. McKenney 	/*
31894102adabSPaul E. McKenney 	 * Initialize the count to one rather than to zero in order to
31904102adabSPaul E. McKenney 	 * avoid a too-soon return to zero in case of a short grace period
31914102adabSPaul E. McKenney 	 * (or preemption of this task).  Exclude CPU-hotplug operations
31924102adabSPaul E. McKenney 	 * to ensure that no offline CPU has callbacks queued.
31934102adabSPaul E. McKenney 	 */
3194*ec9f5835SPaul E. McKenney 	init_completion(&rcu_state.barrier_completion);
3195*ec9f5835SPaul E. McKenney 	atomic_set(&rcu_state.barrier_cpu_count, 1);
31964102adabSPaul E. McKenney 	get_online_cpus();
31974102adabSPaul E. McKenney 
31984102adabSPaul E. McKenney 	/*
31994102adabSPaul E. McKenney 	 * Force each CPU with callbacks to register a new callback.
32004102adabSPaul E. McKenney 	 * When that callback is invoked, we will know that all of the
32014102adabSPaul E. McKenney 	 * corresponding CPU's preceding callbacks have been invoked.
32024102adabSPaul E. McKenney 	 */
32034102adabSPaul E. McKenney 	for_each_possible_cpu(cpu) {
32044102adabSPaul E. McKenney 		if (!cpu_online(cpu) && !rcu_is_nocb_cpu(cpu))
32054102adabSPaul E. McKenney 			continue;
3206da1df50dSPaul E. McKenney 		rdp = per_cpu_ptr(&rcu_data, cpu);
32074102adabSPaul E. McKenney 		if (rcu_is_nocb_cpu(cpu)) {
32084580b054SPaul E. McKenney 			if (!rcu_nocb_cpu_needs_barrier(cpu)) {
32098344b871SPaul E. McKenney 				_rcu_barrier_trace(TPS("OfflineNoCB"), cpu,
3210*ec9f5835SPaul E. McKenney 						   rcu_state.barrier_sequence);
3211d7e29933SPaul E. McKenney 			} else {
32128344b871SPaul E. McKenney 				_rcu_barrier_trace(TPS("OnlineNoCB"), cpu,
3213*ec9f5835SPaul E. McKenney 						   rcu_state.barrier_sequence);
321441050a00SPaul E. McKenney 				smp_mb__before_atomic();
3215*ec9f5835SPaul E. McKenney 				atomic_inc(&rcu_state.barrier_cpu_count);
3216d7e29933SPaul E. McKenney 				__call_rcu(&rdp->barrier_head,
32175c7d8967SPaul E. McKenney 					   rcu_barrier_callback, cpu, 0);
3218d7e29933SPaul E. McKenney 			}
321915fecf89SPaul E. McKenney 		} else if (rcu_segcblist_n_cbs(&rdp->cblist)) {
32208344b871SPaul E. McKenney 			_rcu_barrier_trace(TPS("OnlineQ"), cpu,
3221*ec9f5835SPaul E. McKenney 					   rcu_state.barrier_sequence);
3222*ec9f5835SPaul E. McKenney 			smp_call_function_single(cpu, rcu_barrier_func, NULL, 1);
32234102adabSPaul E. McKenney 		} else {
32248344b871SPaul E. McKenney 			_rcu_barrier_trace(TPS("OnlineNQ"), cpu,
3225*ec9f5835SPaul E. McKenney 					   rcu_state.barrier_sequence);
32264102adabSPaul E. McKenney 		}
32274102adabSPaul E. McKenney 	}
32284102adabSPaul E. McKenney 	put_online_cpus();
32294102adabSPaul E. McKenney 
32304102adabSPaul E. McKenney 	/*
32314102adabSPaul E. McKenney 	 * Now that we have an rcu_barrier_callback() callback on each
32324102adabSPaul E. McKenney 	 * CPU, and thus each counted, remove the initial count.
32334102adabSPaul E. McKenney 	 */
3234*ec9f5835SPaul E. McKenney 	if (atomic_dec_and_test(&rcu_state.barrier_cpu_count))
3235*ec9f5835SPaul E. McKenney 		complete(&rcu_state.barrier_completion);
32364102adabSPaul E. McKenney 
32374102adabSPaul E. McKenney 	/* Wait for all rcu_barrier_callback() callbacks to be invoked. */
3238*ec9f5835SPaul E. McKenney 	wait_for_completion(&rcu_state.barrier_completion);
32394102adabSPaul E. McKenney 
32404f525a52SPaul E. McKenney 	/* Mark the end of the barrier operation. */
3241*ec9f5835SPaul E. McKenney 	_rcu_barrier_trace(TPS("Inc2"), -1, rcu_state.barrier_sequence);
3242*ec9f5835SPaul E. McKenney 	rcu_seq_end(&rcu_state.barrier_sequence);
32434f525a52SPaul E. McKenney 
32444102adabSPaul E. McKenney 	/* Other rcu_barrier() invocations can now safely proceed. */
3245*ec9f5835SPaul E. McKenney 	mutex_unlock(&rcu_state.barrier_mutex);
32464102adabSPaul E. McKenney }
32474102adabSPaul E. McKenney 
32484102adabSPaul E. McKenney /**
32494102adabSPaul E. McKenney  * rcu_barrier_bh - Wait until all in-flight call_rcu_bh() callbacks complete.
32504102adabSPaul E. McKenney  */
32514102adabSPaul E. McKenney void rcu_barrier_bh(void)
32524102adabSPaul E. McKenney {
32538344b871SPaul E. McKenney 	_rcu_barrier();
32544102adabSPaul E. McKenney }
32554102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_barrier_bh);
32564102adabSPaul E. McKenney 
32574102adabSPaul E. McKenney /**
325845975c7dSPaul E. McKenney  * rcu_barrier - Wait until all in-flight call_rcu() callbacks complete.
325945975c7dSPaul E. McKenney  *
326045975c7dSPaul E. McKenney  * Note that this primitive does not necessarily wait for an RCU grace period
326145975c7dSPaul E. McKenney  * to complete.  For example, if there are no RCU callbacks queued anywhere
326245975c7dSPaul E. McKenney  * in the system, then rcu_barrier() is within its rights to return
326345975c7dSPaul E. McKenney  * immediately, without waiting for anything, much less an RCU grace period.
326445975c7dSPaul E. McKenney  */
326545975c7dSPaul E. McKenney void rcu_barrier(void)
326645975c7dSPaul E. McKenney {
32678344b871SPaul E. McKenney 	_rcu_barrier();
326845975c7dSPaul E. McKenney }
326945975c7dSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_barrier);
327045975c7dSPaul E. McKenney 
327145975c7dSPaul E. McKenney /**
32724102adabSPaul E. McKenney  * rcu_barrier_sched - Wait for in-flight call_rcu_sched() callbacks.
327345975c7dSPaul E. McKenney  *
327445975c7dSPaul E. McKenney  * This is transitional.
32754102adabSPaul E. McKenney  */
32764102adabSPaul E. McKenney void rcu_barrier_sched(void)
32774102adabSPaul E. McKenney {
327845975c7dSPaul E. McKenney 	rcu_barrier();
32794102adabSPaul E. McKenney }
32804102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_barrier_sched);
32814102adabSPaul E. McKenney 
32824102adabSPaul E. McKenney /*
32830aa04b05SPaul E. McKenney  * Propagate ->qsinitmask bits up the rcu_node tree to account for the
32840aa04b05SPaul E. McKenney  * first CPU in a given leaf rcu_node structure coming online.  The caller
32850aa04b05SPaul E. McKenney  * must hold the corresponding leaf rcu_node ->lock with interrrupts
32860aa04b05SPaul E. McKenney  * disabled.
32870aa04b05SPaul E. McKenney  */
32880aa04b05SPaul E. McKenney static void rcu_init_new_rnp(struct rcu_node *rnp_leaf)
32890aa04b05SPaul E. McKenney {
32900aa04b05SPaul E. McKenney 	long mask;
32918d672fa6SPaul E. McKenney 	long oldmask;
32920aa04b05SPaul E. McKenney 	struct rcu_node *rnp = rnp_leaf;
32930aa04b05SPaul E. McKenney 
32948d672fa6SPaul E. McKenney 	raw_lockdep_assert_held_rcu_node(rnp_leaf);
3295962aff03SPaul E. McKenney 	WARN_ON_ONCE(rnp->wait_blkd_tasks);
32960aa04b05SPaul E. McKenney 	for (;;) {
32970aa04b05SPaul E. McKenney 		mask = rnp->grpmask;
32980aa04b05SPaul E. McKenney 		rnp = rnp->parent;
32990aa04b05SPaul E. McKenney 		if (rnp == NULL)
33000aa04b05SPaul E. McKenney 			return;
33016cf10081SPaul E. McKenney 		raw_spin_lock_rcu_node(rnp); /* Interrupts already disabled. */
33028d672fa6SPaul E. McKenney 		oldmask = rnp->qsmaskinit;
33030aa04b05SPaul E. McKenney 		rnp->qsmaskinit |= mask;
330467c583a7SBoqun Feng 		raw_spin_unlock_rcu_node(rnp); /* Interrupts remain disabled. */
33058d672fa6SPaul E. McKenney 		if (oldmask)
33068d672fa6SPaul E. McKenney 			return;
33070aa04b05SPaul E. McKenney 	}
33080aa04b05SPaul E. McKenney }
33090aa04b05SPaul E. McKenney 
33100aa04b05SPaul E. McKenney /*
33114102adabSPaul E. McKenney  * Do boot-time initialization of a CPU's per-CPU RCU data.
33124102adabSPaul E. McKenney  */
33134102adabSPaul E. McKenney static void __init
331453b46303SPaul E. McKenney rcu_boot_init_percpu_data(int cpu)
33154102adabSPaul E. McKenney {
3316da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
33174102adabSPaul E. McKenney 
33184102adabSPaul E. McKenney 	/* Set up local state, ensuring consistent view of global state. */
3319bc75e999SMark Rutland 	rdp->grpmask = leaf_node_cpu_bit(rdp->mynode, cpu);
33204102adabSPaul E. McKenney 	rdp->dynticks = &per_cpu(rcu_dynticks, cpu);
332151a1fd30SPaul E. McKenney 	WARN_ON_ONCE(rdp->dynticks->dynticks_nesting != 1);
332202a5c550SPaul E. McKenney 	WARN_ON_ONCE(rcu_dynticks_in_eqs(rcu_dynticks_snap(rdp->dynticks)));
332353b46303SPaul E. McKenney 	rdp->rcu_ofl_gp_seq = rcu_state.gp_seq;
332457738942SPaul E. McKenney 	rdp->rcu_ofl_gp_flags = RCU_GP_CLEANED;
332553b46303SPaul E. McKenney 	rdp->rcu_onl_gp_seq = rcu_state.gp_seq;
332657738942SPaul E. McKenney 	rdp->rcu_onl_gp_flags = RCU_GP_CLEANED;
33274102adabSPaul E. McKenney 	rdp->cpu = cpu;
33284102adabSPaul E. McKenney 	rcu_boot_init_nocb_percpu_data(rdp);
33294102adabSPaul E. McKenney }
33304102adabSPaul E. McKenney 
33314102adabSPaul E. McKenney /*
333253b46303SPaul E. McKenney  * Invoked early in the CPU-online process, when pretty much all services
333353b46303SPaul E. McKenney  * are available.  The incoming CPU is not present.
333453b46303SPaul E. McKenney  *
333553b46303SPaul E. McKenney  * Initializes a CPU's per-CPU RCU data.  Note that only one online or
3336ff3bb6f4SPaul E. McKenney  * offline event can be happening at a given time.  Note also that we can
3337ff3bb6f4SPaul E. McKenney  * accept some slop in the rsp->gp_seq access due to the fact that this
3338ff3bb6f4SPaul E. McKenney  * CPU cannot possibly have any RCU callbacks in flight yet.
33394102adabSPaul E. McKenney  */
334053b46303SPaul E. McKenney int rcutree_prepare_cpu(unsigned int cpu)
33414102adabSPaul E. McKenney {
33424102adabSPaul E. McKenney 	unsigned long flags;
3343da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
3344336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
33454102adabSPaul E. McKenney 
33464102adabSPaul E. McKenney 	/* Set up local state, ensuring consistent view of global state. */
33476cf10081SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
33484102adabSPaul E. McKenney 	rdp->qlen_last_fqs_check = 0;
334953b46303SPaul E. McKenney 	rdp->n_force_qs_snap = rcu_state.n_force_qs;
33504102adabSPaul E. McKenney 	rdp->blimit = blimit;
335115fecf89SPaul E. McKenney 	if (rcu_segcblist_empty(&rdp->cblist) && /* No early-boot CBs? */
335215fecf89SPaul E. McKenney 	    !init_nocb_callback_list(rdp))
335315fecf89SPaul E. McKenney 		rcu_segcblist_init(&rdp->cblist);  /* Re-enable callbacks. */
33542342172fSPaul E. McKenney 	rdp->dynticks->dynticks_nesting = 1;	/* CPU not up, no tearing. */
33552625d469SPaul E. McKenney 	rcu_dynticks_eqs_online();
335667c583a7SBoqun Feng 	raw_spin_unlock_rcu_node(rnp);		/* irqs remain disabled. */
33574102adabSPaul E. McKenney 
33580aa04b05SPaul E. McKenney 	/*
33590aa04b05SPaul E. McKenney 	 * Add CPU to leaf rcu_node pending-online bitmask.  Any needed
33600aa04b05SPaul E. McKenney 	 * propagation up the rcu_node tree will happen at the beginning
33610aa04b05SPaul E. McKenney 	 * of the next grace period.
33620aa04b05SPaul E. McKenney 	 */
33634102adabSPaul E. McKenney 	rnp = rdp->mynode;
33642a67e741SPeter Zijlstra 	raw_spin_lock_rcu_node(rnp);		/* irqs already disabled. */
3365b9585e94SPaul E. McKenney 	rdp->beenonline = true;	 /* We have now been online. */
3366de30ad51SPaul E. McKenney 	rdp->gp_seq = rnp->gp_seq;
33677a1d0f23SPaul E. McKenney 	rdp->gp_seq_needed = rnp->gp_seq;
33685b74c458SPaul E. McKenney 	rdp->cpu_no_qs.b.norm = true;
33699577df9aSPaul E. McKenney 	rdp->rcu_qs_ctr_snap = per_cpu(rcu_dynticks.rcu_qs_ctr, cpu);
337097c668b8SPaul E. McKenney 	rdp->core_needs_qs = false;
33719b9500daSPaul E. McKenney 	rdp->rcu_iw_pending = false;
33728aa670cdSPaul E. McKenney 	rdp->rcu_iw_gp_seq = rnp->gp_seq - 1;
337353b46303SPaul E. McKenney 	trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("cpuonl"));
337467c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
33754df83742SThomas Gleixner 	rcu_prepare_kthreads(cpu);
33764df83742SThomas Gleixner 	rcu_spawn_all_nocb_kthreads(cpu);
33774df83742SThomas Gleixner 
33784df83742SThomas Gleixner 	return 0;
33794df83742SThomas Gleixner }
33804df83742SThomas Gleixner 
3381deb34f36SPaul E. McKenney /*
3382deb34f36SPaul E. McKenney  * Update RCU priority boot kthread affinity for CPU-hotplug changes.
3383deb34f36SPaul E. McKenney  */
33844df83742SThomas Gleixner static void rcutree_affinity_setting(unsigned int cpu, int outgoing)
33854df83742SThomas Gleixner {
3386da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
33874df83742SThomas Gleixner 
33884df83742SThomas Gleixner 	rcu_boost_kthread_setaffinity(rdp->mynode, outgoing);
33894df83742SThomas Gleixner }
33904df83742SThomas Gleixner 
3391deb34f36SPaul E. McKenney /*
3392deb34f36SPaul E. McKenney  * Near the end of the CPU-online process.  Pretty much all services
3393deb34f36SPaul E. McKenney  * enabled, and the CPU is now very much alive.
3394deb34f36SPaul E. McKenney  */
33954df83742SThomas Gleixner int rcutree_online_cpu(unsigned int cpu)
33964df83742SThomas Gleixner {
33979b9500daSPaul E. McKenney 	unsigned long flags;
33989b9500daSPaul E. McKenney 	struct rcu_data *rdp;
33999b9500daSPaul E. McKenney 	struct rcu_node *rnp;
34009b9500daSPaul E. McKenney 
3401da1df50dSPaul E. McKenney 	rdp = per_cpu_ptr(&rcu_data, cpu);
34029b9500daSPaul E. McKenney 	rnp = rdp->mynode;
34039b9500daSPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
34049b9500daSPaul E. McKenney 	rnp->ffmask |= rdp->grpmask;
34059b9500daSPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
3406da915ad5SPaul E. McKenney 	if (IS_ENABLED(CONFIG_TREE_SRCU))
3407da915ad5SPaul E. McKenney 		srcu_online_cpu(cpu);
34089b9500daSPaul E. McKenney 	if (rcu_scheduler_active == RCU_SCHEDULER_INACTIVE)
34099b9500daSPaul E. McKenney 		return 0; /* Too early in boot for scheduler work. */
34109b9500daSPaul E. McKenney 	sync_sched_exp_online_cleanup(cpu);
34119b9500daSPaul E. McKenney 	rcutree_affinity_setting(cpu, -1);
34124df83742SThomas Gleixner 	return 0;
34134df83742SThomas Gleixner }
34144df83742SThomas Gleixner 
3415deb34f36SPaul E. McKenney /*
3416deb34f36SPaul E. McKenney  * Near the beginning of the process.  The CPU is still very much alive
3417deb34f36SPaul E. McKenney  * with pretty much all services enabled.
3418deb34f36SPaul E. McKenney  */
34194df83742SThomas Gleixner int rcutree_offline_cpu(unsigned int cpu)
34204df83742SThomas Gleixner {
34219b9500daSPaul E. McKenney 	unsigned long flags;
34229b9500daSPaul E. McKenney 	struct rcu_data *rdp;
34239b9500daSPaul E. McKenney 	struct rcu_node *rnp;
34249b9500daSPaul E. McKenney 
3425da1df50dSPaul E. McKenney 	rdp = per_cpu_ptr(&rcu_data, cpu);
34269b9500daSPaul E. McKenney 	rnp = rdp->mynode;
34279b9500daSPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
34289b9500daSPaul E. McKenney 	rnp->ffmask &= ~rdp->grpmask;
34299b9500daSPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
34309b9500daSPaul E. McKenney 
34314df83742SThomas Gleixner 	rcutree_affinity_setting(cpu, cpu);
3432da915ad5SPaul E. McKenney 	if (IS_ENABLED(CONFIG_TREE_SRCU))
3433da915ad5SPaul E. McKenney 		srcu_offline_cpu(cpu);
34344df83742SThomas Gleixner 	return 0;
34354df83742SThomas Gleixner }
34364df83742SThomas Gleixner 
3437f64c6013SPeter Zijlstra static DEFINE_PER_CPU(int, rcu_cpu_started);
3438f64c6013SPeter Zijlstra 
34397ec99de3SPaul E. McKenney /*
34407ec99de3SPaul E. McKenney  * Mark the specified CPU as being online so that subsequent grace periods
34417ec99de3SPaul E. McKenney  * (both expedited and normal) will wait on it.  Note that this means that
34427ec99de3SPaul E. McKenney  * incoming CPUs are not allowed to use RCU read-side critical sections
34437ec99de3SPaul E. McKenney  * until this function is called.  Failing to observe this restriction
34447ec99de3SPaul E. McKenney  * will result in lockdep splats.
3445deb34f36SPaul E. McKenney  *
3446deb34f36SPaul E. McKenney  * Note that this function is special in that it is invoked directly
3447deb34f36SPaul E. McKenney  * from the incoming CPU rather than from the cpuhp_step mechanism.
3448deb34f36SPaul E. McKenney  * This is because this function must be invoked at a precise location.
34497ec99de3SPaul E. McKenney  */
34507ec99de3SPaul E. McKenney void rcu_cpu_starting(unsigned int cpu)
34517ec99de3SPaul E. McKenney {
34527ec99de3SPaul E. McKenney 	unsigned long flags;
34537ec99de3SPaul E. McKenney 	unsigned long mask;
3454313517fcSPaul E. McKenney 	int nbits;
3455313517fcSPaul E. McKenney 	unsigned long oldmask;
34567ec99de3SPaul E. McKenney 	struct rcu_data *rdp;
34577ec99de3SPaul E. McKenney 	struct rcu_node *rnp;
3458b97d23c5SPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
34597ec99de3SPaul E. McKenney 
3460f64c6013SPeter Zijlstra 	if (per_cpu(rcu_cpu_started, cpu))
3461f64c6013SPeter Zijlstra 		return;
3462f64c6013SPeter Zijlstra 
3463f64c6013SPeter Zijlstra 	per_cpu(rcu_cpu_started, cpu) = 1;
3464f64c6013SPeter Zijlstra 
3465da1df50dSPaul E. McKenney 	rdp = per_cpu_ptr(&rcu_data, cpu);
34667ec99de3SPaul E. McKenney 	rnp = rdp->mynode;
34677ec99de3SPaul E. McKenney 	mask = rdp->grpmask;
34687ec99de3SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
34697ec99de3SPaul E. McKenney 	rnp->qsmaskinitnext |= mask;
3470313517fcSPaul E. McKenney 	oldmask = rnp->expmaskinitnext;
34717ec99de3SPaul E. McKenney 	rnp->expmaskinitnext |= mask;
3472313517fcSPaul E. McKenney 	oldmask ^= rnp->expmaskinitnext;
3473313517fcSPaul E. McKenney 	nbits = bitmap_weight(&oldmask, BITS_PER_LONG);
3474313517fcSPaul E. McKenney 	/* Allow lockless access for expedited grace periods. */
3475313517fcSPaul E. McKenney 	smp_store_release(&rsp->ncpus, rsp->ncpus + nbits); /* ^^^ */
3476e05121baSPaul E. McKenney 	rcu_gpnum_ovf(rnp, rdp); /* Offline-induced counter wrap? */
347757738942SPaul E. McKenney 	rdp->rcu_onl_gp_seq = READ_ONCE(rsp->gp_seq);
347857738942SPaul E. McKenney 	rdp->rcu_onl_gp_flags = READ_ONCE(rsp->gp_flags);
347999990da1SPaul E. McKenney 	if (rnp->qsmask & mask) { /* RCU waiting on incoming CPU? */
348099990da1SPaul E. McKenney 		/* Report QS -after- changing ->qsmaskinitnext! */
3481b50912d0SPaul E. McKenney 		rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
348299990da1SPaul E. McKenney 	} else {
34837ec99de3SPaul E. McKenney 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
34847ec99de3SPaul E. McKenney 	}
3485313517fcSPaul E. McKenney 	smp_mb(); /* Ensure RCU read-side usage follows above initialization. */
34867ec99de3SPaul E. McKenney }
34877ec99de3SPaul E. McKenney 
348827d50c7eSThomas Gleixner #ifdef CONFIG_HOTPLUG_CPU
348927d50c7eSThomas Gleixner /*
3490deb34f36SPaul E. McKenney  * The outgoing function has no further need of RCU, so remove it from
349153b46303SPaul E. McKenney  * the rcu_node tree's ->qsmaskinitnext bit masks.
3492deb34f36SPaul E. McKenney  *
3493deb34f36SPaul E. McKenney  * Note that this function is special in that it is invoked directly
3494deb34f36SPaul E. McKenney  * from the outgoing CPU rather than from the cpuhp_step mechanism.
3495deb34f36SPaul E. McKenney  * This is because this function must be invoked at a precise location.
3496deb34f36SPaul E. McKenney  */
349727d50c7eSThomas Gleixner void rcu_report_dead(unsigned int cpu)
349827d50c7eSThomas Gleixner {
349953b46303SPaul E. McKenney 	unsigned long flags;
350053b46303SPaul E. McKenney 	unsigned long mask;
350153b46303SPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
350253b46303SPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;  /* Outgoing CPU's rdp & rnp. */
350327d50c7eSThomas Gleixner 
350427d50c7eSThomas Gleixner 	/* QS for any half-done expedited RCU-sched GP. */
350527d50c7eSThomas Gleixner 	preempt_disable();
350663d4c8c9SPaul E. McKenney 	rcu_report_exp_rdp(this_cpu_ptr(&rcu_data));
350727d50c7eSThomas Gleixner 	preempt_enable();
35083e310098SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
350953b46303SPaul E. McKenney 
351053b46303SPaul E. McKenney 	/* Remove outgoing CPU from mask in the leaf rcu_node structure. */
351153b46303SPaul E. McKenney 	mask = rdp->grpmask;
351253b46303SPaul E. McKenney 	spin_lock(&rcu_state.ofl_lock);
351353b46303SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags); /* Enforce GP memory-order guarantee. */
351453b46303SPaul E. McKenney 	rdp->rcu_ofl_gp_seq = READ_ONCE(rcu_state.gp_seq);
351553b46303SPaul E. McKenney 	rdp->rcu_ofl_gp_flags = READ_ONCE(rcu_state.gp_flags);
351653b46303SPaul E. McKenney 	if (rnp->qsmask & mask) { /* RCU waiting on outgoing CPU? */
351753b46303SPaul E. McKenney 		/* Report quiescent state -before- changing ->qsmaskinitnext! */
351853b46303SPaul E. McKenney 		rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
351953b46303SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
352053b46303SPaul E. McKenney 	}
352153b46303SPaul E. McKenney 	rnp->qsmaskinitnext &= ~mask;
352253b46303SPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
352353b46303SPaul E. McKenney 	spin_unlock(&rcu_state.ofl_lock);
3524f64c6013SPeter Zijlstra 
3525f64c6013SPeter Zijlstra 	per_cpu(rcu_cpu_started, cpu) = 0;
352627d50c7eSThomas Gleixner }
3527a58163d8SPaul E. McKenney 
352853b46303SPaul E. McKenney /*
352953b46303SPaul E. McKenney  * The outgoing CPU has just passed through the dying-idle state, and we
353053b46303SPaul E. McKenney  * are being invoked from the CPU that was IPIed to continue the offline
353153b46303SPaul E. McKenney  * operation.  Migrate the outgoing CPU's callbacks to the current CPU.
353253b46303SPaul E. McKenney  */
353353b46303SPaul E. McKenney void rcutree_migrate_callbacks(int cpu)
3534a58163d8SPaul E. McKenney {
3535a58163d8SPaul E. McKenney 	unsigned long flags;
3536b1a2d79fSPaul E. McKenney 	struct rcu_data *my_rdp;
3537da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
3538336a4f6cSPaul E. McKenney 	struct rcu_node *rnp_root = rcu_get_root();
3539ec4eacceSPaul E. McKenney 	bool needwake;
3540a58163d8SPaul E. McKenney 
354195335c03SPaul E. McKenney 	if (rcu_is_nocb_cpu(cpu) || rcu_segcblist_empty(&rdp->cblist))
354295335c03SPaul E. McKenney 		return;  /* No callbacks to migrate. */
354395335c03SPaul E. McKenney 
3544b1a2d79fSPaul E. McKenney 	local_irq_save(flags);
3545da1df50dSPaul E. McKenney 	my_rdp = this_cpu_ptr(&rcu_data);
3546b1a2d79fSPaul E. McKenney 	if (rcu_nocb_adopt_orphan_cbs(my_rdp, rdp, flags)) {
3547b1a2d79fSPaul E. McKenney 		local_irq_restore(flags);
3548b1a2d79fSPaul E. McKenney 		return;
3549b1a2d79fSPaul E. McKenney 	}
35509fa46fb8SPaul E. McKenney 	raw_spin_lock_rcu_node(rnp_root); /* irqs already disabled. */
3551ec4eacceSPaul E. McKenney 	/* Leverage recent GPs and set GP for new callbacks. */
3552834f56bfSPaul E. McKenney 	needwake = rcu_advance_cbs(rnp_root, rdp) ||
3553834f56bfSPaul E. McKenney 		   rcu_advance_cbs(rnp_root, my_rdp);
3554f2dbe4a5SPaul E. McKenney 	rcu_segcblist_merge(&my_rdp->cblist, &rdp->cblist);
355509efeeeeSPaul E. McKenney 	WARN_ON_ONCE(rcu_segcblist_empty(&my_rdp->cblist) !=
355609efeeeeSPaul E. McKenney 		     !rcu_segcblist_n_cbs(&my_rdp->cblist));
3557537b85c8SPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp_root, flags);
3558ec4eacceSPaul E. McKenney 	if (needwake)
3559532c00c9SPaul E. McKenney 		rcu_gp_kthread_wake();
3560a58163d8SPaul E. McKenney 	WARN_ONCE(rcu_segcblist_n_cbs(&rdp->cblist) != 0 ||
3561a58163d8SPaul E. McKenney 		  !rcu_segcblist_empty(&rdp->cblist),
3562a58163d8SPaul E. McKenney 		  "rcu_cleanup_dead_cpu: Callbacks on offline CPU %d: qlen=%lu, 1stCB=%p\n",
3563a58163d8SPaul E. McKenney 		  cpu, rcu_segcblist_n_cbs(&rdp->cblist),
3564a58163d8SPaul E. McKenney 		  rcu_segcblist_first_cb(&rdp->cblist));
3565a58163d8SPaul E. McKenney }
356627d50c7eSThomas Gleixner #endif
356727d50c7eSThomas Gleixner 
3568deb34f36SPaul E. McKenney /*
3569deb34f36SPaul E. McKenney  * On non-huge systems, use expedited RCU grace periods to make suspend
3570deb34f36SPaul E. McKenney  * and hibernation run faster.
3571deb34f36SPaul E. McKenney  */
35724102adabSPaul E. McKenney static int rcu_pm_notify(struct notifier_block *self,
35734102adabSPaul E. McKenney 			 unsigned long action, void *hcpu)
35744102adabSPaul E. McKenney {
35754102adabSPaul E. McKenney 	switch (action) {
35764102adabSPaul E. McKenney 	case PM_HIBERNATION_PREPARE:
35774102adabSPaul E. McKenney 	case PM_SUSPEND_PREPARE:
35784102adabSPaul E. McKenney 		if (nr_cpu_ids <= 256) /* Expediting bad for large systems. */
35795afff48bSPaul E. McKenney 			rcu_expedite_gp();
35804102adabSPaul E. McKenney 		break;
35814102adabSPaul E. McKenney 	case PM_POST_HIBERNATION:
35824102adabSPaul E. McKenney 	case PM_POST_SUSPEND:
35835afff48bSPaul E. McKenney 		if (nr_cpu_ids <= 256) /* Expediting bad for large systems. */
35845afff48bSPaul E. McKenney 			rcu_unexpedite_gp();
35854102adabSPaul E. McKenney 		break;
35864102adabSPaul E. McKenney 	default:
35874102adabSPaul E. McKenney 		break;
35884102adabSPaul E. McKenney 	}
35894102adabSPaul E. McKenney 	return NOTIFY_OK;
35904102adabSPaul E. McKenney }
35914102adabSPaul E. McKenney 
35924102adabSPaul E. McKenney /*
35939386c0b7SPaul E. McKenney  * Spawn the kthreads that handle each RCU flavor's grace periods.
35944102adabSPaul E. McKenney  */
35954102adabSPaul E. McKenney static int __init rcu_spawn_gp_kthread(void)
35964102adabSPaul E. McKenney {
35974102adabSPaul E. McKenney 	unsigned long flags;
3598a94844b2SPaul E. McKenney 	int kthread_prio_in = kthread_prio;
35994102adabSPaul E. McKenney 	struct rcu_node *rnp;
3600a94844b2SPaul E. McKenney 	struct sched_param sp;
36014102adabSPaul E. McKenney 	struct task_struct *t;
36024102adabSPaul E. McKenney 
3603a94844b2SPaul E. McKenney 	/* Force priority into range. */
3604c7cd161eSJoel Fernandes (Google) 	if (IS_ENABLED(CONFIG_RCU_BOOST) && kthread_prio < 2
3605c7cd161eSJoel Fernandes (Google) 	    && IS_BUILTIN(CONFIG_RCU_TORTURE_TEST))
3606c7cd161eSJoel Fernandes (Google) 		kthread_prio = 2;
3607c7cd161eSJoel Fernandes (Google) 	else if (IS_ENABLED(CONFIG_RCU_BOOST) && kthread_prio < 1)
3608a94844b2SPaul E. McKenney 		kthread_prio = 1;
3609a94844b2SPaul E. McKenney 	else if (kthread_prio < 0)
3610a94844b2SPaul E. McKenney 		kthread_prio = 0;
3611a94844b2SPaul E. McKenney 	else if (kthread_prio > 99)
3612a94844b2SPaul E. McKenney 		kthread_prio = 99;
3613c7cd161eSJoel Fernandes (Google) 
3614a94844b2SPaul E. McKenney 	if (kthread_prio != kthread_prio_in)
3615a94844b2SPaul E. McKenney 		pr_alert("rcu_spawn_gp_kthread(): Limited prio to %d from %d\n",
3616a94844b2SPaul E. McKenney 			 kthread_prio, kthread_prio_in);
3617a94844b2SPaul E. McKenney 
36189386c0b7SPaul E. McKenney 	rcu_scheduler_fully_active = 1;
3619b97d23c5SPaul E. McKenney 	t = kthread_create(rcu_gp_kthread, NULL, "%s", rcu_state.name);
36204102adabSPaul E. McKenney 	BUG_ON(IS_ERR(t));
3621336a4f6cSPaul E. McKenney 	rnp = rcu_get_root();
36226cf10081SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
3623b97d23c5SPaul E. McKenney 	rcu_state.gp_kthread = t;
3624a94844b2SPaul E. McKenney 	if (kthread_prio) {
3625a94844b2SPaul E. McKenney 		sp.sched_priority = kthread_prio;
3626a94844b2SPaul E. McKenney 		sched_setscheduler_nocheck(t, SCHED_FIFO, &sp);
3627a94844b2SPaul E. McKenney 	}
362867c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
3629e11f1335SPeter Zijlstra 	wake_up_process(t);
363035ce7f29SPaul E. McKenney 	rcu_spawn_nocb_kthreads();
36319386c0b7SPaul E. McKenney 	rcu_spawn_boost_kthreads();
36324102adabSPaul E. McKenney 	return 0;
36334102adabSPaul E. McKenney }
36344102adabSPaul E. McKenney early_initcall(rcu_spawn_gp_kthread);
36354102adabSPaul E. McKenney 
36364102adabSPaul E. McKenney /*
363752d7e48bSPaul E. McKenney  * This function is invoked towards the end of the scheduler's
363852d7e48bSPaul E. McKenney  * initialization process.  Before this is called, the idle task might
363952d7e48bSPaul E. McKenney  * contain synchronous grace-period primitives (during which time, this idle
364052d7e48bSPaul E. McKenney  * task is booting the system, and such primitives are no-ops).  After this
364152d7e48bSPaul E. McKenney  * function is called, any synchronous grace-period primitives are run as
364252d7e48bSPaul E. McKenney  * expedited, with the requesting task driving the grace period forward.
3643900b1028SPaul E. McKenney  * A later core_initcall() rcu_set_runtime_mode() will switch to full
364452d7e48bSPaul E. McKenney  * runtime RCU functionality.
36454102adabSPaul E. McKenney  */
36464102adabSPaul E. McKenney void rcu_scheduler_starting(void)
36474102adabSPaul E. McKenney {
36484102adabSPaul E. McKenney 	WARN_ON(num_online_cpus() != 1);
36494102adabSPaul E. McKenney 	WARN_ON(nr_context_switches() > 0);
365052d7e48bSPaul E. McKenney 	rcu_test_sync_prims();
365152d7e48bSPaul E. McKenney 	rcu_scheduler_active = RCU_SCHEDULER_INIT;
365252d7e48bSPaul E. McKenney 	rcu_test_sync_prims();
36534102adabSPaul E. McKenney }
36544102adabSPaul E. McKenney 
36554102adabSPaul E. McKenney /*
36564102adabSPaul E. McKenney  * Helper function for rcu_init() that initializes one rcu_state structure.
36574102adabSPaul E. McKenney  */
3658b8bb1f63SPaul E. McKenney static void __init rcu_init_one(void)
36594102adabSPaul E. McKenney {
3660cb007102SAlexander Gordeev 	static const char * const buf[] = RCU_NODE_NAME_INIT;
3661cb007102SAlexander Gordeev 	static const char * const fqs[] = RCU_FQS_NAME_INIT;
36623dc5dbe9SPaul E. McKenney 	static struct lock_class_key rcu_node_class[RCU_NUM_LVLS];
36633dc5dbe9SPaul E. McKenney 	static struct lock_class_key rcu_fqs_class[RCU_NUM_LVLS];
3664199977bfSAlexander Gordeev 
3665199977bfSAlexander Gordeev 	int levelspread[RCU_NUM_LVLS];		/* kids/node in each level. */
36664102adabSPaul E. McKenney 	int cpustride = 1;
36674102adabSPaul E. McKenney 	int i;
36684102adabSPaul E. McKenney 	int j;
36694102adabSPaul E. McKenney 	struct rcu_node *rnp;
3670b8bb1f63SPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
36714102adabSPaul E. McKenney 
367205b84aecSAlexander Gordeev 	BUILD_BUG_ON(RCU_NUM_LVLS > ARRAY_SIZE(buf));  /* Fix buf[] init! */
36734102adabSPaul E. McKenney 
36743eaaaf6cSPaul E. McKenney 	/* Silence gcc 4.8 false positive about array index out of range. */
36753eaaaf6cSPaul E. McKenney 	if (rcu_num_lvls <= 0 || rcu_num_lvls > RCU_NUM_LVLS)
36763eaaaf6cSPaul E. McKenney 		panic("rcu_init_one: rcu_num_lvls out of range");
36774102adabSPaul E. McKenney 
36784102adabSPaul E. McKenney 	/* Initialize the level-tracking arrays. */
36794102adabSPaul E. McKenney 
36804102adabSPaul E. McKenney 	for (i = 1; i < rcu_num_lvls; i++)
368141f5c631SPaul E. McKenney 		rsp->level[i] = rsp->level[i - 1] + num_rcu_lvl[i - 1];
368241f5c631SPaul E. McKenney 	rcu_init_levelspread(levelspread, num_rcu_lvl);
36834102adabSPaul E. McKenney 
36844102adabSPaul E. McKenney 	/* Initialize the elements themselves, starting from the leaves. */
36854102adabSPaul E. McKenney 
36864102adabSPaul E. McKenney 	for (i = rcu_num_lvls - 1; i >= 0; i--) {
3687199977bfSAlexander Gordeev 		cpustride *= levelspread[i];
36884102adabSPaul E. McKenney 		rnp = rsp->level[i];
368941f5c631SPaul E. McKenney 		for (j = 0; j < num_rcu_lvl[i]; j++, rnp++) {
369067c583a7SBoqun Feng 			raw_spin_lock_init(&ACCESS_PRIVATE(rnp, lock));
369167c583a7SBoqun Feng 			lockdep_set_class_and_name(&ACCESS_PRIVATE(rnp, lock),
36924102adabSPaul E. McKenney 						   &rcu_node_class[i], buf[i]);
36934102adabSPaul E. McKenney 			raw_spin_lock_init(&rnp->fqslock);
36944102adabSPaul E. McKenney 			lockdep_set_class_and_name(&rnp->fqslock,
36954102adabSPaul E. McKenney 						   &rcu_fqs_class[i], fqs[i]);
3696de30ad51SPaul E. McKenney 			rnp->gp_seq = rsp->gp_seq;
36977a1d0f23SPaul E. McKenney 			rnp->gp_seq_needed = rsp->gp_seq;
3698d43a5d32SPaul E. McKenney 			rnp->completedqs = rsp->gp_seq;
36994102adabSPaul E. McKenney 			rnp->qsmask = 0;
37004102adabSPaul E. McKenney 			rnp->qsmaskinit = 0;
37014102adabSPaul E. McKenney 			rnp->grplo = j * cpustride;
37024102adabSPaul E. McKenney 			rnp->grphi = (j + 1) * cpustride - 1;
3703595f3900SHimangi Saraogi 			if (rnp->grphi >= nr_cpu_ids)
3704595f3900SHimangi Saraogi 				rnp->grphi = nr_cpu_ids - 1;
37054102adabSPaul E. McKenney 			if (i == 0) {
37064102adabSPaul E. McKenney 				rnp->grpnum = 0;
37074102adabSPaul E. McKenney 				rnp->grpmask = 0;
37084102adabSPaul E. McKenney 				rnp->parent = NULL;
37094102adabSPaul E. McKenney 			} else {
3710199977bfSAlexander Gordeev 				rnp->grpnum = j % levelspread[i - 1];
37114102adabSPaul E. McKenney 				rnp->grpmask = 1UL << rnp->grpnum;
37124102adabSPaul E. McKenney 				rnp->parent = rsp->level[i - 1] +
3713199977bfSAlexander Gordeev 					      j / levelspread[i - 1];
37144102adabSPaul E. McKenney 			}
37154102adabSPaul E. McKenney 			rnp->level = i;
37164102adabSPaul E. McKenney 			INIT_LIST_HEAD(&rnp->blkd_tasks);
37174102adabSPaul E. McKenney 			rcu_init_one_nocb(rnp);
3718f6a12f34SPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[0]);
3719f6a12f34SPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[1]);
37203b5f668eSPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[2]);
37213b5f668eSPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[3]);
3722f6a12f34SPaul E. McKenney 			spin_lock_init(&rnp->exp_lock);
37234102adabSPaul E. McKenney 		}
37244102adabSPaul E. McKenney 	}
37254102adabSPaul E. McKenney 
3726abedf8e2SPaul Gortmaker 	init_swait_queue_head(&rsp->gp_wq);
3727abedf8e2SPaul Gortmaker 	init_swait_queue_head(&rsp->expedited_wq);
3728aedf4ba9SPaul E. McKenney 	rnp = rcu_first_leaf_node();
37294102adabSPaul E. McKenney 	for_each_possible_cpu(i) {
37304102adabSPaul E. McKenney 		while (i > rnp->grphi)
37314102adabSPaul E. McKenney 			rnp++;
3732da1df50dSPaul E. McKenney 		per_cpu_ptr(&rcu_data, i)->mynode = rnp;
373353b46303SPaul E. McKenney 		rcu_boot_init_percpu_data(i);
37344102adabSPaul E. McKenney 	}
37354102adabSPaul E. McKenney }
37364102adabSPaul E. McKenney 
37374102adabSPaul E. McKenney /*
37384102adabSPaul E. McKenney  * Compute the rcu_node tree geometry from kernel parameters.  This cannot
37394102adabSPaul E. McKenney  * replace the definitions in tree.h because those are needed to size
37404102adabSPaul E. McKenney  * the ->node array in the rcu_state structure.
37414102adabSPaul E. McKenney  */
37424102adabSPaul E. McKenney static void __init rcu_init_geometry(void)
37434102adabSPaul E. McKenney {
37444102adabSPaul E. McKenney 	ulong d;
37454102adabSPaul E. McKenney 	int i;
374605b84aecSAlexander Gordeev 	int rcu_capacity[RCU_NUM_LVLS];
37474102adabSPaul E. McKenney 
37484102adabSPaul E. McKenney 	/*
37494102adabSPaul E. McKenney 	 * Initialize any unspecified boot parameters.
37504102adabSPaul E. McKenney 	 * The default values of jiffies_till_first_fqs and
37514102adabSPaul E. McKenney 	 * jiffies_till_next_fqs are set to the RCU_JIFFIES_TILL_FORCE_QS
37524102adabSPaul E. McKenney 	 * value, which is a function of HZ, then adding one for each
37534102adabSPaul E. McKenney 	 * RCU_JIFFIES_FQS_DIV CPUs that might be on the system.
37544102adabSPaul E. McKenney 	 */
37554102adabSPaul E. McKenney 	d = RCU_JIFFIES_TILL_FORCE_QS + nr_cpu_ids / RCU_JIFFIES_FQS_DIV;
37564102adabSPaul E. McKenney 	if (jiffies_till_first_fqs == ULONG_MAX)
37574102adabSPaul E. McKenney 		jiffies_till_first_fqs = d;
37584102adabSPaul E. McKenney 	if (jiffies_till_next_fqs == ULONG_MAX)
37594102adabSPaul E. McKenney 		jiffies_till_next_fqs = d;
37604102adabSPaul E. McKenney 
37614102adabSPaul E. McKenney 	/* If the compile-time values are accurate, just leave. */
376247d631afSPaul E. McKenney 	if (rcu_fanout_leaf == RCU_FANOUT_LEAF &&
37634102adabSPaul E. McKenney 	    nr_cpu_ids == NR_CPUS)
37644102adabSPaul E. McKenney 		return;
3765a7538352SJoe Perches 	pr_info("Adjusting geometry for rcu_fanout_leaf=%d, nr_cpu_ids=%u\n",
376639479098SPaul E. McKenney 		rcu_fanout_leaf, nr_cpu_ids);
37674102adabSPaul E. McKenney 
37684102adabSPaul E. McKenney 	/*
3769ee968ac6SPaul E. McKenney 	 * The boot-time rcu_fanout_leaf parameter must be at least two
3770ee968ac6SPaul E. McKenney 	 * and cannot exceed the number of bits in the rcu_node masks.
3771ee968ac6SPaul E. McKenney 	 * Complain and fall back to the compile-time values if this
3772ee968ac6SPaul E. McKenney 	 * limit is exceeded.
37734102adabSPaul E. McKenney 	 */
3774ee968ac6SPaul E. McKenney 	if (rcu_fanout_leaf < 2 ||
377575cf15a4SAlexander Gordeev 	    rcu_fanout_leaf > sizeof(unsigned long) * 8) {
377613bd6494SPaul E. McKenney 		rcu_fanout_leaf = RCU_FANOUT_LEAF;
37774102adabSPaul E. McKenney 		WARN_ON(1);
37784102adabSPaul E. McKenney 		return;
37794102adabSPaul E. McKenney 	}
37804102adabSPaul E. McKenney 
378175cf15a4SAlexander Gordeev 	/*
37824102adabSPaul E. McKenney 	 * Compute number of nodes that can be handled an rcu_node tree
37839618138bSAlexander Gordeev 	 * with the given number of levels.
37844102adabSPaul E. McKenney 	 */
37859618138bSAlexander Gordeev 	rcu_capacity[0] = rcu_fanout_leaf;
378605b84aecSAlexander Gordeev 	for (i = 1; i < RCU_NUM_LVLS; i++)
37874102adabSPaul E. McKenney 		rcu_capacity[i] = rcu_capacity[i - 1] * RCU_FANOUT;
37884102adabSPaul E. McKenney 
37894102adabSPaul E. McKenney 	/*
379075cf15a4SAlexander Gordeev 	 * The tree must be able to accommodate the configured number of CPUs.
3791ee968ac6SPaul E. McKenney 	 * If this limit is exceeded, fall back to the compile-time values.
37924102adabSPaul E. McKenney 	 */
3793ee968ac6SPaul E. McKenney 	if (nr_cpu_ids > rcu_capacity[RCU_NUM_LVLS - 1]) {
3794ee968ac6SPaul E. McKenney 		rcu_fanout_leaf = RCU_FANOUT_LEAF;
3795ee968ac6SPaul E. McKenney 		WARN_ON(1);
3796ee968ac6SPaul E. McKenney 		return;
3797ee968ac6SPaul E. McKenney 	}
37984102adabSPaul E. McKenney 
3799679f9858SAlexander Gordeev 	/* Calculate the number of levels in the tree. */
38009618138bSAlexander Gordeev 	for (i = 0; nr_cpu_ids > rcu_capacity[i]; i++) {
3801372b0ec2SAlexander Gordeev 	}
38029618138bSAlexander Gordeev 	rcu_num_lvls = i + 1;
3803679f9858SAlexander Gordeev 
38044102adabSPaul E. McKenney 	/* Calculate the number of rcu_nodes at each level of the tree. */
3805679f9858SAlexander Gordeev 	for (i = 0; i < rcu_num_lvls; i++) {
38069618138bSAlexander Gordeev 		int cap = rcu_capacity[(rcu_num_lvls - 1) - i];
3807679f9858SAlexander Gordeev 		num_rcu_lvl[i] = DIV_ROUND_UP(nr_cpu_ids, cap);
38084102adabSPaul E. McKenney 	}
38094102adabSPaul E. McKenney 
38104102adabSPaul E. McKenney 	/* Calculate the total number of rcu_node structures. */
38114102adabSPaul E. McKenney 	rcu_num_nodes = 0;
3812679f9858SAlexander Gordeev 	for (i = 0; i < rcu_num_lvls; i++)
38134102adabSPaul E. McKenney 		rcu_num_nodes += num_rcu_lvl[i];
38144102adabSPaul E. McKenney }
38154102adabSPaul E. McKenney 
3816a3dc2948SPaul E. McKenney /*
3817a3dc2948SPaul E. McKenney  * Dump out the structure of the rcu_node combining tree associated
3818a3dc2948SPaul E. McKenney  * with the rcu_state structure referenced by rsp.
3819a3dc2948SPaul E. McKenney  */
3820b8bb1f63SPaul E. McKenney static void __init rcu_dump_rcu_node_tree(void)
3821a3dc2948SPaul E. McKenney {
3822a3dc2948SPaul E. McKenney 	int level = 0;
3823a3dc2948SPaul E. McKenney 	struct rcu_node *rnp;
3824a3dc2948SPaul E. McKenney 
3825a3dc2948SPaul E. McKenney 	pr_info("rcu_node tree layout dump\n");
3826a3dc2948SPaul E. McKenney 	pr_info(" ");
3827aedf4ba9SPaul E. McKenney 	rcu_for_each_node_breadth_first(rnp) {
3828a3dc2948SPaul E. McKenney 		if (rnp->level != level) {
3829a3dc2948SPaul E. McKenney 			pr_cont("\n");
3830a3dc2948SPaul E. McKenney 			pr_info(" ");
3831a3dc2948SPaul E. McKenney 			level = rnp->level;
3832a3dc2948SPaul E. McKenney 		}
3833a3dc2948SPaul E. McKenney 		pr_cont("%d:%d ^%d  ", rnp->grplo, rnp->grphi, rnp->grpnum);
3834a3dc2948SPaul E. McKenney 	}
3835a3dc2948SPaul E. McKenney 	pr_cont("\n");
3836a3dc2948SPaul E. McKenney }
3837a3dc2948SPaul E. McKenney 
3838ad7c946bSPaul E. McKenney struct workqueue_struct *rcu_gp_wq;
383925f3d7efSPaul E. McKenney struct workqueue_struct *rcu_par_gp_wq;
3840ad7c946bSPaul E. McKenney 
38414102adabSPaul E. McKenney void __init rcu_init(void)
38424102adabSPaul E. McKenney {
38434102adabSPaul E. McKenney 	int cpu;
38444102adabSPaul E. McKenney 
384547627678SPaul E. McKenney 	rcu_early_boot_tests();
384647627678SPaul E. McKenney 
38474102adabSPaul E. McKenney 	rcu_bootup_announce();
38484102adabSPaul E. McKenney 	rcu_init_geometry();
3849b8bb1f63SPaul E. McKenney 	rcu_init_one();
3850a3dc2948SPaul E. McKenney 	if (dump_tree)
3851b8bb1f63SPaul E. McKenney 		rcu_dump_rcu_node_tree();
38524102adabSPaul E. McKenney 	open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
38534102adabSPaul E. McKenney 
38544102adabSPaul E. McKenney 	/*
38554102adabSPaul E. McKenney 	 * We don't need protection against CPU-hotplug here because
38564102adabSPaul E. McKenney 	 * this is called early in boot, before either interrupts
38574102adabSPaul E. McKenney 	 * or the scheduler are operational.
38584102adabSPaul E. McKenney 	 */
38594102adabSPaul E. McKenney 	pm_notifier(rcu_pm_notify, 0);
38607ec99de3SPaul E. McKenney 	for_each_online_cpu(cpu) {
38614df83742SThomas Gleixner 		rcutree_prepare_cpu(cpu);
38627ec99de3SPaul E. McKenney 		rcu_cpu_starting(cpu);
38639b9500daSPaul E. McKenney 		rcutree_online_cpu(cpu);
38647ec99de3SPaul E. McKenney 	}
3865ad7c946bSPaul E. McKenney 
3866ad7c946bSPaul E. McKenney 	/* Create workqueue for expedited GPs and for Tree SRCU. */
3867ad7c946bSPaul E. McKenney 	rcu_gp_wq = alloc_workqueue("rcu_gp", WQ_MEM_RECLAIM, 0);
3868ad7c946bSPaul E. McKenney 	WARN_ON(!rcu_gp_wq);
386925f3d7efSPaul E. McKenney 	rcu_par_gp_wq = alloc_workqueue("rcu_par_gp", WQ_MEM_RECLAIM, 0);
387025f3d7efSPaul E. McKenney 	WARN_ON(!rcu_par_gp_wq);
38714102adabSPaul E. McKenney }
38724102adabSPaul E. McKenney 
38733549c2bcSPaul E. McKenney #include "tree_exp.h"
38744102adabSPaul E. McKenney #include "tree_plugin.h"
3875