xref: /openbmc/linux/kernel/rcu/tree.c (revision 10462d6f58fb6dbde7563e9343505d98d5bfba3d)
122e40925SPaul E. McKenney // SPDX-License-Identifier: GPL-2.0+
24102adabSPaul E. McKenney /*
34102adabSPaul E. McKenney  * Read-Copy Update mechanism for mutual exclusion
44102adabSPaul E. McKenney  *
54102adabSPaul E. McKenney  * Copyright IBM Corporation, 2008
64102adabSPaul E. McKenney  *
74102adabSPaul E. McKenney  * Authors: Dipankar Sarma <dipankar@in.ibm.com>
84102adabSPaul E. McKenney  *	    Manfred Spraul <manfred@colorfullife.com>
922e40925SPaul E. McKenney  *	    Paul E. McKenney <paulmck@linux.ibm.com> Hierarchical version
104102adabSPaul E. McKenney  *
1122e40925SPaul E. McKenney  * Based on the original work by Paul McKenney <paulmck@linux.ibm.com>
124102adabSPaul E. McKenney  * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen.
134102adabSPaul E. McKenney  *
144102adabSPaul E. McKenney  * For detailed explanation of Read-Copy Update mechanism see -
154102adabSPaul E. McKenney  *	Documentation/RCU
164102adabSPaul E. McKenney  */
17a7538352SJoe Perches 
18a7538352SJoe Perches #define pr_fmt(fmt) "rcu: " fmt
19a7538352SJoe Perches 
204102adabSPaul E. McKenney #include <linux/types.h>
214102adabSPaul E. McKenney #include <linux/kernel.h>
224102adabSPaul E. McKenney #include <linux/init.h>
234102adabSPaul E. McKenney #include <linux/spinlock.h>
244102adabSPaul E. McKenney #include <linux/smp.h>
25f9411ebeSIngo Molnar #include <linux/rcupdate_wait.h>
264102adabSPaul E. McKenney #include <linux/interrupt.h>
274102adabSPaul E. McKenney #include <linux/sched.h>
28b17b0153SIngo Molnar #include <linux/sched/debug.h>
294102adabSPaul E. McKenney #include <linux/nmi.h>
304102adabSPaul E. McKenney #include <linux/atomic.h>
314102adabSPaul E. McKenney #include <linux/bitops.h>
324102adabSPaul E. McKenney #include <linux/export.h>
334102adabSPaul E. McKenney #include <linux/completion.h>
344102adabSPaul E. McKenney #include <linux/moduleparam.h>
354102adabSPaul E. McKenney #include <linux/percpu.h>
364102adabSPaul E. McKenney #include <linux/notifier.h>
374102adabSPaul E. McKenney #include <linux/cpu.h>
384102adabSPaul E. McKenney #include <linux/mutex.h>
394102adabSPaul E. McKenney #include <linux/time.h>
404102adabSPaul E. McKenney #include <linux/kernel_stat.h>
414102adabSPaul E. McKenney #include <linux/wait.h>
424102adabSPaul E. McKenney #include <linux/kthread.h>
43ae7e81c0SIngo Molnar #include <uapi/linux/sched/types.h>
444102adabSPaul E. McKenney #include <linux/prefetch.h>
454102adabSPaul E. McKenney #include <linux/delay.h>
464102adabSPaul E. McKenney #include <linux/stop_machine.h>
474102adabSPaul E. McKenney #include <linux/random.h>
48af658dcaSSteven Rostedt (Red Hat) #include <linux/trace_events.h>
494102adabSPaul E. McKenney #include <linux/suspend.h>
50a278d471SPaul E. McKenney #include <linux/ftrace.h>
51d3052109SPaul E. McKenney #include <linux/tick.h>
522ccaff10SPaul E. McKenney #include <linux/sysrq.h>
53c13324a5SMasami Hiramatsu #include <linux/kprobes.h>
544102adabSPaul E. McKenney 
554102adabSPaul E. McKenney #include "tree.h"
564102adabSPaul E. McKenney #include "rcu.h"
574102adabSPaul E. McKenney 
584102adabSPaul E. McKenney #ifdef MODULE_PARAM_PREFIX
594102adabSPaul E. McKenney #undef MODULE_PARAM_PREFIX
604102adabSPaul E. McKenney #endif
614102adabSPaul E. McKenney #define MODULE_PARAM_PREFIX "rcutree."
624102adabSPaul E. McKenney 
634102adabSPaul E. McKenney /* Data structures. */
644102adabSPaul E. McKenney 
654102adabSPaul E. McKenney /*
66dc5a4f29SPaul E. McKenney  * Steal a bit from the bottom of ->dynticks for idle entry/exit
67dc5a4f29SPaul E. McKenney  * control.  Initially this is for TLB flushing.
684102adabSPaul E. McKenney  */
69dc5a4f29SPaul E. McKenney #define RCU_DYNTICK_CTRL_MASK 0x1
70dc5a4f29SPaul E. McKenney #define RCU_DYNTICK_CTRL_CTR  (RCU_DYNTICK_CTRL_MASK + 1)
71dc5a4f29SPaul E. McKenney #ifndef rcu_eqs_special_exit
72dc5a4f29SPaul E. McKenney #define rcu_eqs_special_exit() do { } while (0)
73a8a29b3bSArd Biesheuvel #endif
74a8a29b3bSArd Biesheuvel 
754c5273bfSPaul E. McKenney static DEFINE_PER_CPU_SHARED_ALIGNED(struct rcu_data, rcu_data) = {
764c5273bfSPaul E. McKenney 	.dynticks_nesting = 1,
774c5273bfSPaul E. McKenney 	.dynticks_nmi_nesting = DYNTICK_IRQ_NONIDLE,
78dc5a4f29SPaul E. McKenney 	.dynticks = ATOMIC_INIT(RCU_DYNTICK_CTRL_CTR),
794c5273bfSPaul E. McKenney };
80358be2d3SPaul E. McKenney struct rcu_state rcu_state = {
81358be2d3SPaul E. McKenney 	.level = { &rcu_state.node[0] },
82358be2d3SPaul E. McKenney 	.gp_state = RCU_GP_IDLE,
83358be2d3SPaul E. McKenney 	.gp_seq = (0UL - 300UL) << RCU_SEQ_CTR_SHIFT,
84358be2d3SPaul E. McKenney 	.barrier_mutex = __MUTEX_INITIALIZER(rcu_state.barrier_mutex),
85358be2d3SPaul E. McKenney 	.name = RCU_NAME,
86358be2d3SPaul E. McKenney 	.abbr = RCU_ABBR,
87358be2d3SPaul E. McKenney 	.exp_mutex = __MUTEX_INITIALIZER(rcu_state.exp_mutex),
88358be2d3SPaul E. McKenney 	.exp_wake_mutex = __MUTEX_INITIALIZER(rcu_state.exp_wake_mutex),
89894d45bbSMike Galbraith 	.ofl_lock = __RAW_SPIN_LOCK_UNLOCKED(rcu_state.ofl_lock),
90358be2d3SPaul E. McKenney };
914102adabSPaul E. McKenney 
92a3dc2948SPaul E. McKenney /* Dump rcu_node combining tree at boot to verify correct setup. */
93a3dc2948SPaul E. McKenney static bool dump_tree;
94a3dc2948SPaul E. McKenney module_param(dump_tree, bool, 0444);
957fa27001SPaul E. McKenney /* Control rcu_node-tree auto-balancing at boot time. */
967fa27001SPaul E. McKenney static bool rcu_fanout_exact;
977fa27001SPaul E. McKenney module_param(rcu_fanout_exact, bool, 0444);
9847d631afSPaul E. McKenney /* Increase (but not decrease) the RCU_FANOUT_LEAF at boot time. */
9947d631afSPaul E. McKenney static int rcu_fanout_leaf = RCU_FANOUT_LEAF;
1004102adabSPaul E. McKenney module_param(rcu_fanout_leaf, int, 0444);
1014102adabSPaul E. McKenney int rcu_num_lvls __read_mostly = RCU_NUM_LVLS;
102cb007102SAlexander Gordeev /* Number of rcu_nodes at specified level. */
103e95d68d2SPaul E. McKenney int num_rcu_lvl[] = NUM_RCU_LVL_INIT;
1044102adabSPaul E. McKenney int rcu_num_nodes __read_mostly = NUM_RCU_NODES; /* Total # rcu_nodes in use. */
105088e9d25SDaniel Bristot de Oliveira /* panic() on RCU Stall sysctl. */
106088e9d25SDaniel Bristot de Oliveira int sysctl_panic_on_rcu_stall __read_mostly;
1072ccaff10SPaul E. McKenney /* Commandeer a sysrq key to dump RCU's tree. */
1082ccaff10SPaul E. McKenney static bool sysrq_rcu;
1092ccaff10SPaul E. McKenney module_param(sysrq_rcu, bool, 0444);
1104102adabSPaul E. McKenney 
1114102adabSPaul E. McKenney /*
11252d7e48bSPaul E. McKenney  * The rcu_scheduler_active variable is initialized to the value
11352d7e48bSPaul E. McKenney  * RCU_SCHEDULER_INACTIVE and transitions RCU_SCHEDULER_INIT just before the
11452d7e48bSPaul E. McKenney  * first task is spawned.  So when this variable is RCU_SCHEDULER_INACTIVE,
11552d7e48bSPaul E. McKenney  * RCU can assume that there is but one task, allowing RCU to (for example)
1160d95092cSPaul E. McKenney  * optimize synchronize_rcu() to a simple barrier().  When this variable
11752d7e48bSPaul E. McKenney  * is RCU_SCHEDULER_INIT, RCU must actually do all the hard work required
11852d7e48bSPaul E. McKenney  * to detect real grace periods.  This variable is also used to suppress
11952d7e48bSPaul E. McKenney  * boot-time false positives from lockdep-RCU error checking.  Finally, it
12052d7e48bSPaul E. McKenney  * transitions from RCU_SCHEDULER_INIT to RCU_SCHEDULER_RUNNING after RCU
12152d7e48bSPaul E. McKenney  * is fully initialized, including all of its kthreads having been spawned.
1224102adabSPaul E. McKenney  */
1234102adabSPaul E. McKenney int rcu_scheduler_active __read_mostly;
1244102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_scheduler_active);
1254102adabSPaul E. McKenney 
1264102adabSPaul E. McKenney /*
1274102adabSPaul E. McKenney  * The rcu_scheduler_fully_active variable transitions from zero to one
1284102adabSPaul E. McKenney  * during the early_initcall() processing, which is after the scheduler
1294102adabSPaul E. McKenney  * is capable of creating new tasks.  So RCU processing (for example,
1304102adabSPaul E. McKenney  * creating tasks for RCU priority boosting) must be delayed until after
1314102adabSPaul E. McKenney  * rcu_scheduler_fully_active transitions from zero to one.  We also
1324102adabSPaul E. McKenney  * currently delay invocation of any RCU callbacks until after this point.
1334102adabSPaul E. McKenney  *
1344102adabSPaul E. McKenney  * It might later prove better for people registering RCU callbacks during
1354102adabSPaul E. McKenney  * early boot to take responsibility for these callbacks, but one step at
1364102adabSPaul E. McKenney  * a time.
1374102adabSPaul E. McKenney  */
1384102adabSPaul E. McKenney static int rcu_scheduler_fully_active __read_mostly;
1394102adabSPaul E. McKenney 
140b50912d0SPaul E. McKenney static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp,
141b50912d0SPaul E. McKenney 			      unsigned long gps, unsigned long flags);
1420aa04b05SPaul E. McKenney static void rcu_init_new_rnp(struct rcu_node *rnp_leaf);
1430aa04b05SPaul E. McKenney static void rcu_cleanup_dead_rnp(struct rcu_node *rnp_leaf);
1444102adabSPaul E. McKenney static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, int outgoingcpu);
1454102adabSPaul E. McKenney static void invoke_rcu_core(void);
146aff4e9edSPaul E. McKenney static void invoke_rcu_callbacks(struct rcu_data *rdp);
14763d4c8c9SPaul E. McKenney static void rcu_report_exp_rdp(struct rcu_data *rdp);
1483549c2bcSPaul E. McKenney static void sync_sched_exp_online_cleanup(int cpu);
1494102adabSPaul E. McKenney 
150a94844b2SPaul E. McKenney /* rcuc/rcub kthread realtime priority */
15126730f55SPaul E. McKenney static int kthread_prio = IS_ENABLED(CONFIG_RCU_BOOST) ? 1 : 0;
152a94844b2SPaul E. McKenney module_param(kthread_prio, int, 0644);
153a94844b2SPaul E. McKenney 
1548d7dc928SPaul E. McKenney /* Delay in jiffies for grace-period initialization delays, debug only. */
1550f41c0ddSPaul E. McKenney 
15690040c9eSPaul E. McKenney static int gp_preinit_delay;
15790040c9eSPaul E. McKenney module_param(gp_preinit_delay, int, 0444);
15890040c9eSPaul E. McKenney static int gp_init_delay;
15990040c9eSPaul E. McKenney module_param(gp_init_delay, int, 0444);
16090040c9eSPaul E. McKenney static int gp_cleanup_delay;
16190040c9eSPaul E. McKenney module_param(gp_cleanup_delay, int, 0444);
1620f41c0ddSPaul E. McKenney 
1634cf439a2SPaul E. McKenney /* Retrieve RCU kthreads priority for rcutorture */
1644babd855SJoel Fernandes (Google) int rcu_get_gp_kthreads_prio(void)
1654babd855SJoel Fernandes (Google) {
1664babd855SJoel Fernandes (Google) 	return kthread_prio;
1674babd855SJoel Fernandes (Google) }
1684babd855SJoel Fernandes (Google) EXPORT_SYMBOL_GPL(rcu_get_gp_kthreads_prio);
1694babd855SJoel Fernandes (Google) 
170eab128e8SPaul E. McKenney /*
171eab128e8SPaul E. McKenney  * Number of grace periods between delays, normalized by the duration of
172bfd090beSPaul E. McKenney  * the delay.  The longer the delay, the more the grace periods between
173eab128e8SPaul E. McKenney  * each delay.  The reason for this normalization is that it means that,
174eab128e8SPaul E. McKenney  * for non-zero delays, the overall slowdown of grace periods is constant
175eab128e8SPaul E. McKenney  * regardless of the duration of the delay.  This arrangement balances
176eab128e8SPaul E. McKenney  * the need for long delays to increase some race probabilities with the
177eab128e8SPaul E. McKenney  * need for fast grace periods to increase other race probabilities.
178eab128e8SPaul E. McKenney  */
179eab128e8SPaul E. McKenney #define PER_RCU_NODE_PERIOD 3	/* Number of grace periods between delays. */
18037745d28SPaul E. McKenney 
1814102adabSPaul E. McKenney /*
1820aa04b05SPaul E. McKenney  * Compute the mask of online CPUs for the specified rcu_node structure.
1830aa04b05SPaul E. McKenney  * This will not be stable unless the rcu_node structure's ->lock is
1840aa04b05SPaul E. McKenney  * held, but the bit corresponding to the current CPU will be stable
1850aa04b05SPaul E. McKenney  * in most contexts.
1860aa04b05SPaul E. McKenney  */
1870aa04b05SPaul E. McKenney unsigned long rcu_rnp_online_cpus(struct rcu_node *rnp)
1880aa04b05SPaul E. McKenney {
1897d0ae808SPaul E. McKenney 	return READ_ONCE(rnp->qsmaskinitnext);
1900aa04b05SPaul E. McKenney }
1910aa04b05SPaul E. McKenney 
1920aa04b05SPaul E. McKenney /*
1937d0ae808SPaul E. McKenney  * Return true if an RCU grace period is in progress.  The READ_ONCE()s
1944102adabSPaul E. McKenney  * permit this function to be invoked without holding the root rcu_node
1954102adabSPaul E. McKenney  * structure's ->lock, but of course results can be subject to change.
1964102adabSPaul E. McKenney  */
197de8e8730SPaul E. McKenney static int rcu_gp_in_progress(void)
1984102adabSPaul E. McKenney {
199de8e8730SPaul E. McKenney 	return rcu_seq_state(rcu_seq_current(&rcu_state.gp_seq));
2004102adabSPaul E. McKenney }
2014102adabSPaul E. McKenney 
202903ee83dSPaul E. McKenney /*
203903ee83dSPaul E. McKenney  * Return the number of callbacks queued on the specified CPU.
204903ee83dSPaul E. McKenney  * Handles both the nocbs and normal cases.
205903ee83dSPaul E. McKenney  */
206903ee83dSPaul E. McKenney static long rcu_get_n_cbs_cpu(int cpu)
207903ee83dSPaul E. McKenney {
208903ee83dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
209903ee83dSPaul E. McKenney 
210903ee83dSPaul E. McKenney 	if (rcu_segcblist_is_enabled(&rdp->cblist)) /* Online normal CPU? */
211903ee83dSPaul E. McKenney 		return rcu_segcblist_n_cbs(&rdp->cblist);
212903ee83dSPaul E. McKenney 	return rcu_get_n_cbs_nocb_cpu(rdp); /* Works for offline, too. */
213903ee83dSPaul E. McKenney }
214903ee83dSPaul E. McKenney 
215d28139c4SPaul E. McKenney void rcu_softirq_qs(void)
2164102adabSPaul E. McKenney {
21745975c7dSPaul E. McKenney 	rcu_qs();
218d28139c4SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
2194102adabSPaul E. McKenney }
2204102adabSPaul E. McKenney 
2216563de9dSPaul E. McKenney /*
2222625d469SPaul E. McKenney  * Record entry into an extended quiescent state.  This is only to be
2232625d469SPaul E. McKenney  * called when not already in an extended quiescent state.
2242625d469SPaul E. McKenney  */
2252625d469SPaul E. McKenney static void rcu_dynticks_eqs_enter(void)
2262625d469SPaul E. McKenney {
227dc5a4f29SPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
228b8c17e66SPaul E. McKenney 	int seq;
2292625d469SPaul E. McKenney 
2302625d469SPaul E. McKenney 	/*
231b8c17e66SPaul E. McKenney 	 * CPUs seeing atomic_add_return() must see prior RCU read-side
2322625d469SPaul E. McKenney 	 * critical sections, and we also must force ordering with the
2332625d469SPaul E. McKenney 	 * next idle sojourn.
2342625d469SPaul E. McKenney 	 */
235dc5a4f29SPaul E. McKenney 	seq = atomic_add_return(RCU_DYNTICK_CTRL_CTR, &rdp->dynticks);
236b8c17e66SPaul E. McKenney 	/* Better be in an extended quiescent state! */
237b8c17e66SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
238b8c17e66SPaul E. McKenney 		     (seq & RCU_DYNTICK_CTRL_CTR));
239b8c17e66SPaul E. McKenney 	/* Better not have special action (TLB flush) pending! */
240b8c17e66SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
241b8c17e66SPaul E. McKenney 		     (seq & RCU_DYNTICK_CTRL_MASK));
2422625d469SPaul E. McKenney }
2432625d469SPaul E. McKenney 
2442625d469SPaul E. McKenney /*
2452625d469SPaul E. McKenney  * Record exit from an extended quiescent state.  This is only to be
2462625d469SPaul E. McKenney  * called from an extended quiescent state.
2472625d469SPaul E. McKenney  */
2482625d469SPaul E. McKenney static void rcu_dynticks_eqs_exit(void)
2492625d469SPaul E. McKenney {
250dc5a4f29SPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
251b8c17e66SPaul E. McKenney 	int seq;
2522625d469SPaul E. McKenney 
2532625d469SPaul E. McKenney 	/*
254b8c17e66SPaul E. McKenney 	 * CPUs seeing atomic_add_return() must see prior idle sojourns,
2552625d469SPaul E. McKenney 	 * and we also must force ordering with the next RCU read-side
2562625d469SPaul E. McKenney 	 * critical section.
2572625d469SPaul E. McKenney 	 */
258dc5a4f29SPaul E. McKenney 	seq = atomic_add_return(RCU_DYNTICK_CTRL_CTR, &rdp->dynticks);
259b8c17e66SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
260b8c17e66SPaul E. McKenney 		     !(seq & RCU_DYNTICK_CTRL_CTR));
261b8c17e66SPaul E. McKenney 	if (seq & RCU_DYNTICK_CTRL_MASK) {
262dc5a4f29SPaul E. McKenney 		atomic_andnot(RCU_DYNTICK_CTRL_MASK, &rdp->dynticks);
263b8c17e66SPaul E. McKenney 		smp_mb__after_atomic(); /* _exit after clearing mask. */
264b8c17e66SPaul E. McKenney 		/* Prefer duplicate flushes to losing a flush. */
265b8c17e66SPaul E. McKenney 		rcu_eqs_special_exit();
266b8c17e66SPaul E. McKenney 	}
2672625d469SPaul E. McKenney }
2682625d469SPaul E. McKenney 
2692625d469SPaul E. McKenney /*
2702625d469SPaul E. McKenney  * Reset the current CPU's ->dynticks counter to indicate that the
2712625d469SPaul E. McKenney  * newly onlined CPU is no longer in an extended quiescent state.
2722625d469SPaul E. McKenney  * This will either leave the counter unchanged, or increment it
2732625d469SPaul E. McKenney  * to the next non-quiescent value.
2742625d469SPaul E. McKenney  *
2752625d469SPaul E. McKenney  * The non-atomic test/increment sequence works because the upper bits
2762625d469SPaul E. McKenney  * of the ->dynticks counter are manipulated only by the corresponding CPU,
2772625d469SPaul E. McKenney  * or when the corresponding CPU is offline.
2782625d469SPaul E. McKenney  */
2792625d469SPaul E. McKenney static void rcu_dynticks_eqs_online(void)
2802625d469SPaul E. McKenney {
281dc5a4f29SPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
2822625d469SPaul E. McKenney 
283dc5a4f29SPaul E. McKenney 	if (atomic_read(&rdp->dynticks) & RCU_DYNTICK_CTRL_CTR)
2842625d469SPaul E. McKenney 		return;
285dc5a4f29SPaul E. McKenney 	atomic_add(RCU_DYNTICK_CTRL_CTR, &rdp->dynticks);
2862625d469SPaul E. McKenney }
2872625d469SPaul E. McKenney 
2882625d469SPaul E. McKenney /*
28902a5c550SPaul E. McKenney  * Is the current CPU in an extended quiescent state?
29002a5c550SPaul E. McKenney  *
29102a5c550SPaul E. McKenney  * No ordering, as we are sampling CPU-local information.
29202a5c550SPaul E. McKenney  */
29302a5c550SPaul E. McKenney bool rcu_dynticks_curr_cpu_in_eqs(void)
29402a5c550SPaul E. McKenney {
295dc5a4f29SPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
29602a5c550SPaul E. McKenney 
297dc5a4f29SPaul E. McKenney 	return !(atomic_read(&rdp->dynticks) & RCU_DYNTICK_CTRL_CTR);
29802a5c550SPaul E. McKenney }
29902a5c550SPaul E. McKenney 
30002a5c550SPaul E. McKenney /*
3018b2f63abSPaul E. McKenney  * Snapshot the ->dynticks counter with full ordering so as to allow
3028b2f63abSPaul E. McKenney  * stable comparison of this counter with past and future snapshots.
3038b2f63abSPaul E. McKenney  */
304dc5a4f29SPaul E. McKenney int rcu_dynticks_snap(struct rcu_data *rdp)
3058b2f63abSPaul E. McKenney {
306dc5a4f29SPaul E. McKenney 	int snap = atomic_add_return(0, &rdp->dynticks);
3078b2f63abSPaul E. McKenney 
308b8c17e66SPaul E. McKenney 	return snap & ~RCU_DYNTICK_CTRL_MASK;
3098b2f63abSPaul E. McKenney }
3108b2f63abSPaul E. McKenney 
3118b2f63abSPaul E. McKenney /*
31202a5c550SPaul E. McKenney  * Return true if the snapshot returned from rcu_dynticks_snap()
31302a5c550SPaul E. McKenney  * indicates that RCU is in an extended quiescent state.
31402a5c550SPaul E. McKenney  */
31502a5c550SPaul E. McKenney static bool rcu_dynticks_in_eqs(int snap)
31602a5c550SPaul E. McKenney {
317b8c17e66SPaul E. McKenney 	return !(snap & RCU_DYNTICK_CTRL_CTR);
31802a5c550SPaul E. McKenney }
31902a5c550SPaul E. McKenney 
32002a5c550SPaul E. McKenney /*
321dc5a4f29SPaul E. McKenney  * Return true if the CPU corresponding to the specified rcu_data
32202a5c550SPaul E. McKenney  * structure has spent some time in an extended quiescent state since
32302a5c550SPaul E. McKenney  * rcu_dynticks_snap() returned the specified snapshot.
32402a5c550SPaul E. McKenney  */
325dc5a4f29SPaul E. McKenney static bool rcu_dynticks_in_eqs_since(struct rcu_data *rdp, int snap)
32602a5c550SPaul E. McKenney {
327dc5a4f29SPaul E. McKenney 	return snap != rcu_dynticks_snap(rdp);
32802a5c550SPaul E. McKenney }
32902a5c550SPaul E. McKenney 
33002a5c550SPaul E. McKenney /*
331b8c17e66SPaul E. McKenney  * Set the special (bottom) bit of the specified CPU so that it
332b8c17e66SPaul E. McKenney  * will take special action (such as flushing its TLB) on the
333b8c17e66SPaul E. McKenney  * next exit from an extended quiescent state.  Returns true if
334b8c17e66SPaul E. McKenney  * the bit was successfully set, or false if the CPU was not in
335b8c17e66SPaul E. McKenney  * an extended quiescent state.
336b8c17e66SPaul E. McKenney  */
337b8c17e66SPaul E. McKenney bool rcu_eqs_special_set(int cpu)
338b8c17e66SPaul E. McKenney {
339b8c17e66SPaul E. McKenney 	int old;
340b8c17e66SPaul E. McKenney 	int new;
341dc5a4f29SPaul E. McKenney 	struct rcu_data *rdp = &per_cpu(rcu_data, cpu);
342b8c17e66SPaul E. McKenney 
343b8c17e66SPaul E. McKenney 	do {
344dc5a4f29SPaul E. McKenney 		old = atomic_read(&rdp->dynticks);
345b8c17e66SPaul E. McKenney 		if (old & RCU_DYNTICK_CTRL_CTR)
346b8c17e66SPaul E. McKenney 			return false;
347b8c17e66SPaul E. McKenney 		new = old | RCU_DYNTICK_CTRL_MASK;
348dc5a4f29SPaul E. McKenney 	} while (atomic_cmpxchg(&rdp->dynticks, old, new) != old);
349b8c17e66SPaul E. McKenney 	return true;
3506563de9dSPaul E. McKenney }
3515cd37193SPaul E. McKenney 
3524a81e832SPaul E. McKenney /*
3534a81e832SPaul E. McKenney  * Let the RCU core know that this CPU has gone through the scheduler,
3544a81e832SPaul E. McKenney  * which is a quiescent state.  This is called when the need for a
3554a81e832SPaul E. McKenney  * quiescent state is urgent, so we burn an atomic operation and full
3564a81e832SPaul E. McKenney  * memory barriers to let the RCU core know about it, regardless of what
3574a81e832SPaul E. McKenney  * this CPU might (or might not) do in the near future.
3584a81e832SPaul E. McKenney  *
3590f9be8caSPaul E. McKenney  * We inform the RCU core by emulating a zero-duration dyntick-idle period.
36046a5d164SPaul E. McKenney  *
3613b57a399SPaul E. McKenney  * The caller must have disabled interrupts and must not be idle.
3624a81e832SPaul E. McKenney  */
363395a2f09SPaul E. McKenney static void __maybe_unused rcu_momentary_dyntick_idle(void)
3644a81e832SPaul E. McKenney {
3653b57a399SPaul E. McKenney 	int special;
3663b57a399SPaul E. McKenney 
3672dba13f0SPaul E. McKenney 	raw_cpu_write(rcu_data.rcu_need_heavy_qs, false);
368dc5a4f29SPaul E. McKenney 	special = atomic_add_return(2 * RCU_DYNTICK_CTRL_CTR,
369dc5a4f29SPaul E. McKenney 				    &this_cpu_ptr(&rcu_data)->dynticks);
3703b57a399SPaul E. McKenney 	/* It is illegal to call this from idle state. */
3713b57a399SPaul E. McKenney 	WARN_ON_ONCE(!(special & RCU_DYNTICK_CTRL_CTR));
3723e310098SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
3734a81e832SPaul E. McKenney }
3744a81e832SPaul E. McKenney 
37545975c7dSPaul E. McKenney /**
37645975c7dSPaul E. McKenney  * rcu_is_cpu_rrupt_from_idle - see if idle or immediately interrupted from idle
377bb73c52bSBoqun Feng  *
37845975c7dSPaul E. McKenney  * If the current CPU is idle or running at a first-level (not nested)
37945975c7dSPaul E. McKenney  * interrupt from idle, return true.  The caller must have at least
38045975c7dSPaul E. McKenney  * disabled preemption.
3815cd37193SPaul E. McKenney  */
38245975c7dSPaul E. McKenney static int rcu_is_cpu_rrupt_from_idle(void)
3835cd37193SPaul E. McKenney {
3844c5273bfSPaul E. McKenney 	return __this_cpu_read(rcu_data.dynticks_nesting) <= 0 &&
3854c5273bfSPaul E. McKenney 	       __this_cpu_read(rcu_data.dynticks_nmi_nesting) <= 1;
3869226b10dSPaul E. McKenney }
3875cd37193SPaul E. McKenney 
38817c7798bSPaul E. McKenney #define DEFAULT_RCU_BLIMIT 10     /* Maximum callbacks per rcu_do_batch. */
38917c7798bSPaul E. McKenney static long blimit = DEFAULT_RCU_BLIMIT;
39017c7798bSPaul E. McKenney #define DEFAULT_RCU_QHIMARK 10000 /* If this many pending, ignore blimit. */
39117c7798bSPaul E. McKenney static long qhimark = DEFAULT_RCU_QHIMARK;
39217c7798bSPaul E. McKenney #define DEFAULT_RCU_QLOMARK 100   /* Once only this many pending, use blimit. */
39317c7798bSPaul E. McKenney static long qlowmark = DEFAULT_RCU_QLOMARK;
3944102adabSPaul E. McKenney 
3954102adabSPaul E. McKenney module_param(blimit, long, 0444);
3964102adabSPaul E. McKenney module_param(qhimark, long, 0444);
3974102adabSPaul E. McKenney module_param(qlowmark, long, 0444);
3984102adabSPaul E. McKenney 
3994102adabSPaul E. McKenney static ulong jiffies_till_first_fqs = ULONG_MAX;
4004102adabSPaul E. McKenney static ulong jiffies_till_next_fqs = ULONG_MAX;
4018c7c4829SPaul E. McKenney static bool rcu_kick_kthreads;
4024102adabSPaul E. McKenney 
403c06aed0eSPaul E. McKenney /*
404c06aed0eSPaul E. McKenney  * How long the grace period must be before we start recruiting
405c06aed0eSPaul E. McKenney  * quiescent-state help from rcu_note_context_switch().
406c06aed0eSPaul E. McKenney  */
407c06aed0eSPaul E. McKenney static ulong jiffies_till_sched_qs = ULONG_MAX;
408c06aed0eSPaul E. McKenney module_param(jiffies_till_sched_qs, ulong, 0444);
409c06aed0eSPaul E. McKenney static ulong jiffies_to_sched_qs; /* Adjusted version of above if not default */
410c06aed0eSPaul E. McKenney module_param(jiffies_to_sched_qs, ulong, 0444); /* Display only! */
411c06aed0eSPaul E. McKenney 
412c06aed0eSPaul E. McKenney /*
413c06aed0eSPaul E. McKenney  * Make sure that we give the grace-period kthread time to detect any
414c06aed0eSPaul E. McKenney  * idle CPUs before taking active measures to force quiescent states.
415c06aed0eSPaul E. McKenney  * However, don't go below 100 milliseconds, adjusted upwards for really
416c06aed0eSPaul E. McKenney  * large systems.
417c06aed0eSPaul E. McKenney  */
418c06aed0eSPaul E. McKenney static void adjust_jiffies_till_sched_qs(void)
419c06aed0eSPaul E. McKenney {
420c06aed0eSPaul E. McKenney 	unsigned long j;
421c06aed0eSPaul E. McKenney 
422c06aed0eSPaul E. McKenney 	/* If jiffies_till_sched_qs was specified, respect the request. */
423c06aed0eSPaul E. McKenney 	if (jiffies_till_sched_qs != ULONG_MAX) {
424c06aed0eSPaul E. McKenney 		WRITE_ONCE(jiffies_to_sched_qs, jiffies_till_sched_qs);
425c06aed0eSPaul E. McKenney 		return;
426c06aed0eSPaul E. McKenney 	}
427c06aed0eSPaul E. McKenney 	j = READ_ONCE(jiffies_till_first_fqs) +
428c06aed0eSPaul E. McKenney 		      2 * READ_ONCE(jiffies_till_next_fqs);
429c06aed0eSPaul E. McKenney 	if (j < HZ / 10 + nr_cpu_ids / RCU_JIFFIES_FQS_DIV)
430c06aed0eSPaul E. McKenney 		j = HZ / 10 + nr_cpu_ids / RCU_JIFFIES_FQS_DIV;
431c06aed0eSPaul E. McKenney 	pr_info("RCU calculated value of scheduler-enlistment delay is %ld jiffies.\n", j);
432c06aed0eSPaul E. McKenney 	WRITE_ONCE(jiffies_to_sched_qs, j);
433c06aed0eSPaul E. McKenney }
434c06aed0eSPaul E. McKenney 
43567abb96cSByungchul Park static int param_set_first_fqs_jiffies(const char *val, const struct kernel_param *kp)
43667abb96cSByungchul Park {
43767abb96cSByungchul Park 	ulong j;
43867abb96cSByungchul Park 	int ret = kstrtoul(val, 0, &j);
43967abb96cSByungchul Park 
440c06aed0eSPaul E. McKenney 	if (!ret) {
44167abb96cSByungchul Park 		WRITE_ONCE(*(ulong *)kp->arg, (j > HZ) ? HZ : j);
442c06aed0eSPaul E. McKenney 		adjust_jiffies_till_sched_qs();
443c06aed0eSPaul E. McKenney 	}
44467abb96cSByungchul Park 	return ret;
44567abb96cSByungchul Park }
44667abb96cSByungchul Park 
44767abb96cSByungchul Park static int param_set_next_fqs_jiffies(const char *val, const struct kernel_param *kp)
44867abb96cSByungchul Park {
44967abb96cSByungchul Park 	ulong j;
45067abb96cSByungchul Park 	int ret = kstrtoul(val, 0, &j);
45167abb96cSByungchul Park 
452c06aed0eSPaul E. McKenney 	if (!ret) {
45367abb96cSByungchul Park 		WRITE_ONCE(*(ulong *)kp->arg, (j > HZ) ? HZ : (j ?: 1));
454c06aed0eSPaul E. McKenney 		adjust_jiffies_till_sched_qs();
455c06aed0eSPaul E. McKenney 	}
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 
4738ff0b907SPaul E. McKenney static void force_qs_rnp(int (*f)(struct rcu_data *rdp));
474e3950ecdSPaul E. McKenney static int rcu_pending(void);
4754102adabSPaul E. McKenney 
4764102adabSPaul E. McKenney /*
47717ef2fe9SPaul E. McKenney  * Return the number of RCU GPs completed thus far for debug & stats.
4784102adabSPaul E. McKenney  */
47917ef2fe9SPaul E. McKenney unsigned long rcu_get_gp_seq(void)
480917963d0SPaul E. McKenney {
48116fc9c60SPaul E. McKenney 	return READ_ONCE(rcu_state.gp_seq);
482917963d0SPaul E. McKenney }
48317ef2fe9SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_get_gp_seq);
484917963d0SPaul E. McKenney 
485917963d0SPaul E. McKenney /*
486291783b8SPaul E. McKenney  * Return the number of RCU expedited batches completed thus far for
487291783b8SPaul E. McKenney  * debug & stats.  Odd numbers mean that a batch is in progress, even
488291783b8SPaul E. McKenney  * numbers mean idle.  The value returned will thus be roughly double
489291783b8SPaul E. McKenney  * the cumulative batches since boot.
490291783b8SPaul E. McKenney  */
491291783b8SPaul E. McKenney unsigned long rcu_exp_batches_completed(void)
492291783b8SPaul E. McKenney {
49316fc9c60SPaul E. McKenney 	return rcu_state.expedited_sequence;
494291783b8SPaul E. McKenney }
495291783b8SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_exp_batches_completed);
496291783b8SPaul E. McKenney 
497291783b8SPaul E. McKenney /*
498fd897573SPaul E. McKenney  * Return the root node of the rcu_state structure.
499fd897573SPaul E. McKenney  */
500fd897573SPaul E. McKenney static struct rcu_node *rcu_get_root(void)
501fd897573SPaul E. McKenney {
502fd897573SPaul E. McKenney 	return &rcu_state.node[0];
503fd897573SPaul E. McKenney }
504fd897573SPaul E. McKenney 
505fd897573SPaul E. McKenney /*
50669196019SPaul E. McKenney  * Convert a ->gp_state value to a character string.
50769196019SPaul E. McKenney  */
50869196019SPaul E. McKenney static const char *gp_state_getname(short gs)
50969196019SPaul E. McKenney {
51069196019SPaul E. McKenney 	if (gs < 0 || gs >= ARRAY_SIZE(gp_state_names))
51169196019SPaul E. McKenney 		return "???";
51269196019SPaul E. McKenney 	return gp_state_names[gs];
51369196019SPaul E. McKenney }
51469196019SPaul E. McKenney 
51569196019SPaul E. McKenney /*
516afea227fSPaul E. McKenney  * Show the state of the grace-period kthreads.
517afea227fSPaul E. McKenney  */
518afea227fSPaul E. McKenney void show_rcu_gp_kthreads(void)
519afea227fSPaul E. McKenney {
52047199a08SPaul E. McKenney 	int cpu;
521c669c014SPaul E. McKenney 	unsigned long j;
522fd897573SPaul E. McKenney 	unsigned long ja;
523fd897573SPaul E. McKenney 	unsigned long jr;
524fd897573SPaul E. McKenney 	unsigned long jw;
52547199a08SPaul E. McKenney 	struct rcu_data *rdp;
52647199a08SPaul E. McKenney 	struct rcu_node *rnp;
527afea227fSPaul E. McKenney 
528fd897573SPaul E. McKenney 	j = jiffies;
529fd897573SPaul E. McKenney 	ja = j - READ_ONCE(rcu_state.gp_activity);
530fd897573SPaul E. McKenney 	jr = j - READ_ONCE(rcu_state.gp_req_activity);
531fd897573SPaul E. McKenney 	jw = j - READ_ONCE(rcu_state.gp_wake_time);
532fd897573SPaul E. McKenney 	pr_info("%s: wait state: %s(%d) ->state: %#lx delta ->gp_activity %lu ->gp_req_activity %lu ->gp_wake_time %lu ->gp_wake_seq %ld ->gp_seq %ld ->gp_seq_needed %ld ->gp_flags %#x\n",
533c669c014SPaul E. McKenney 		rcu_state.name, gp_state_getname(rcu_state.gp_state),
534fd897573SPaul E. McKenney 		rcu_state.gp_state,
535fd897573SPaul E. McKenney 		rcu_state.gp_kthread ? rcu_state.gp_kthread->state : 0x1ffffL,
536fd897573SPaul E. McKenney 		ja, jr, jw, (long)READ_ONCE(rcu_state.gp_wake_seq),
537fd897573SPaul E. McKenney 		(long)READ_ONCE(rcu_state.gp_seq),
538fd897573SPaul E. McKenney 		(long)READ_ONCE(rcu_get_root()->gp_seq_needed),
539fd897573SPaul E. McKenney 		READ_ONCE(rcu_state.gp_flags));
540aedf4ba9SPaul E. McKenney 	rcu_for_each_node_breadth_first(rnp) {
541b97d23c5SPaul E. McKenney 		if (ULONG_CMP_GE(rcu_state.gp_seq, rnp->gp_seq_needed))
54247199a08SPaul E. McKenney 			continue;
543fd897573SPaul E. McKenney 		pr_info("\trcu_node %d:%d ->gp_seq %ld ->gp_seq_needed %ld\n",
544fd897573SPaul E. McKenney 			rnp->grplo, rnp->grphi, (long)rnp->gp_seq,
545fd897573SPaul E. McKenney 			(long)rnp->gp_seq_needed);
54647199a08SPaul E. McKenney 		if (!rcu_is_leaf_node(rnp))
54747199a08SPaul E. McKenney 			continue;
54847199a08SPaul E. McKenney 		for_each_leaf_node_possible_cpu(rnp, cpu) {
549da1df50dSPaul E. McKenney 			rdp = per_cpu_ptr(&rcu_data, cpu);
55047199a08SPaul E. McKenney 			if (rdp->gpwrap ||
551b97d23c5SPaul E. McKenney 			    ULONG_CMP_GE(rcu_state.gp_seq,
55247199a08SPaul E. McKenney 					 rdp->gp_seq_needed))
55347199a08SPaul E. McKenney 				continue;
554fd897573SPaul E. McKenney 			pr_info("\tcpu %d ->gp_seq_needed %ld\n",
555fd897573SPaul E. McKenney 				cpu, (long)rdp->gp_seq_needed);
55647199a08SPaul E. McKenney 		}
55747199a08SPaul E. McKenney 	}
558b97d23c5SPaul E. McKenney 	/* sched_show_task(rcu_state.gp_kthread); */
559afea227fSPaul E. McKenney }
560afea227fSPaul E. McKenney EXPORT_SYMBOL_GPL(show_rcu_gp_kthreads);
561afea227fSPaul E. McKenney 
5622ccaff10SPaul E. McKenney /* Dump grace-period-request information due to commandeered sysrq. */
5632ccaff10SPaul E. McKenney static void sysrq_show_rcu(int key)
5642ccaff10SPaul E. McKenney {
5652ccaff10SPaul E. McKenney 	show_rcu_gp_kthreads();
5662ccaff10SPaul E. McKenney }
5672ccaff10SPaul E. McKenney 
5682ccaff10SPaul E. McKenney static struct sysrq_key_op sysrq_rcudump_op = {
5692ccaff10SPaul E. McKenney 	.handler = sysrq_show_rcu,
5702ccaff10SPaul E. McKenney 	.help_msg = "show-rcu(y)",
5712ccaff10SPaul E. McKenney 	.action_msg = "Show RCU tree",
5722ccaff10SPaul E. McKenney 	.enable_mask = SYSRQ_ENABLE_DUMP,
5732ccaff10SPaul E. McKenney };
5742ccaff10SPaul E. McKenney 
5752ccaff10SPaul E. McKenney static int __init rcu_sysrq_init(void)
5762ccaff10SPaul E. McKenney {
5772ccaff10SPaul E. McKenney 	if (sysrq_rcu)
5782ccaff10SPaul E. McKenney 		return register_sysrq_key('y', &sysrq_rcudump_op);
5792ccaff10SPaul E. McKenney 	return 0;
5802ccaff10SPaul E. McKenney }
5812ccaff10SPaul E. McKenney early_initcall(rcu_sysrq_init);
5822ccaff10SPaul E. McKenney 
583afea227fSPaul E. McKenney /*
584ad0dc7f9SPaul E. McKenney  * Send along grace-period-related data for rcutorture diagnostics.
585ad0dc7f9SPaul E. McKenney  */
586ad0dc7f9SPaul E. McKenney void rcutorture_get_gp_data(enum rcutorture_type test_type, int *flags,
587aebc8264SPaul E. McKenney 			    unsigned long *gp_seq)
588ad0dc7f9SPaul E. McKenney {
589ad0dc7f9SPaul E. McKenney 	switch (test_type) {
590ad0dc7f9SPaul E. McKenney 	case RCU_FLAVOR:
591f7dd7d44SPaul E. McKenney 		*flags = READ_ONCE(rcu_state.gp_flags);
592f7dd7d44SPaul E. McKenney 		*gp_seq = rcu_seq_current(&rcu_state.gp_seq);
593ad0dc7f9SPaul E. McKenney 		break;
594ad0dc7f9SPaul E. McKenney 	default:
595ad0dc7f9SPaul E. McKenney 		break;
596ad0dc7f9SPaul E. McKenney 	}
597ad0dc7f9SPaul E. McKenney }
598ad0dc7f9SPaul E. McKenney EXPORT_SYMBOL_GPL(rcutorture_get_gp_data);
599ad0dc7f9SPaul E. McKenney 
600ad0dc7f9SPaul E. McKenney /*
601215bba9fSPaul E. McKenney  * Enter an RCU extended quiescent state, which can be either the
602215bba9fSPaul E. McKenney  * idle loop or adaptive-tickless usermode execution.
6034102adabSPaul E. McKenney  *
604215bba9fSPaul E. McKenney  * We crowbar the ->dynticks_nmi_nesting field to zero to allow for
605215bba9fSPaul E. McKenney  * the possibility of usermode upcalls having messed up our count
606215bba9fSPaul E. McKenney  * of interrupt nesting level during the prior busy period.
6074102adabSPaul E. McKenney  */
608215bba9fSPaul E. McKenney static void rcu_eqs_enter(bool user)
6094102adabSPaul E. McKenney {
6104c5273bfSPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
611215bba9fSPaul E. McKenney 
6124c5273bfSPaul E. McKenney 	WARN_ON_ONCE(rdp->dynticks_nmi_nesting != DYNTICK_IRQ_NONIDLE);
6134c5273bfSPaul E. McKenney 	WRITE_ONCE(rdp->dynticks_nmi_nesting, 0);
614215bba9fSPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
6154c5273bfSPaul E. McKenney 		     rdp->dynticks_nesting == 0);
6164c5273bfSPaul E. McKenney 	if (rdp->dynticks_nesting != 1) {
6174c5273bfSPaul E. McKenney 		rdp->dynticks_nesting--;
618215bba9fSPaul E. McKenney 		return;
619215bba9fSPaul E. McKenney 	}
62096d3fd0dSPaul E. McKenney 
621b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
622dc5a4f29SPaul E. McKenney 	trace_rcu_dyntick(TPS("Start"), rdp->dynticks_nesting, 0, rdp->dynticks);
623e68bbb26SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && !user && !is_idle_task(current));
624da1df50dSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
62596d3fd0dSPaul E. McKenney 	do_nocb_deferred_wakeup(rdp);
626198bbf81SPaul E. McKenney 	rcu_prepare_for_idle();
6273e310098SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
6284c5273bfSPaul E. McKenney 	WRITE_ONCE(rdp->dynticks_nesting, 0); /* Avoid irq-access tearing. */
629844ccdd7SPaul E. McKenney 	rcu_dynticks_eqs_enter();
630176f8f7aSPaul E. McKenney 	rcu_dynticks_task_enter();
6313a592405SPaul E. McKenney }
6324102adabSPaul E. McKenney 
6334102adabSPaul E. McKenney /**
6344102adabSPaul E. McKenney  * rcu_idle_enter - inform RCU that current CPU is entering idle
6354102adabSPaul E. McKenney  *
6364102adabSPaul E. McKenney  * Enter idle mode, in other words, -leave- the mode in which RCU
6374102adabSPaul E. McKenney  * read-side critical sections can occur.  (Though RCU read-side
6384102adabSPaul E. McKenney  * critical sections can occur in irq handlers in idle, a possibility
6394102adabSPaul E. McKenney  * handled by irq_enter() and irq_exit().)
6404102adabSPaul E. McKenney  *
641c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_idle_enter(), be sure to test with
642c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
6434102adabSPaul E. McKenney  */
6444102adabSPaul E. McKenney void rcu_idle_enter(void)
6454102adabSPaul E. McKenney {
646b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
6474102adabSPaul E. McKenney 	rcu_eqs_enter(false);
6484102adabSPaul E. McKenney }
6494102adabSPaul E. McKenney 
650d1ec4c34SPaul E. McKenney #ifdef CONFIG_NO_HZ_FULL
6514102adabSPaul E. McKenney /**
6524102adabSPaul E. McKenney  * rcu_user_enter - inform RCU that we are resuming userspace.
6534102adabSPaul E. McKenney  *
6544102adabSPaul E. McKenney  * Enter RCU idle mode right before resuming userspace.  No use of RCU
6554102adabSPaul E. McKenney  * is permitted between this call and rcu_user_exit(). This way the
6564102adabSPaul E. McKenney  * CPU doesn't need to maintain the tick for RCU maintenance purposes
6574102adabSPaul E. McKenney  * when the CPU runs in userspace.
658c0da313eSPaul E. McKenney  *
659c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_user_enter(), be sure to test with
660c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
6614102adabSPaul E. McKenney  */
6624102adabSPaul E. McKenney void rcu_user_enter(void)
6634102adabSPaul E. McKenney {
664b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
665d4db30afSPaul E. McKenney 	rcu_eqs_enter(true);
6664102adabSPaul E. McKenney }
667d1ec4c34SPaul E. McKenney #endif /* CONFIG_NO_HZ_FULL */
6684102adabSPaul E. McKenney 
669cf7614e1SByungchul Park /*
670fd581a91SPaul E. McKenney  * If we are returning from the outermost NMI handler that interrupted an
671dc5a4f29SPaul E. McKenney  * RCU-idle period, update rdp->dynticks and rdp->dynticks_nmi_nesting
672fd581a91SPaul E. McKenney  * to let the RCU grace-period handling know that the CPU is back to
673fd581a91SPaul E. McKenney  * being RCU-idle.
674fd581a91SPaul E. McKenney  *
675cf7614e1SByungchul Park  * If you add or remove a call to rcu_nmi_exit_common(), be sure to test
676fd581a91SPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
677fd581a91SPaul E. McKenney  */
678cf7614e1SByungchul Park static __always_inline void rcu_nmi_exit_common(bool irq)
679fd581a91SPaul E. McKenney {
6804c5273bfSPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
681fd581a91SPaul E. McKenney 
682fd581a91SPaul E. McKenney 	/*
683fd581a91SPaul E. McKenney 	 * Check for ->dynticks_nmi_nesting underflow and bad ->dynticks.
684fd581a91SPaul E. McKenney 	 * (We are exiting an NMI handler, so RCU better be paying attention
685fd581a91SPaul E. McKenney 	 * to us!)
686fd581a91SPaul E. McKenney 	 */
6874c5273bfSPaul E. McKenney 	WARN_ON_ONCE(rdp->dynticks_nmi_nesting <= 0);
688fd581a91SPaul E. McKenney 	WARN_ON_ONCE(rcu_dynticks_curr_cpu_in_eqs());
689fd581a91SPaul E. McKenney 
690fd581a91SPaul E. McKenney 	/*
691fd581a91SPaul E. McKenney 	 * If the nesting level is not 1, the CPU wasn't RCU-idle, so
692fd581a91SPaul E. McKenney 	 * leave it in non-RCU-idle state.
693fd581a91SPaul E. McKenney 	 */
6944c5273bfSPaul E. McKenney 	if (rdp->dynticks_nmi_nesting != 1) {
695dc5a4f29SPaul E. McKenney 		trace_rcu_dyntick(TPS("--="), rdp->dynticks_nmi_nesting, rdp->dynticks_nmi_nesting - 2, rdp->dynticks);
6964c5273bfSPaul E. McKenney 		WRITE_ONCE(rdp->dynticks_nmi_nesting, /* No store tearing. */
6974c5273bfSPaul E. McKenney 			   rdp->dynticks_nmi_nesting - 2);
698fd581a91SPaul E. McKenney 		return;
699fd581a91SPaul E. McKenney 	}
700fd581a91SPaul E. McKenney 
701fd581a91SPaul E. McKenney 	/* This NMI interrupted an RCU-idle CPU, restore RCU-idleness. */
702dc5a4f29SPaul E. McKenney 	trace_rcu_dyntick(TPS("Startirq"), rdp->dynticks_nmi_nesting, 0, rdp->dynticks);
7034c5273bfSPaul E. McKenney 	WRITE_ONCE(rdp->dynticks_nmi_nesting, 0); /* Avoid store tearing. */
704cf7614e1SByungchul Park 
705cf7614e1SByungchul Park 	if (irq)
706cf7614e1SByungchul Park 		rcu_prepare_for_idle();
707cf7614e1SByungchul Park 
708fd581a91SPaul E. McKenney 	rcu_dynticks_eqs_enter();
709cf7614e1SByungchul Park 
710cf7614e1SByungchul Park 	if (irq)
711cf7614e1SByungchul Park 		rcu_dynticks_task_enter();
712cf7614e1SByungchul Park }
713cf7614e1SByungchul Park 
714cf7614e1SByungchul Park /**
715cf7614e1SByungchul Park  * rcu_nmi_exit - inform RCU of exit from NMI context
716cf7614e1SByungchul Park  *
717cf7614e1SByungchul Park  * If you add or remove a call to rcu_nmi_exit(), be sure to test
718cf7614e1SByungchul Park  * with CONFIG_RCU_EQS_DEBUG=y.
719cf7614e1SByungchul Park  */
720cf7614e1SByungchul Park void rcu_nmi_exit(void)
721cf7614e1SByungchul Park {
722cf7614e1SByungchul Park 	rcu_nmi_exit_common(false);
723fd581a91SPaul E. McKenney }
724fd581a91SPaul E. McKenney 
725fd581a91SPaul E. McKenney /**
7264102adabSPaul E. McKenney  * rcu_irq_exit - inform RCU that current CPU is exiting irq towards idle
7274102adabSPaul E. McKenney  *
7284102adabSPaul E. McKenney  * Exit from an interrupt handler, which might possibly result in entering
7294102adabSPaul E. McKenney  * idle mode, in other words, leaving the mode in which read-side critical
7307c9906caSPaul E. McKenney  * sections can occur.  The caller must have disabled interrupts.
7314102adabSPaul E. McKenney  *
7324102adabSPaul E. McKenney  * This code assumes that the idle loop never does anything that might
7334102adabSPaul E. McKenney  * result in unbalanced calls to irq_enter() and irq_exit().  If your
73458721f5dSPaul E. McKenney  * architecture's idle loop violates this assumption, RCU will give you what
73558721f5dSPaul E. McKenney  * you deserve, good and hard.  But very infrequently and irreproducibly.
7364102adabSPaul E. McKenney  *
7374102adabSPaul E. McKenney  * Use things like work queues to work around this limitation.
7384102adabSPaul E. McKenney  *
7394102adabSPaul E. McKenney  * You have been warned.
740c0da313eSPaul E. McKenney  *
741c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_irq_exit(), be sure to test with
742c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
7434102adabSPaul E. McKenney  */
7444102adabSPaul E. McKenney void rcu_irq_exit(void)
7454102adabSPaul E. McKenney {
746b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
747cf7614e1SByungchul Park 	rcu_nmi_exit_common(true);
7487c9906caSPaul E. McKenney }
7497c9906caSPaul E. McKenney 
7507c9906caSPaul E. McKenney /*
7517c9906caSPaul E. McKenney  * Wrapper for rcu_irq_exit() where interrupts are enabled.
752c0da313eSPaul E. McKenney  *
753c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_irq_exit_irqson(), be sure to test
754c0da313eSPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
7557c9906caSPaul E. McKenney  */
7567c9906caSPaul E. McKenney void rcu_irq_exit_irqson(void)
7577c9906caSPaul E. McKenney {
7587c9906caSPaul E. McKenney 	unsigned long flags;
7597c9906caSPaul E. McKenney 
7607c9906caSPaul E. McKenney 	local_irq_save(flags);
7617c9906caSPaul E. McKenney 	rcu_irq_exit();
7624102adabSPaul E. McKenney 	local_irq_restore(flags);
7634102adabSPaul E. McKenney }
7644102adabSPaul E. McKenney 
7654102adabSPaul E. McKenney /*
7664102adabSPaul E. McKenney  * Exit an RCU extended quiescent state, which can be either the
7674102adabSPaul E. McKenney  * idle loop or adaptive-tickless usermode execution.
76851a1fd30SPaul E. McKenney  *
76951a1fd30SPaul E. McKenney  * We crowbar the ->dynticks_nmi_nesting field to DYNTICK_IRQ_NONIDLE to
77051a1fd30SPaul E. McKenney  * allow for the possibility of usermode upcalls messing up our count of
77151a1fd30SPaul E. McKenney  * interrupt nesting level during the busy period that is just now starting.
7724102adabSPaul E. McKenney  */
7734102adabSPaul E. McKenney static void rcu_eqs_exit(bool user)
7744102adabSPaul E. McKenney {
7754c5273bfSPaul E. McKenney 	struct rcu_data *rdp;
77684585aa8SPaul E. McKenney 	long oldval;
7774102adabSPaul E. McKenney 
778b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
7794c5273bfSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
7804c5273bfSPaul E. McKenney 	oldval = rdp->dynticks_nesting;
7811ce46ee5SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && oldval < 0);
78251a1fd30SPaul E. McKenney 	if (oldval) {
7834c5273bfSPaul E. McKenney 		rdp->dynticks_nesting++;
7849dd238e2SPaul E. McKenney 		return;
7854102adabSPaul E. McKenney 	}
7869dd238e2SPaul E. McKenney 	rcu_dynticks_task_exit();
7879dd238e2SPaul E. McKenney 	rcu_dynticks_eqs_exit();
7889dd238e2SPaul E. McKenney 	rcu_cleanup_after_idle();
789dc5a4f29SPaul E. McKenney 	trace_rcu_dyntick(TPS("End"), rdp->dynticks_nesting, 1, rdp->dynticks);
790e68bbb26SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && !user && !is_idle_task(current));
7914c5273bfSPaul E. McKenney 	WRITE_ONCE(rdp->dynticks_nesting, 1);
7924c5273bfSPaul E. McKenney 	WARN_ON_ONCE(rdp->dynticks_nmi_nesting);
7934c5273bfSPaul E. McKenney 	WRITE_ONCE(rdp->dynticks_nmi_nesting, DYNTICK_IRQ_NONIDLE);
7943a592405SPaul E. McKenney }
7954102adabSPaul E. McKenney 
7964102adabSPaul E. McKenney /**
7974102adabSPaul E. McKenney  * rcu_idle_exit - inform RCU that current CPU is leaving idle
7984102adabSPaul E. McKenney  *
7994102adabSPaul E. McKenney  * Exit idle mode, in other words, -enter- the mode in which RCU
8004102adabSPaul E. McKenney  * read-side critical sections can occur.
8014102adabSPaul E. McKenney  *
802c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_idle_exit(), be sure to test with
803c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
8044102adabSPaul E. McKenney  */
8054102adabSPaul E. McKenney void rcu_idle_exit(void)
8064102adabSPaul E. McKenney {
8074102adabSPaul E. McKenney 	unsigned long flags;
8084102adabSPaul E. McKenney 
8094102adabSPaul E. McKenney 	local_irq_save(flags);
8104102adabSPaul E. McKenney 	rcu_eqs_exit(false);
8114102adabSPaul E. McKenney 	local_irq_restore(flags);
8124102adabSPaul E. McKenney }
8134102adabSPaul E. McKenney 
814d1ec4c34SPaul E. McKenney #ifdef CONFIG_NO_HZ_FULL
8154102adabSPaul E. McKenney /**
8164102adabSPaul E. McKenney  * rcu_user_exit - inform RCU that we are exiting userspace.
8174102adabSPaul E. McKenney  *
8184102adabSPaul E. McKenney  * Exit RCU idle mode while entering the kernel because it can
8194102adabSPaul E. McKenney  * run a RCU read side critical section anytime.
820c0da313eSPaul E. McKenney  *
821c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_user_exit(), be sure to test with
822c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
8234102adabSPaul E. McKenney  */
8244102adabSPaul E. McKenney void rcu_user_exit(void)
8254102adabSPaul E. McKenney {
8264102adabSPaul E. McKenney 	rcu_eqs_exit(1);
8274102adabSPaul E. McKenney }
828d1ec4c34SPaul E. McKenney #endif /* CONFIG_NO_HZ_FULL */
8294102adabSPaul E. McKenney 
8304102adabSPaul E. McKenney /**
831cf7614e1SByungchul Park  * rcu_nmi_enter_common - inform RCU of entry to NMI context
832cf7614e1SByungchul Park  * @irq: Is this call from rcu_irq_enter?
8334102adabSPaul E. McKenney  *
834dc5a4f29SPaul E. McKenney  * If the CPU was idle from RCU's viewpoint, update rdp->dynticks and
8354c5273bfSPaul E. McKenney  * rdp->dynticks_nmi_nesting to let the RCU grace-period handling know
836734d1680SPaul E. McKenney  * that the CPU is active.  This implementation permits nested NMIs, as
837734d1680SPaul E. McKenney  * long as the nesting level does not overflow an int.  (You will probably
838734d1680SPaul E. McKenney  * run out of stack space first.)
839c0da313eSPaul E. McKenney  *
840cf7614e1SByungchul Park  * If you add or remove a call to rcu_nmi_enter_common(), be sure to test
841c0da313eSPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
8424102adabSPaul E. McKenney  */
843cf7614e1SByungchul Park static __always_inline void rcu_nmi_enter_common(bool irq)
8444102adabSPaul E. McKenney {
8454c5273bfSPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
84684585aa8SPaul E. McKenney 	long incby = 2;
8474102adabSPaul E. McKenney 
848734d1680SPaul E. McKenney 	/* Complain about underflow. */
8494c5273bfSPaul E. McKenney 	WARN_ON_ONCE(rdp->dynticks_nmi_nesting < 0);
850734d1680SPaul E. McKenney 
851734d1680SPaul E. McKenney 	/*
852734d1680SPaul E. McKenney 	 * If idle from RCU viewpoint, atomically increment ->dynticks
853734d1680SPaul E. McKenney 	 * to mark non-idle and increment ->dynticks_nmi_nesting by one.
854734d1680SPaul E. McKenney 	 * Otherwise, increment ->dynticks_nmi_nesting by two.  This means
855734d1680SPaul E. McKenney 	 * if ->dynticks_nmi_nesting is equal to one, we are guaranteed
856734d1680SPaul E. McKenney 	 * to be in the outermost NMI handler that interrupted an RCU-idle
857734d1680SPaul E. McKenney 	 * period (observation due to Andy Lutomirski).
858734d1680SPaul E. McKenney 	 */
85902a5c550SPaul E. McKenney 	if (rcu_dynticks_curr_cpu_in_eqs()) {
860cf7614e1SByungchul Park 
861cf7614e1SByungchul Park 		if (irq)
862cf7614e1SByungchul Park 			rcu_dynticks_task_exit();
863cf7614e1SByungchul Park 
8642625d469SPaul E. McKenney 		rcu_dynticks_eqs_exit();
865cf7614e1SByungchul Park 
866cf7614e1SByungchul Park 		if (irq)
867cf7614e1SByungchul Park 			rcu_cleanup_after_idle();
868cf7614e1SByungchul Park 
869734d1680SPaul E. McKenney 		incby = 1;
870734d1680SPaul E. McKenney 	}
871bd2b879aSPaul E. McKenney 	trace_rcu_dyntick(incby == 1 ? TPS("Endirq") : TPS("++="),
8724c5273bfSPaul E. McKenney 			  rdp->dynticks_nmi_nesting,
873dc5a4f29SPaul E. McKenney 			  rdp->dynticks_nmi_nesting + incby, rdp->dynticks);
8744c5273bfSPaul E. McKenney 	WRITE_ONCE(rdp->dynticks_nmi_nesting, /* Prevent store tearing. */
8754c5273bfSPaul E. McKenney 		   rdp->dynticks_nmi_nesting + incby);
876734d1680SPaul E. McKenney 	barrier();
8774102adabSPaul E. McKenney }
8784102adabSPaul E. McKenney 
8794102adabSPaul E. McKenney /**
880cf7614e1SByungchul Park  * rcu_nmi_enter - inform RCU of entry to NMI context
881cf7614e1SByungchul Park  */
882cf7614e1SByungchul Park void rcu_nmi_enter(void)
883cf7614e1SByungchul Park {
884cf7614e1SByungchul Park 	rcu_nmi_enter_common(false);
885cf7614e1SByungchul Park }
886c13324a5SMasami Hiramatsu NOKPROBE_SYMBOL(rcu_nmi_enter);
887cf7614e1SByungchul Park 
888cf7614e1SByungchul Park /**
8894102adabSPaul E. McKenney  * rcu_irq_enter - inform RCU that current CPU is entering irq away from idle
8904102adabSPaul E. McKenney  *
8914102adabSPaul E. McKenney  * Enter an interrupt handler, which might possibly result in exiting
8924102adabSPaul E. McKenney  * idle mode, in other words, entering the mode in which read-side critical
8934102adabSPaul E. McKenney  * sections can occur.  The caller must have disabled interrupts.
894c0da313eSPaul E. McKenney  *
8954102adabSPaul E. McKenney  * Note that the Linux kernel is fully capable of entering an interrupt
89658721f5dSPaul E. McKenney  * handler that it never exits, for example when doing upcalls to user mode!
89758721f5dSPaul E. McKenney  * This code assumes that the idle loop never does upcalls to user mode.
89858721f5dSPaul E. McKenney  * If your architecture's idle loop does do upcalls to user mode (or does
89958721f5dSPaul E. McKenney  * anything else that results in unbalanced calls to the irq_enter() and
90058721f5dSPaul E. McKenney  * irq_exit() functions), RCU will give you what you deserve, good and hard.
90158721f5dSPaul E. McKenney  * But very infrequently and irreproducibly.
9024102adabSPaul E. McKenney  *
9034102adabSPaul E. McKenney  * Use things like work queues to work around this limitation.
9044102adabSPaul E. McKenney  *
9054102adabSPaul E. McKenney  * You have been warned.
9064102adabSPaul E. McKenney  *
9074102adabSPaul E. McKenney  * If you add or remove a call to rcu_irq_enter(), be sure to test with
9084102adabSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
9094102adabSPaul E. McKenney  */
9104102adabSPaul E. McKenney void rcu_irq_enter(void)
9114102adabSPaul E. McKenney {
9124102adabSPaul E. McKenney 	lockdep_assert_irqs_disabled();
913cf7614e1SByungchul Park 	rcu_nmi_enter_common(true);
914734d1680SPaul E. McKenney }
915734d1680SPaul E. McKenney 
9164102adabSPaul E. McKenney /*
9174102adabSPaul E. McKenney  * Wrapper for rcu_irq_enter() where interrupts are enabled.
9184102adabSPaul E. McKenney  *
9194102adabSPaul E. McKenney  * If you add or remove a call to rcu_irq_enter_irqson(), be sure to test
9204102adabSPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
9214102adabSPaul E. McKenney  */
9224102adabSPaul E. McKenney void rcu_irq_enter_irqson(void)
9234102adabSPaul E. McKenney {
9244102adabSPaul E. McKenney 	unsigned long flags;
9254102adabSPaul E. McKenney 
9264102adabSPaul E. McKenney 	local_irq_save(flags);
9274102adabSPaul E. McKenney 	rcu_irq_enter();
9284102adabSPaul E. McKenney 	local_irq_restore(flags);
9294102adabSPaul E. McKenney }
9304102adabSPaul E. McKenney 
9314102adabSPaul E. McKenney /**
9322320bda2SZhouyi Zhou  * rcu_is_watching - see if RCU thinks that the current CPU is not idle
9334102adabSPaul E. McKenney  *
934791875d1SPaul E. McKenney  * Return true if RCU is watching the running CPU, which means that this
935791875d1SPaul E. McKenney  * CPU can safely enter RCU read-side critical sections.  In other words,
9362320bda2SZhouyi Zhou  * if the current CPU is not in its idle loop or is in an interrupt or
9372320bda2SZhouyi Zhou  * NMI handler, return true.
9384102adabSPaul E. McKenney  */
939b29c8306SLinus Torvalds bool notrace rcu_is_watching(void)
9404102adabSPaul E. McKenney {
941f534ed1fSPranith Kumar 	bool ret;
9424102adabSPaul E. McKenney 
94346f00d18SAlexei Starovoitov 	preempt_disable_notrace();
944791875d1SPaul E. McKenney 	ret = !rcu_dynticks_curr_cpu_in_eqs();
94546f00d18SAlexei Starovoitov 	preempt_enable_notrace();
9464102adabSPaul E. McKenney 	return ret;
9474102adabSPaul E. McKenney }
9484102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_is_watching);
9494102adabSPaul E. McKenney 
950bcbfdd01SPaul E. McKenney /*
951bcbfdd01SPaul E. McKenney  * If a holdout task is actually running, request an urgent quiescent
952bcbfdd01SPaul E. McKenney  * state from its CPU.  This is unsynchronized, so migrations can cause
953bcbfdd01SPaul E. McKenney  * the request to go to the wrong CPU.  Which is OK, all that will happen
954bcbfdd01SPaul E. McKenney  * is that the CPU's next context switch will be a bit slower and next
955bcbfdd01SPaul E. McKenney  * time around this task will generate another request.
956bcbfdd01SPaul E. McKenney  */
957bcbfdd01SPaul E. McKenney void rcu_request_urgent_qs_task(struct task_struct *t)
958bcbfdd01SPaul E. McKenney {
959bcbfdd01SPaul E. McKenney 	int cpu;
960bcbfdd01SPaul E. McKenney 
961bcbfdd01SPaul E. McKenney 	barrier();
962bcbfdd01SPaul E. McKenney 	cpu = task_cpu(t);
963bcbfdd01SPaul E. McKenney 	if (!task_curr(t))
964bcbfdd01SPaul E. McKenney 		return; /* This task is not running on that CPU. */
9652dba13f0SPaul E. McKenney 	smp_store_release(per_cpu_ptr(&rcu_data.rcu_urgent_qs, cpu), true);
966bcbfdd01SPaul E. McKenney }
967bcbfdd01SPaul E. McKenney 
9684102adabSPaul E. McKenney #if defined(CONFIG_PROVE_RCU) && defined(CONFIG_HOTPLUG_CPU)
9694102adabSPaul E. McKenney 
9704102adabSPaul E. McKenney /*
9715554788eSPaul E. McKenney  * Is the current CPU online as far as RCU is concerned?
9724102adabSPaul E. McKenney  *
9735554788eSPaul E. McKenney  * Disable preemption to avoid false positives that could otherwise
9745554788eSPaul E. McKenney  * happen due to the current CPU number being sampled, this task being
9755554788eSPaul E. McKenney  * preempted, its old CPU being taken offline, resuming on some other CPU,
97649918a54SPaul E. McKenney  * then determining that its old CPU is now offline.
9774102adabSPaul E. McKenney  *
9785554788eSPaul E. McKenney  * Disable checking if in an NMI handler because we cannot safely
9795554788eSPaul E. McKenney  * report errors from NMI handlers anyway.  In addition, it is OK to use
9805554788eSPaul E. McKenney  * RCU on an offline processor during initial boot, hence the check for
9815554788eSPaul E. McKenney  * rcu_scheduler_fully_active.
9824102adabSPaul E. McKenney  */
9834102adabSPaul E. McKenney bool rcu_lockdep_current_cpu_online(void)
9844102adabSPaul E. McKenney {
9854102adabSPaul E. McKenney 	struct rcu_data *rdp;
9864102adabSPaul E. McKenney 	struct rcu_node *rnp;
987b97d23c5SPaul E. McKenney 	bool ret = false;
9884102adabSPaul E. McKenney 
9895554788eSPaul E. McKenney 	if (in_nmi() || !rcu_scheduler_fully_active)
990f6f7ee9aSFengguang Wu 		return true;
9914102adabSPaul E. McKenney 	preempt_disable();
992da1df50dSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
9934102adabSPaul E. McKenney 	rnp = rdp->mynode;
994b97d23c5SPaul E. McKenney 	if (rdp->grpmask & rcu_rnp_online_cpus(rnp))
995b97d23c5SPaul E. McKenney 		ret = true;
9964102adabSPaul E. McKenney 	preempt_enable();
997b97d23c5SPaul E. McKenney 	return ret;
9984102adabSPaul E. McKenney }
9994102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_lockdep_current_cpu_online);
10004102adabSPaul E. McKenney 
10014102adabSPaul E. McKenney #endif /* #if defined(CONFIG_PROVE_RCU) && defined(CONFIG_HOTPLUG_CPU) */
10024102adabSPaul E. McKenney 
10034102adabSPaul E. McKenney /*
10049b9500daSPaul E. McKenney  * We are reporting a quiescent state on behalf of some other CPU, so
10059b9500daSPaul E. McKenney  * it is our responsibility to check for and handle potential overflow
1006a66ae8aeSPaul E. McKenney  * of the rcu_node ->gp_seq counter with respect to the rcu_data counters.
10079b9500daSPaul E. McKenney  * After all, the CPU might be in deep idle state, and thus executing no
10089b9500daSPaul E. McKenney  * code whatsoever.
10099b9500daSPaul E. McKenney  */
10109b9500daSPaul E. McKenney static void rcu_gpnum_ovf(struct rcu_node *rnp, struct rcu_data *rdp)
10119b9500daSPaul E. McKenney {
1012a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1013a66ae8aeSPaul E. McKenney 	if (ULONG_CMP_LT(rcu_seq_current(&rdp->gp_seq) + ULONG_MAX / 4,
1014a66ae8aeSPaul E. McKenney 			 rnp->gp_seq))
10159b9500daSPaul E. McKenney 		WRITE_ONCE(rdp->gpwrap, true);
10168aa670cdSPaul E. McKenney 	if (ULONG_CMP_LT(rdp->rcu_iw_gp_seq + ULONG_MAX / 4, rnp->gp_seq))
10178aa670cdSPaul E. McKenney 		rdp->rcu_iw_gp_seq = rnp->gp_seq + ULONG_MAX / 4;
10189b9500daSPaul E. McKenney }
10199b9500daSPaul E. McKenney 
10209b9500daSPaul E. McKenney /*
10214102adabSPaul E. McKenney  * Snapshot the specified CPU's dynticks counter so that we can later
10224102adabSPaul E. McKenney  * credit them with an implicit quiescent state.  Return 1 if this CPU
10234102adabSPaul E. McKenney  * is in dynticks idle mode, which is an extended quiescent state.
10244102adabSPaul E. McKenney  */
1025fe5ac724SPaul E. McKenney static int dyntick_save_progress_counter(struct rcu_data *rdp)
10264102adabSPaul E. McKenney {
1027dc5a4f29SPaul E. McKenney 	rdp->dynticks_snap = rcu_dynticks_snap(rdp);
102802a5c550SPaul E. McKenney 	if (rcu_dynticks_in_eqs(rdp->dynticks_snap)) {
102988d1beadSPaul E. McKenney 		trace_rcu_fqs(rcu_state.name, rdp->gp_seq, rdp->cpu, TPS("dti"));
10309b9500daSPaul E. McKenney 		rcu_gpnum_ovf(rdp->mynode, rdp);
103123a9bacdSPaul E. McKenney 		return 1;
10327941dbdeSAndreea-Cristina Bernat 	}
103323a9bacdSPaul E. McKenney 	return 0;
10344102adabSPaul E. McKenney }
10354102adabSPaul E. McKenney 
10364102adabSPaul E. McKenney /*
10379b9500daSPaul E. McKenney  * Handler for the irq_work request posted when a grace period has
10389b9500daSPaul E. McKenney  * gone on for too long, but not yet long enough for an RCU CPU
10399b9500daSPaul E. McKenney  * stall warning.  Set state appropriately, but just complain if
10409b9500daSPaul E. McKenney  * there is unexpected state on entry.
10419b9500daSPaul E. McKenney  */
10429b9500daSPaul E. McKenney static void rcu_iw_handler(struct irq_work *iwp)
10439b9500daSPaul E. McKenney {
10449b9500daSPaul E. McKenney 	struct rcu_data *rdp;
10459b9500daSPaul E. McKenney 	struct rcu_node *rnp;
10469b9500daSPaul E. McKenney 
10479b9500daSPaul E. McKenney 	rdp = container_of(iwp, struct rcu_data, rcu_iw);
10489b9500daSPaul E. McKenney 	rnp = rdp->mynode;
10499b9500daSPaul E. McKenney 	raw_spin_lock_rcu_node(rnp);
10509b9500daSPaul E. McKenney 	if (!WARN_ON_ONCE(!rdp->rcu_iw_pending)) {
10518aa670cdSPaul E. McKenney 		rdp->rcu_iw_gp_seq = rnp->gp_seq;
10529b9500daSPaul E. McKenney 		rdp->rcu_iw_pending = false;
10539b9500daSPaul E. McKenney 	}
10549b9500daSPaul E. McKenney 	raw_spin_unlock_rcu_node(rnp);
10559b9500daSPaul E. McKenney }
10569b9500daSPaul E. McKenney 
10579b9500daSPaul E. McKenney /*
10584102adabSPaul E. McKenney  * Return true if the specified CPU has passed through a quiescent
10594102adabSPaul E. McKenney  * state by virtue of being in or having passed through an dynticks
10604102adabSPaul E. McKenney  * idle state since the last call to dyntick_save_progress_counter()
10614102adabSPaul E. McKenney  * for this same CPU, or by virtue of having been offline.
10624102adabSPaul E. McKenney  */
1063fe5ac724SPaul E. McKenney static int rcu_implicit_dynticks_qs(struct rcu_data *rdp)
10644102adabSPaul E. McKenney {
10653a19b46aSPaul E. McKenney 	unsigned long jtsq;
10660f9be8caSPaul E. McKenney 	bool *rnhqp;
10679226b10dSPaul E. McKenney 	bool *ruqp;
10689b9500daSPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;
10694102adabSPaul E. McKenney 
10704102adabSPaul E. McKenney 	/*
10714102adabSPaul E. McKenney 	 * If the CPU passed through or entered a dynticks idle phase with
10724102adabSPaul E. McKenney 	 * no active irq/NMI handlers, then we can safely pretend that the CPU
10734102adabSPaul E. McKenney 	 * already acknowledged the request to pass through a quiescent
10744102adabSPaul E. McKenney 	 * state.  Either way, that CPU cannot possibly be in an RCU
10754102adabSPaul E. McKenney 	 * read-side critical section that started before the beginning
10764102adabSPaul E. McKenney 	 * of the current RCU grace period.
10774102adabSPaul E. McKenney 	 */
1078dc5a4f29SPaul E. McKenney 	if (rcu_dynticks_in_eqs_since(rdp, rdp->dynticks_snap)) {
107988d1beadSPaul E. McKenney 		trace_rcu_fqs(rcu_state.name, rdp->gp_seq, rdp->cpu, TPS("dti"));
10809b9500daSPaul E. McKenney 		rcu_gpnum_ovf(rnp, rdp);
10814102adabSPaul E. McKenney 		return 1;
10824102adabSPaul E. McKenney 	}
10834102adabSPaul E. McKenney 
1084f2e2df59SPaul E. McKenney 	/* If waiting too long on an offline CPU, complain. */
1085f2e2df59SPaul E. McKenney 	if (!(rdp->grpmask & rcu_rnp_online_cpus(rnp)) &&
108688d1beadSPaul E. McKenney 	    time_after(jiffies, rcu_state.gp_start + HZ)) {
1087f2e2df59SPaul E. McKenney 		bool onl;
1088f2e2df59SPaul E. McKenney 		struct rcu_node *rnp1;
1089f2e2df59SPaul E. McKenney 
1090f2e2df59SPaul E. McKenney 		WARN_ON(1);  /* Offline CPUs are supposed to report QS! */
1091f2e2df59SPaul E. McKenney 		pr_info("%s: grp: %d-%d level: %d ->gp_seq %ld ->completedqs %ld\n",
1092f2e2df59SPaul E. McKenney 			__func__, rnp->grplo, rnp->grphi, rnp->level,
1093f2e2df59SPaul E. McKenney 			(long)rnp->gp_seq, (long)rnp->completedqs);
1094f2e2df59SPaul E. McKenney 		for (rnp1 = rnp; rnp1; rnp1 = rnp1->parent)
1095f2e2df59SPaul E. McKenney 			pr_info("%s: %d:%d ->qsmask %#lx ->qsmaskinit %#lx ->qsmaskinitnext %#lx ->rcu_gp_init_mask %#lx\n",
1096f2e2df59SPaul E. McKenney 				__func__, rnp1->grplo, rnp1->grphi, rnp1->qsmask, rnp1->qsmaskinit, rnp1->qsmaskinitnext, rnp1->rcu_gp_init_mask);
1097f2e2df59SPaul E. McKenney 		onl = !!(rdp->grpmask & rcu_rnp_online_cpus(rnp));
1098f2e2df59SPaul E. McKenney 		pr_info("%s %d: %c online: %ld(%d) offline: %ld(%d)\n",
1099f2e2df59SPaul E. McKenney 			__func__, rdp->cpu, ".o"[onl],
1100f2e2df59SPaul E. McKenney 			(long)rdp->rcu_onl_gp_seq, rdp->rcu_onl_gp_flags,
1101f2e2df59SPaul E. McKenney 			(long)rdp->rcu_ofl_gp_seq, rdp->rcu_ofl_gp_flags);
1102f2e2df59SPaul E. McKenney 		return 1; /* Break things loose after complaining. */
1103f2e2df59SPaul E. McKenney 	}
1104f2e2df59SPaul E. McKenney 
11054102adabSPaul E. McKenney 	/*
11064a81e832SPaul E. McKenney 	 * A CPU running for an extended time within the kernel can
1107c06aed0eSPaul E. McKenney 	 * delay RCU grace periods: (1) At age jiffies_to_sched_qs,
1108c06aed0eSPaul E. McKenney 	 * set .rcu_urgent_qs, (2) At age 2*jiffies_to_sched_qs, set
11097e28c5afSPaul E. McKenney 	 * both .rcu_need_heavy_qs and .rcu_urgent_qs.  Note that the
11107e28c5afSPaul E. McKenney 	 * unsynchronized assignments to the per-CPU rcu_need_heavy_qs
11117e28c5afSPaul E. McKenney 	 * variable are safe because the assignments are repeated if this
11127e28c5afSPaul E. McKenney 	 * CPU failed to pass through a quiescent state.  This code
1113c06aed0eSPaul E. McKenney 	 * also checks .jiffies_resched in case jiffies_to_sched_qs
11147e28c5afSPaul E. McKenney 	 * is set way high.
11154102adabSPaul E. McKenney 	 */
1116c06aed0eSPaul E. McKenney 	jtsq = READ_ONCE(jiffies_to_sched_qs);
11172dba13f0SPaul E. McKenney 	ruqp = per_cpu_ptr(&rcu_data.rcu_urgent_qs, rdp->cpu);
11182dba13f0SPaul E. McKenney 	rnhqp = &per_cpu(rcu_data.rcu_need_heavy_qs, rdp->cpu);
11190f9be8caSPaul E. McKenney 	if (!READ_ONCE(*rnhqp) &&
11207e28c5afSPaul E. McKenney 	    (time_after(jiffies, rcu_state.gp_start + jtsq * 2) ||
112188d1beadSPaul E. McKenney 	     time_after(jiffies, rcu_state.jiffies_resched))) {
11220f9be8caSPaul E. McKenney 		WRITE_ONCE(*rnhqp, true);
11239226b10dSPaul E. McKenney 		/* Store rcu_need_heavy_qs before rcu_urgent_qs. */
11249226b10dSPaul E. McKenney 		smp_store_release(ruqp, true);
11257e28c5afSPaul E. McKenney 	} else if (time_after(jiffies, rcu_state.gp_start + jtsq)) {
11267e28c5afSPaul E. McKenney 		WRITE_ONCE(*ruqp, true);
11274a81e832SPaul E. McKenney 	}
11284914950aSPaul E. McKenney 
112928053bc7SPaul E. McKenney 	/*
1130c98cac60SPaul E. McKenney 	 * NO_HZ_FULL CPUs can run in-kernel without rcu_sched_clock_irq!
1131d3052109SPaul E. McKenney 	 * The above code handles this, but only for straight cond_resched().
1132d3052109SPaul E. McKenney 	 * And some in-kernel loops check need_resched() before calling
1133d3052109SPaul E. McKenney 	 * cond_resched(), which defeats the above code for CPUs that are
1134d3052109SPaul E. McKenney 	 * running in-kernel with scheduling-clock interrupts disabled.
1135d3052109SPaul E. McKenney 	 * So hit them over the head with the resched_cpu() hammer!
113628053bc7SPaul E. McKenney 	 */
1137d3052109SPaul E. McKenney 	if (tick_nohz_full_cpu(rdp->cpu) &&
1138d3052109SPaul E. McKenney 		   time_after(jiffies,
1139d3052109SPaul E. McKenney 			      READ_ONCE(rdp->last_fqs_resched) + jtsq * 3)) {
114028053bc7SPaul E. McKenney 		resched_cpu(rdp->cpu);
1141d3052109SPaul E. McKenney 		WRITE_ONCE(rdp->last_fqs_resched, jiffies);
1142d3052109SPaul E. McKenney 	}
1143d3052109SPaul E. McKenney 
1144d3052109SPaul E. McKenney 	/*
1145d3052109SPaul E. McKenney 	 * If more than halfway to RCU CPU stall-warning time, invoke
1146d3052109SPaul E. McKenney 	 * resched_cpu() more frequently to try to loosen things up a bit.
1147d3052109SPaul E. McKenney 	 * Also check to see if the CPU is getting hammered with interrupts,
1148d3052109SPaul E. McKenney 	 * but only once per grace period, just to keep the IPIs down to
1149d3052109SPaul E. McKenney 	 * a dull roar.
11504914950aSPaul E. McKenney 	 */
11517e28c5afSPaul E. McKenney 	if (time_after(jiffies, rcu_state.jiffies_resched)) {
1152d3052109SPaul E. McKenney 		if (time_after(jiffies,
1153d3052109SPaul E. McKenney 			       READ_ONCE(rdp->last_fqs_resched) + jtsq)) {
11544914950aSPaul E. McKenney 			resched_cpu(rdp->cpu);
1155d3052109SPaul E. McKenney 			WRITE_ONCE(rdp->last_fqs_resched, jiffies);
1156d3052109SPaul E. McKenney 		}
11579b9500daSPaul E. McKenney 		if (IS_ENABLED(CONFIG_IRQ_WORK) &&
11588aa670cdSPaul E. McKenney 		    !rdp->rcu_iw_pending && rdp->rcu_iw_gp_seq != rnp->gp_seq &&
11599b9500daSPaul E. McKenney 		    (rnp->ffmask & rdp->grpmask)) {
11609b9500daSPaul E. McKenney 			init_irq_work(&rdp->rcu_iw, rcu_iw_handler);
11619b9500daSPaul E. McKenney 			rdp->rcu_iw_pending = true;
11628aa670cdSPaul E. McKenney 			rdp->rcu_iw_gp_seq = rnp->gp_seq;
11639b9500daSPaul E. McKenney 			irq_work_queue_on(&rdp->rcu_iw, rdp->cpu);
11649b9500daSPaul E. McKenney 		}
11659b9500daSPaul E. McKenney 	}
11666193c76aSPaul E. McKenney 
11674102adabSPaul E. McKenney 	return 0;
11684102adabSPaul E. McKenney }
11694102adabSPaul E. McKenney 
1170ad3832e9SPaul E. McKenney static void record_gp_stall_check_time(void)
11714102adabSPaul E. McKenney {
1172cb1e78cfSPaul E. McKenney 	unsigned long j = jiffies;
11736193c76aSPaul E. McKenney 	unsigned long j1;
11744102adabSPaul E. McKenney 
1175ad3832e9SPaul E. McKenney 	rcu_state.gp_start = j;
11766193c76aSPaul E. McKenney 	j1 = rcu_jiffies_till_stall_check();
117791f63cedSPaul E. McKenney 	/* Record ->gp_start before ->jiffies_stall. */
1178ad3832e9SPaul E. McKenney 	smp_store_release(&rcu_state.jiffies_stall, j + j1); /* ^^^ */
1179ad3832e9SPaul E. McKenney 	rcu_state.jiffies_resched = j + j1 / 2;
1180ad3832e9SPaul E. McKenney 	rcu_state.n_force_qs_gpstart = READ_ONCE(rcu_state.n_force_qs);
11814102adabSPaul E. McKenney }
11824102adabSPaul E. McKenney 
11834102adabSPaul E. McKenney /*
1184fb81a44bSPaul E. McKenney  * Complain about starvation of grace-period kthread.
1185fb81a44bSPaul E. McKenney  */
11868fd119b6SPaul E. McKenney static void rcu_check_gp_kthread_starvation(void)
1187fb81a44bSPaul E. McKenney {
11887cba4775SPaul E. McKenney 	struct task_struct *gpk = rcu_state.gp_kthread;
1189fb81a44bSPaul E. McKenney 	unsigned long j;
1190fb81a44bSPaul E. McKenney 
11917cba4775SPaul E. McKenney 	j = jiffies - READ_ONCE(rcu_state.gp_activity);
11927cba4775SPaul E. McKenney 	if (j > 2 * HZ) {
119378c5a67fSPaul E. McKenney 		pr_err("%s kthread starved for %ld jiffies! g%ld f%#x %s(%d) ->state=%#lx ->cpu=%d\n",
11947cba4775SPaul E. McKenney 		       rcu_state.name, j,
11957cba4775SPaul E. McKenney 		       (long)rcu_seq_current(&rcu_state.gp_seq),
11963b6505fdSPaul E. McKenney 		       READ_ONCE(rcu_state.gp_flags),
11977cba4775SPaul E. McKenney 		       gp_state_getname(rcu_state.gp_state), rcu_state.gp_state,
11987cba4775SPaul E. McKenney 		       gpk ? gpk->state : ~0, gpk ? task_cpu(gpk) : -1);
11997cba4775SPaul E. McKenney 		if (gpk) {
1200d07aee2cSPaul E. McKenney 			pr_err("RCU grace-period kthread stack dump:\n");
12017cba4775SPaul E. McKenney 			sched_show_task(gpk);
12027cba4775SPaul E. McKenney 			wake_up_process(gpk);
120386057b80SPaul E. McKenney 		}
1204b1adb3e2SPaul E. McKenney 	}
12054102adabSPaul E. McKenney }
12064102adabSPaul E. McKenney 
12074102adabSPaul E. McKenney /*
12087aa92230SPaul E. McKenney  * Dump stacks of all tasks running on stalled CPUs.  First try using
12097aa92230SPaul E. McKenney  * NMIs, but fall back to manual remote stack tracing on architectures
12107aa92230SPaul E. McKenney  * that don't support NMI-based stack dumps.  The NMI-triggered stack
12117aa92230SPaul E. McKenney  * traces are more accurate because they are printed by the target CPU.
12124102adabSPaul E. McKenney  */
121333dbdbf0SPaul E. McKenney static void rcu_dump_cpu_stacks(void)
12144102adabSPaul E. McKenney {
12154102adabSPaul E. McKenney 	int cpu;
12164102adabSPaul E. McKenney 	unsigned long flags;
12174102adabSPaul E. McKenney 	struct rcu_node *rnp;
12184102adabSPaul E. McKenney 
1219aedf4ba9SPaul E. McKenney 	rcu_for_each_leaf_node(rnp) {
12206cf10081SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
1221bc75e999SMark Rutland 		for_each_leaf_node_possible_cpu(rnp, cpu)
1222bc75e999SMark Rutland 			if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu))
12237aa92230SPaul E. McKenney 				if (!trigger_single_cpu_backtrace(cpu))
1224bc75e999SMark Rutland 					dump_cpu_task(cpu);
122567c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
12264102adabSPaul E. McKenney 	}
12274102adabSPaul E. McKenney }
12284102adabSPaul E. McKenney 
12298c7c4829SPaul E. McKenney /*
12308c7c4829SPaul E. McKenney  * If too much time has passed in the current grace period, and if
12318c7c4829SPaul E. McKenney  * so configured, go kick the relevant kthreads.
12328c7c4829SPaul E. McKenney  */
1233e1741c69SPaul E. McKenney static void rcu_stall_kick_kthreads(void)
12348c7c4829SPaul E. McKenney {
12358c7c4829SPaul E. McKenney 	unsigned long j;
12368c7c4829SPaul E. McKenney 
12378c7c4829SPaul E. McKenney 	if (!rcu_kick_kthreads)
12388c7c4829SPaul E. McKenney 		return;
12394c6ed437SPaul E. McKenney 	j = READ_ONCE(rcu_state.jiffies_kick_kthreads);
12404c6ed437SPaul E. McKenney 	if (time_after(jiffies, j) && rcu_state.gp_kthread &&
12414c6ed437SPaul E. McKenney 	    (rcu_gp_in_progress() || READ_ONCE(rcu_state.gp_flags))) {
12424c6ed437SPaul E. McKenney 		WARN_ONCE(1, "Kicking %s grace-period kthread\n",
12434c6ed437SPaul E. McKenney 			  rcu_state.name);
12445dffed1eSPaul E. McKenney 		rcu_ftrace_dump(DUMP_ALL);
12454c6ed437SPaul E. McKenney 		wake_up_process(rcu_state.gp_kthread);
12464c6ed437SPaul E. McKenney 		WRITE_ONCE(rcu_state.jiffies_kick_kthreads, j + HZ);
12478c7c4829SPaul E. McKenney 	}
12488c7c4829SPaul E. McKenney }
12498c7c4829SPaul E. McKenney 
125095394e69SPaul E. McKenney static void panic_on_rcu_stall(void)
1251088e9d25SDaniel Bristot de Oliveira {
1252088e9d25SDaniel Bristot de Oliveira 	if (sysctl_panic_on_rcu_stall)
1253088e9d25SDaniel Bristot de Oliveira 		panic("RCU Stall\n");
1254088e9d25SDaniel Bristot de Oliveira }
1255088e9d25SDaniel Bristot de Oliveira 
1256a91e7e58SPaul E. McKenney static void print_other_cpu_stall(unsigned long gp_seq)
12574102adabSPaul E. McKenney {
12584102adabSPaul E. McKenney 	int cpu;
12594102adabSPaul E. McKenney 	unsigned long flags;
12606ccd2ecdSPaul E. McKenney 	unsigned long gpa;
12616ccd2ecdSPaul E. McKenney 	unsigned long j;
12624102adabSPaul E. McKenney 	int ndetected = 0;
1263336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
12644102adabSPaul E. McKenney 	long totqlen = 0;
12654102adabSPaul E. McKenney 
12668c7c4829SPaul E. McKenney 	/* Kick and suppress, if so configured. */
1267e1741c69SPaul E. McKenney 	rcu_stall_kick_kthreads();
12688c7c4829SPaul E. McKenney 	if (rcu_cpu_stall_suppress)
12698c7c4829SPaul E. McKenney 		return;
12708c7c4829SPaul E. McKenney 
12714102adabSPaul E. McKenney 	/*
12724102adabSPaul E. McKenney 	 * OK, time to rat on our buddy...
12734102adabSPaul E. McKenney 	 * See Documentation/RCU/stallwarn.txt for info on how to debug
12744102adabSPaul E. McKenney 	 * RCU CPU stall warnings.
12754102adabSPaul E. McKenney 	 */
12764c6ed437SPaul E. McKenney 	pr_err("INFO: %s detected stalls on CPUs/tasks:", rcu_state.name);
12774102adabSPaul E. McKenney 	print_cpu_stall_info_begin();
1278aedf4ba9SPaul E. McKenney 	rcu_for_each_leaf_node(rnp) {
12796cf10081SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
12804102adabSPaul E. McKenney 		ndetected += rcu_print_task_stall(rnp);
12814102adabSPaul E. McKenney 		if (rnp->qsmask != 0) {
1282bc75e999SMark Rutland 			for_each_leaf_node_possible_cpu(rnp, cpu)
1283bc75e999SMark Rutland 				if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu)) {
1284b21ebed9SPaul E. McKenney 					print_cpu_stall_info(cpu);
12854102adabSPaul E. McKenney 					ndetected++;
12864102adabSPaul E. McKenney 				}
12874102adabSPaul E. McKenney 		}
128867c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
12894102adabSPaul E. McKenney 	}
12904102adabSPaul E. McKenney 
12914102adabSPaul E. McKenney 	print_cpu_stall_info_end();
12924102adabSPaul E. McKenney 	for_each_possible_cpu(cpu)
1293903ee83dSPaul E. McKenney 		totqlen += rcu_get_n_cbs_cpu(cpu);
1294471f87c3SPaul E. McKenney 	pr_cont("(detected by %d, t=%ld jiffies, g=%ld, q=%lu)\n",
12954c6ed437SPaul E. McKenney 	       smp_processor_id(), (long)(jiffies - rcu_state.gp_start),
12964c6ed437SPaul E. McKenney 	       (long)rcu_seq_current(&rcu_state.gp_seq), totqlen);
12976ccd2ecdSPaul E. McKenney 	if (ndetected) {
129833dbdbf0SPaul E. McKenney 		rcu_dump_cpu_stacks();
1299c4402b27SByungchul Park 
1300c4402b27SByungchul Park 		/* Complain about tasks blocking the grace period. */
1301a2887cd8SPaul E. McKenney 		rcu_print_detail_task_stall();
13026ccd2ecdSPaul E. McKenney 	} else {
13034c6ed437SPaul E. McKenney 		if (rcu_seq_current(&rcu_state.gp_seq) != gp_seq) {
13046ccd2ecdSPaul E. McKenney 			pr_err("INFO: Stall ended before state dump start\n");
13056ccd2ecdSPaul E. McKenney 		} else {
13066ccd2ecdSPaul E. McKenney 			j = jiffies;
13074c6ed437SPaul E. McKenney 			gpa = READ_ONCE(rcu_state.gp_activity);
1308237a0f21SPaul E. McKenney 			pr_err("All QSes seen, last %s kthread activity %ld (%ld-%ld), jiffies_till_next_fqs=%ld, root ->qsmask %#lx\n",
13094c6ed437SPaul E. McKenney 			       rcu_state.name, j - gpa, j, gpa,
1310c06aed0eSPaul E. McKenney 			       READ_ONCE(jiffies_till_next_fqs),
1311336a4f6cSPaul E. McKenney 			       rcu_get_root()->qsmask);
13126ccd2ecdSPaul E. McKenney 			/* In this case, the current CPU might be at fault. */
13136ccd2ecdSPaul E. McKenney 			sched_show_task(current);
13146ccd2ecdSPaul E. McKenney 		}
13156ccd2ecdSPaul E. McKenney 	}
13168c42b1f3SPaul E. McKenney 	/* Rewrite if needed in case of slow consoles. */
13174c6ed437SPaul E. McKenney 	if (ULONG_CMP_GE(jiffies, READ_ONCE(rcu_state.jiffies_stall)))
13184c6ed437SPaul E. McKenney 		WRITE_ONCE(rcu_state.jiffies_stall,
13198c42b1f3SPaul E. McKenney 			   jiffies + 3 * rcu_jiffies_till_stall_check() + 3);
13204102adabSPaul E. McKenney 
13218fd119b6SPaul E. McKenney 	rcu_check_gp_kthread_starvation();
1322fb81a44bSPaul E. McKenney 
1323088e9d25SDaniel Bristot de Oliveira 	panic_on_rcu_stall();
1324088e9d25SDaniel Bristot de Oliveira 
1325cd920e5aSPaul E. McKenney 	rcu_force_quiescent_state();  /* Kick them all. */
13264102adabSPaul E. McKenney }
13274102adabSPaul E. McKenney 
13284e8b8e08SPaul E. McKenney static void print_cpu_stall(void)
13294102adabSPaul E. McKenney {
13304102adabSPaul E. McKenney 	int cpu;
13314102adabSPaul E. McKenney 	unsigned long flags;
1332da1df50dSPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
1333336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
13344102adabSPaul E. McKenney 	long totqlen = 0;
13354102adabSPaul E. McKenney 
13368c7c4829SPaul E. McKenney 	/* Kick and suppress, if so configured. */
1337e1741c69SPaul E. McKenney 	rcu_stall_kick_kthreads();
13388c7c4829SPaul E. McKenney 	if (rcu_cpu_stall_suppress)
13398c7c4829SPaul E. McKenney 		return;
13408c7c4829SPaul E. McKenney 
13414102adabSPaul E. McKenney 	/*
13424102adabSPaul E. McKenney 	 * OK, time to rat on ourselves...
13434102adabSPaul E. McKenney 	 * See Documentation/RCU/stallwarn.txt for info on how to debug
13444102adabSPaul E. McKenney 	 * RCU CPU stall warnings.
13454102adabSPaul E. McKenney 	 */
13464c6ed437SPaul E. McKenney 	pr_err("INFO: %s self-detected stall on CPU", rcu_state.name);
13474102adabSPaul E. McKenney 	print_cpu_stall_info_begin();
13489b9500daSPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rdp->mynode, flags);
1349b21ebed9SPaul E. McKenney 	print_cpu_stall_info(smp_processor_id());
13509b9500daSPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rdp->mynode, flags);
13514102adabSPaul E. McKenney 	print_cpu_stall_info_end();
13524102adabSPaul E. McKenney 	for_each_possible_cpu(cpu)
1353903ee83dSPaul E. McKenney 		totqlen += rcu_get_n_cbs_cpu(cpu);
1354471f87c3SPaul E. McKenney 	pr_cont(" (t=%lu jiffies g=%ld q=%lu)\n",
13554c6ed437SPaul E. McKenney 		jiffies - rcu_state.gp_start,
13564c6ed437SPaul E. McKenney 		(long)rcu_seq_current(&rcu_state.gp_seq), totqlen);
1357fb81a44bSPaul E. McKenney 
13588fd119b6SPaul E. McKenney 	rcu_check_gp_kthread_starvation();
1359fb81a44bSPaul E. McKenney 
136033dbdbf0SPaul E. McKenney 	rcu_dump_cpu_stacks();
13614102adabSPaul E. McKenney 
13626cf10081SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
13638c42b1f3SPaul E. McKenney 	/* Rewrite if needed in case of slow consoles. */
13644c6ed437SPaul E. McKenney 	if (ULONG_CMP_GE(jiffies, READ_ONCE(rcu_state.jiffies_stall)))
13654c6ed437SPaul E. McKenney 		WRITE_ONCE(rcu_state.jiffies_stall,
13667d0ae808SPaul E. McKenney 			   jiffies + 3 * rcu_jiffies_till_stall_check() + 3);
136767c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
13684102adabSPaul E. McKenney 
1369088e9d25SDaniel Bristot de Oliveira 	panic_on_rcu_stall();
1370088e9d25SDaniel Bristot de Oliveira 
137139cf275aSLinus Torvalds 	/*
137239cf275aSLinus Torvalds 	 * Attempt to revive the RCU machinery by forcing a context switch.
137339cf275aSLinus Torvalds 	 *
137439cf275aSLinus Torvalds 	 * A context switch would normally allow the RCU state machine to make
137539cf275aSLinus Torvalds 	 * progress and it could be we're stuck in kernel space without context
137639cf275aSLinus Torvalds 	 * switches for an entirely unreasonable amount of time.
137739cf275aSLinus Torvalds 	 */
1378fced9c8cSPaul E. McKenney 	set_tsk_need_resched(current);
1379fced9c8cSPaul E. McKenney 	set_preempt_need_resched();
13804102adabSPaul E. McKenney }
13814102adabSPaul E. McKenney 
1382ea12ff2bSPaul E. McKenney static void check_cpu_stall(struct rcu_data *rdp)
13834102adabSPaul E. McKenney {
1384471f87c3SPaul E. McKenney 	unsigned long gs1;
1385471f87c3SPaul E. McKenney 	unsigned long gs2;
13864102adabSPaul E. McKenney 	unsigned long gps;
13874102adabSPaul E. McKenney 	unsigned long j;
13888c42b1f3SPaul E. McKenney 	unsigned long jn;
13894102adabSPaul E. McKenney 	unsigned long js;
13904102adabSPaul E. McKenney 	struct rcu_node *rnp;
13914102adabSPaul E. McKenney 
13928c7c4829SPaul E. McKenney 	if ((rcu_cpu_stall_suppress && !rcu_kick_kthreads) ||
1393de8e8730SPaul E. McKenney 	    !rcu_gp_in_progress())
13944102adabSPaul E. McKenney 		return;
1395e1741c69SPaul E. McKenney 	rcu_stall_kick_kthreads();
1396cb1e78cfSPaul E. McKenney 	j = jiffies;
13974102adabSPaul E. McKenney 
13984102adabSPaul E. McKenney 	/*
13994102adabSPaul E. McKenney 	 * Lots of memory barriers to reject false positives.
14004102adabSPaul E. McKenney 	 *
14014c6ed437SPaul E. McKenney 	 * The idea is to pick up rcu_state.gp_seq, then
14024c6ed437SPaul E. McKenney 	 * rcu_state.jiffies_stall, then rcu_state.gp_start, and finally
14034c6ed437SPaul E. McKenney 	 * another copy of rcu_state.gp_seq.  These values are updated in
14044c6ed437SPaul E. McKenney 	 * the opposite order with memory barriers (or equivalent) during
14054c6ed437SPaul E. McKenney 	 * grace-period initialization and cleanup.  Now, a false positive
14064c6ed437SPaul E. McKenney 	 * can occur if we get an new value of rcu_state.gp_start and a old
14074c6ed437SPaul E. McKenney 	 * value of rcu_state.jiffies_stall.  But given the memory barriers,
14084c6ed437SPaul E. McKenney 	 * the only way that this can happen is if one grace period ends
14094c6ed437SPaul E. McKenney 	 * and another starts between these two fetches.  This is detected
14104c6ed437SPaul E. McKenney 	 * by comparing the second fetch of rcu_state.gp_seq with the
14114c6ed437SPaul E. McKenney 	 * previous fetch from rcu_state.gp_seq.
14124102adabSPaul E. McKenney 	 *
14134c6ed437SPaul E. McKenney 	 * Given this check, comparisons of jiffies, rcu_state.jiffies_stall,
14144c6ed437SPaul E. McKenney 	 * and rcu_state.gp_start suffice to forestall false positives.
14154102adabSPaul E. McKenney 	 */
14164c6ed437SPaul E. McKenney 	gs1 = READ_ONCE(rcu_state.gp_seq);
1417471f87c3SPaul E. McKenney 	smp_rmb(); /* Pick up ->gp_seq first... */
14184c6ed437SPaul E. McKenney 	js = READ_ONCE(rcu_state.jiffies_stall);
14194102adabSPaul E. McKenney 	smp_rmb(); /* ...then ->jiffies_stall before the rest... */
14204c6ed437SPaul E. McKenney 	gps = READ_ONCE(rcu_state.gp_start);
1421471f87c3SPaul E. McKenney 	smp_rmb(); /* ...and finally ->gp_start before ->gp_seq again. */
14224c6ed437SPaul E. McKenney 	gs2 = READ_ONCE(rcu_state.gp_seq);
1423471f87c3SPaul E. McKenney 	if (gs1 != gs2 ||
14244102adabSPaul E. McKenney 	    ULONG_CMP_LT(j, js) ||
14254102adabSPaul E. McKenney 	    ULONG_CMP_GE(gps, js))
14264102adabSPaul E. McKenney 		return; /* No stall or GP completed since entering function. */
14274102adabSPaul E. McKenney 	rnp = rdp->mynode;
14288c42b1f3SPaul E. McKenney 	jn = jiffies + 3 * rcu_jiffies_till_stall_check() + 3;
1429de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress() &&
14308c42b1f3SPaul E. McKenney 	    (READ_ONCE(rnp->qsmask) & rdp->grpmask) &&
14314c6ed437SPaul E. McKenney 	    cmpxchg(&rcu_state.jiffies_stall, js, jn) == js) {
14324102adabSPaul E. McKenney 
14334102adabSPaul E. McKenney 		/* We haven't checked in, so go dump stack. */
14344e8b8e08SPaul E. McKenney 		print_cpu_stall();
14354102adabSPaul E. McKenney 
1436de8e8730SPaul E. McKenney 	} else if (rcu_gp_in_progress() &&
14378c42b1f3SPaul E. McKenney 		   ULONG_CMP_GE(j, js + RCU_STALL_RAT_DELAY) &&
14384c6ed437SPaul E. McKenney 		   cmpxchg(&rcu_state.jiffies_stall, js, jn) == js) {
14394102adabSPaul E. McKenney 
14404102adabSPaul E. McKenney 		/* They had a few time units to dump stack, so complain. */
1441a91e7e58SPaul E. McKenney 		print_other_cpu_stall(gs2);
14424102adabSPaul E. McKenney 	}
14434102adabSPaul E. McKenney }
14444102adabSPaul E. McKenney 
14454102adabSPaul E. McKenney /**
14464102adabSPaul E. McKenney  * rcu_cpu_stall_reset - prevent further stall warnings in current grace period
14474102adabSPaul E. McKenney  *
14484102adabSPaul E. McKenney  * Set the stall-warning timeout way off into the future, thus preventing
14494102adabSPaul E. McKenney  * any RCU CPU stall-warning messages from appearing in the current set of
14504102adabSPaul E. McKenney  * RCU grace periods.
14514102adabSPaul E. McKenney  *
14524102adabSPaul E. McKenney  * The caller must disable hard irqs.
14534102adabSPaul E. McKenney  */
14544102adabSPaul E. McKenney void rcu_cpu_stall_reset(void)
14554102adabSPaul E. McKenney {
1456b97d23c5SPaul E. McKenney 	WRITE_ONCE(rcu_state.jiffies_stall, jiffies + ULONG_MAX / 2);
14574102adabSPaul E. McKenney }
14584102adabSPaul E. McKenney 
145941e80595SPaul E. McKenney /* Trace-event wrapper function for trace_rcu_future_grace_period.  */
146041e80595SPaul E. McKenney static void trace_rcu_this_gp(struct rcu_node *rnp, struct rcu_data *rdp,
1461b73de91dSJoel Fernandes 			      unsigned long gp_seq_req, const char *s)
14624102adabSPaul E. McKenney {
146388d1beadSPaul E. McKenney 	trace_rcu_future_grace_period(rcu_state.name, rnp->gp_seq, gp_seq_req,
1464abd13fddSPaul E. McKenney 				      rnp->level, rnp->grplo, rnp->grphi, s);
14654102adabSPaul E. McKenney }
14664102adabSPaul E. McKenney 
14674102adabSPaul E. McKenney /*
1468b73de91dSJoel Fernandes  * rcu_start_this_gp - Request the start of a particular grace period
1469df2bf8f7SJoel Fernandes (Google)  * @rnp_start: The leaf node of the CPU from which to start.
1470b73de91dSJoel Fernandes  * @rdp: The rcu_data corresponding to the CPU from which to start.
1471b73de91dSJoel Fernandes  * @gp_seq_req: The gp_seq of the grace period to start.
1472b73de91dSJoel Fernandes  *
147341e80595SPaul E. McKenney  * Start the specified grace period, as needed to handle newly arrived
14744102adabSPaul E. McKenney  * callbacks.  The required future grace periods are recorded in each
14757a1d0f23SPaul E. McKenney  * rcu_node structure's ->gp_seq_needed field.  Returns true if there
147648a7639cSPaul E. McKenney  * is reason to awaken the grace-period kthread.
14774102adabSPaul E. McKenney  *
1478d5cd9685SPaul E. McKenney  * The caller must hold the specified rcu_node structure's ->lock, which
1479d5cd9685SPaul E. McKenney  * is why the caller is responsible for waking the grace-period kthread.
1480b73de91dSJoel Fernandes  *
1481b73de91dSJoel Fernandes  * Returns true if the GP thread needs to be awakened else false.
14824102adabSPaul E. McKenney  */
1483df2bf8f7SJoel Fernandes (Google) static bool rcu_start_this_gp(struct rcu_node *rnp_start, struct rcu_data *rdp,
1484b73de91dSJoel Fernandes 			      unsigned long gp_seq_req)
14854102adabSPaul E. McKenney {
148648a7639cSPaul E. McKenney 	bool ret = false;
1487df2bf8f7SJoel Fernandes (Google) 	struct rcu_node *rnp;
14884102adabSPaul E. McKenney 
1489360e0da6SPaul E. McKenney 	/*
1490360e0da6SPaul E. McKenney 	 * Use funnel locking to either acquire the root rcu_node
1491360e0da6SPaul E. McKenney 	 * structure's lock or bail out if the need for this grace period
1492df2bf8f7SJoel Fernandes (Google) 	 * has already been recorded -- or if that grace period has in
1493df2bf8f7SJoel Fernandes (Google) 	 * fact already started.  If there is already a grace period in
1494df2bf8f7SJoel Fernandes (Google) 	 * progress in a non-leaf node, no recording is needed because the
1495df2bf8f7SJoel Fernandes (Google) 	 * end of the grace period will scan the leaf rcu_node structures.
1496df2bf8f7SJoel Fernandes (Google) 	 * Note that rnp_start->lock must not be released.
1497360e0da6SPaul E. McKenney 	 */
1498df2bf8f7SJoel Fernandes (Google) 	raw_lockdep_assert_held_rcu_node(rnp_start);
1499df2bf8f7SJoel Fernandes (Google) 	trace_rcu_this_gp(rnp_start, rdp, gp_seq_req, TPS("Startleaf"));
1500df2bf8f7SJoel Fernandes (Google) 	for (rnp = rnp_start; 1; rnp = rnp->parent) {
1501df2bf8f7SJoel Fernandes (Google) 		if (rnp != rnp_start)
1502df2bf8f7SJoel Fernandes (Google) 			raw_spin_lock_rcu_node(rnp);
1503df2bf8f7SJoel Fernandes (Google) 		if (ULONG_CMP_GE(rnp->gp_seq_needed, gp_seq_req) ||
1504df2bf8f7SJoel Fernandes (Google) 		    rcu_seq_started(&rnp->gp_seq, gp_seq_req) ||
1505df2bf8f7SJoel Fernandes (Google) 		    (rnp != rnp_start &&
1506df2bf8f7SJoel Fernandes (Google) 		     rcu_seq_state(rcu_seq_current(&rnp->gp_seq)))) {
1507df2bf8f7SJoel Fernandes (Google) 			trace_rcu_this_gp(rnp, rdp, gp_seq_req,
1508b73de91dSJoel Fernandes 					  TPS("Prestarted"));
15094102adabSPaul E. McKenney 			goto unlock_out;
15104102adabSPaul E. McKenney 		}
1511df2bf8f7SJoel Fernandes (Google) 		rnp->gp_seq_needed = gp_seq_req;
1512226ca5e7SJoel Fernandes (Google) 		if (rcu_seq_state(rcu_seq_current(&rnp->gp_seq))) {
1513a2165e41SPaul E. McKenney 			/*
1514226ca5e7SJoel Fernandes (Google) 			 * We just marked the leaf or internal node, and a
1515226ca5e7SJoel Fernandes (Google) 			 * grace period is in progress, which means that
1516226ca5e7SJoel Fernandes (Google) 			 * rcu_gp_cleanup() will see the marking.  Bail to
1517226ca5e7SJoel Fernandes (Google) 			 * reduce contention.
1518a2165e41SPaul E. McKenney 			 */
1519df2bf8f7SJoel Fernandes (Google) 			trace_rcu_this_gp(rnp_start, rdp, gp_seq_req,
1520b73de91dSJoel Fernandes 					  TPS("Startedleaf"));
1521a2165e41SPaul E. McKenney 			goto unlock_out;
1522a2165e41SPaul E. McKenney 		}
1523df2bf8f7SJoel Fernandes (Google) 		if (rnp != rnp_start && rnp->parent != NULL)
1524df2bf8f7SJoel Fernandes (Google) 			raw_spin_unlock_rcu_node(rnp);
1525df2bf8f7SJoel Fernandes (Google) 		if (!rnp->parent)
1526360e0da6SPaul E. McKenney 			break;  /* At root, and perhaps also leaf. */
15274102adabSPaul E. McKenney 	}
1528360e0da6SPaul E. McKenney 
1529360e0da6SPaul E. McKenney 	/* If GP already in progress, just leave, otherwise start one. */
1530de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress()) {
1531df2bf8f7SJoel Fernandes (Google) 		trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedleafroot"));
1532360e0da6SPaul E. McKenney 		goto unlock_out;
1533360e0da6SPaul E. McKenney 	}
1534df2bf8f7SJoel Fernandes (Google) 	trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedroot"));
15359cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_flags, rcu_state.gp_flags | RCU_GP_FLAG_INIT);
15369cbc5b97SPaul E. McKenney 	rcu_state.gp_req_activity = jiffies;
15379cbc5b97SPaul E. McKenney 	if (!rcu_state.gp_kthread) {
1538df2bf8f7SJoel Fernandes (Google) 		trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("NoGPkthread"));
1539360e0da6SPaul E. McKenney 		goto unlock_out;
1540360e0da6SPaul E. McKenney 	}
15419cbc5b97SPaul E. McKenney 	trace_rcu_grace_period(rcu_state.name, READ_ONCE(rcu_state.gp_seq), TPS("newreq"));
1542360e0da6SPaul E. McKenney 	ret = true;  /* Caller must wake GP kthread. */
15434102adabSPaul E. McKenney unlock_out:
1544ab5e869cSPaul E. McKenney 	/* Push furthest requested GP to leaf node and rcu_data structure. */
1545df2bf8f7SJoel Fernandes (Google) 	if (ULONG_CMP_LT(gp_seq_req, rnp->gp_seq_needed)) {
1546df2bf8f7SJoel Fernandes (Google) 		rnp_start->gp_seq_needed = rnp->gp_seq_needed;
1547df2bf8f7SJoel Fernandes (Google) 		rdp->gp_seq_needed = rnp->gp_seq_needed;
1548ab5e869cSPaul E. McKenney 	}
1549df2bf8f7SJoel Fernandes (Google) 	if (rnp != rnp_start)
1550df2bf8f7SJoel Fernandes (Google) 		raw_spin_unlock_rcu_node(rnp);
155148a7639cSPaul E. McKenney 	return ret;
15524102adabSPaul E. McKenney }
15534102adabSPaul E. McKenney 
15544102adabSPaul E. McKenney /*
15554102adabSPaul E. McKenney  * Clean up any old requests for the just-ended grace period.  Also return
1556d1e4f01dSPaul E. McKenney  * whether any additional grace periods have been requested.
15574102adabSPaul E. McKenney  */
15583481f2eaSPaul E. McKenney static bool rcu_future_gp_cleanup(struct rcu_node *rnp)
15594102adabSPaul E. McKenney {
1560fb31340fSPaul E. McKenney 	bool needmore;
1561da1df50dSPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
15624102adabSPaul E. McKenney 
15637a1d0f23SPaul E. McKenney 	needmore = ULONG_CMP_LT(rnp->gp_seq, rnp->gp_seq_needed);
15647a1d0f23SPaul E. McKenney 	if (!needmore)
15657a1d0f23SPaul E. McKenney 		rnp->gp_seq_needed = rnp->gp_seq; /* Avoid counter wrap. */
1566b73de91dSJoel Fernandes 	trace_rcu_this_gp(rnp, rdp, rnp->gp_seq,
15674102adabSPaul E. McKenney 			  needmore ? TPS("CleanupMore") : TPS("Cleanup"));
15684102adabSPaul E. McKenney 	return needmore;
15694102adabSPaul E. McKenney }
15704102adabSPaul E. McKenney 
15714102adabSPaul E. McKenney /*
15721d1f898dSZhang, Jun  * Awaken the grace-period kthread.  Don't do a self-awaken (unless in
15731d1f898dSZhang, Jun  * an interrupt or softirq handler), and don't bother awakening when there
15741d1f898dSZhang, Jun  * is nothing for the grace-period kthread to do (as in several CPUs raced
15751d1f898dSZhang, Jun  * to awaken, and we lost), and finally don't try to awaken a kthread that
15761d1f898dSZhang, Jun  * has not yet been created.  If all those checks are passed, track some
15771d1f898dSZhang, Jun  * debug information and awaken.
15781d1f898dSZhang, Jun  *
15791d1f898dSZhang, Jun  * So why do the self-wakeup when in an interrupt or softirq handler
15801d1f898dSZhang, Jun  * in the grace-period kthread's context?  Because the kthread might have
15811d1f898dSZhang, Jun  * been interrupted just as it was going to sleep, and just after the final
15821d1f898dSZhang, Jun  * pre-sleep check of the awaken condition.  In this case, a wakeup really
15831d1f898dSZhang, Jun  * is required, and is therefore supplied.
158448a7639cSPaul E. McKenney  */
1585532c00c9SPaul E. McKenney static void rcu_gp_kthread_wake(void)
158648a7639cSPaul E. McKenney {
15871d1f898dSZhang, Jun 	if ((current == rcu_state.gp_kthread &&
15881d1f898dSZhang, Jun 	     !in_interrupt() && !in_serving_softirq()) ||
1589532c00c9SPaul E. McKenney 	    !READ_ONCE(rcu_state.gp_flags) ||
1590532c00c9SPaul E. McKenney 	    !rcu_state.gp_kthread)
159148a7639cSPaul E. McKenney 		return;
1592fd897573SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_wake_time, jiffies);
1593fd897573SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_wake_seq, READ_ONCE(rcu_state.gp_seq));
1594532c00c9SPaul E. McKenney 	swake_up_one(&rcu_state.gp_wq);
159548a7639cSPaul E. McKenney }
159648a7639cSPaul E. McKenney 
159748a7639cSPaul E. McKenney /*
159829365e56SPaul E. McKenney  * If there is room, assign a ->gp_seq number to any callbacks on this
159929365e56SPaul E. McKenney  * CPU that have not already been assigned.  Also accelerate any callbacks
160029365e56SPaul E. McKenney  * that were previously assigned a ->gp_seq number that has since proven
160129365e56SPaul E. McKenney  * to be too conservative, which can happen if callbacks get assigned a
160229365e56SPaul E. McKenney  * ->gp_seq number while RCU is idle, but with reference to a non-root
160329365e56SPaul E. McKenney  * rcu_node structure.  This function is idempotent, so it does not hurt
160429365e56SPaul E. McKenney  * to call it repeatedly.  Returns an flag saying that we should awaken
160529365e56SPaul E. McKenney  * the RCU grace-period kthread.
16064102adabSPaul E. McKenney  *
16074102adabSPaul E. McKenney  * The caller must hold rnp->lock with interrupts disabled.
16084102adabSPaul E. McKenney  */
160902f50142SPaul E. McKenney static bool rcu_accelerate_cbs(struct rcu_node *rnp, struct rcu_data *rdp)
16104102adabSPaul E. McKenney {
1611b73de91dSJoel Fernandes 	unsigned long gp_seq_req;
161215fecf89SPaul E. McKenney 	bool ret = false;
16134102adabSPaul E. McKenney 
1614a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1615c0b334c5SPaul E. McKenney 
161615fecf89SPaul E. McKenney 	/* If no pending (not yet ready to invoke) callbacks, nothing to do. */
161715fecf89SPaul E. McKenney 	if (!rcu_segcblist_pend_cbs(&rdp->cblist))
161848a7639cSPaul E. McKenney 		return false;
16194102adabSPaul E. McKenney 
16204102adabSPaul E. McKenney 	/*
162115fecf89SPaul E. McKenney 	 * Callbacks are often registered with incomplete grace-period
162215fecf89SPaul E. McKenney 	 * information.  Something about the fact that getting exact
162315fecf89SPaul E. McKenney 	 * information requires acquiring a global lock...  RCU therefore
162415fecf89SPaul E. McKenney 	 * makes a conservative estimate of the grace period number at which
162515fecf89SPaul E. McKenney 	 * a given callback will become ready to invoke.	The following
162615fecf89SPaul E. McKenney 	 * code checks this estimate and improves it when possible, thus
162715fecf89SPaul E. McKenney 	 * accelerating callback invocation to an earlier grace-period
162815fecf89SPaul E. McKenney 	 * number.
16294102adabSPaul E. McKenney 	 */
16309cbc5b97SPaul E. McKenney 	gp_seq_req = rcu_seq_snap(&rcu_state.gp_seq);
1631b73de91dSJoel Fernandes 	if (rcu_segcblist_accelerate(&rdp->cblist, gp_seq_req))
1632b73de91dSJoel Fernandes 		ret = rcu_start_this_gp(rnp, rdp, gp_seq_req);
16334102adabSPaul E. McKenney 
16344102adabSPaul E. McKenney 	/* Trace depending on how much we were able to accelerate. */
163515fecf89SPaul E. McKenney 	if (rcu_segcblist_restempty(&rdp->cblist, RCU_WAIT_TAIL))
16369cbc5b97SPaul E. McKenney 		trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("AccWaitCB"));
16374102adabSPaul E. McKenney 	else
16389cbc5b97SPaul E. McKenney 		trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("AccReadyCB"));
163948a7639cSPaul E. McKenney 	return ret;
16404102adabSPaul E. McKenney }
16414102adabSPaul E. McKenney 
16424102adabSPaul E. McKenney /*
1643e44e73caSPaul E. McKenney  * Similar to rcu_accelerate_cbs(), but does not require that the leaf
1644e44e73caSPaul E. McKenney  * rcu_node structure's ->lock be held.  It consults the cached value
1645e44e73caSPaul E. McKenney  * of ->gp_seq_needed in the rcu_data structure, and if that indicates
1646e44e73caSPaul E. McKenney  * that a new grace-period request be made, invokes rcu_accelerate_cbs()
1647e44e73caSPaul E. McKenney  * while holding the leaf rcu_node structure's ->lock.
1648e44e73caSPaul E. McKenney  */
1649c6e09b97SPaul E. McKenney static void rcu_accelerate_cbs_unlocked(struct rcu_node *rnp,
1650e44e73caSPaul E. McKenney 					struct rcu_data *rdp)
1651e44e73caSPaul E. McKenney {
1652e44e73caSPaul E. McKenney 	unsigned long c;
1653e44e73caSPaul E. McKenney 	bool needwake;
1654e44e73caSPaul E. McKenney 
1655e44e73caSPaul E. McKenney 	lockdep_assert_irqs_disabled();
1656c6e09b97SPaul E. McKenney 	c = rcu_seq_snap(&rcu_state.gp_seq);
1657e44e73caSPaul E. McKenney 	if (!rdp->gpwrap && ULONG_CMP_GE(rdp->gp_seq_needed, c)) {
1658e44e73caSPaul E. McKenney 		/* Old request still live, so mark recent callbacks. */
1659e44e73caSPaul E. McKenney 		(void)rcu_segcblist_accelerate(&rdp->cblist, c);
1660e44e73caSPaul E. McKenney 		return;
1661e44e73caSPaul E. McKenney 	}
1662e44e73caSPaul E. McKenney 	raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
166302f50142SPaul E. McKenney 	needwake = rcu_accelerate_cbs(rnp, rdp);
1664e44e73caSPaul E. McKenney 	raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */
1665e44e73caSPaul E. McKenney 	if (needwake)
1666532c00c9SPaul E. McKenney 		rcu_gp_kthread_wake();
1667e44e73caSPaul E. McKenney }
1668e44e73caSPaul E. McKenney 
1669e44e73caSPaul E. McKenney /*
16704102adabSPaul E. McKenney  * Move any callbacks whose grace period has completed to the
16714102adabSPaul E. McKenney  * RCU_DONE_TAIL sublist, then compact the remaining sublists and
167229365e56SPaul E. McKenney  * assign ->gp_seq numbers to any callbacks in the RCU_NEXT_TAIL
16734102adabSPaul E. McKenney  * sublist.  This function is idempotent, so it does not hurt to
16744102adabSPaul E. McKenney  * invoke it repeatedly.  As long as it is not invoked -too- often...
167548a7639cSPaul E. McKenney  * Returns true if the RCU grace-period kthread needs to be awakened.
16764102adabSPaul E. McKenney  *
16774102adabSPaul E. McKenney  * The caller must hold rnp->lock with interrupts disabled.
16784102adabSPaul E. McKenney  */
1679834f56bfSPaul E. McKenney static bool rcu_advance_cbs(struct rcu_node *rnp, struct rcu_data *rdp)
16804102adabSPaul E. McKenney {
1681a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1682c0b334c5SPaul E. McKenney 
168315fecf89SPaul E. McKenney 	/* If no pending (not yet ready to invoke) callbacks, nothing to do. */
168415fecf89SPaul E. McKenney 	if (!rcu_segcblist_pend_cbs(&rdp->cblist))
168548a7639cSPaul E. McKenney 		return false;
16864102adabSPaul E. McKenney 
16874102adabSPaul E. McKenney 	/*
168829365e56SPaul E. McKenney 	 * Find all callbacks whose ->gp_seq numbers indicate that they
16894102adabSPaul E. McKenney 	 * are ready to invoke, and put them into the RCU_DONE_TAIL sublist.
16904102adabSPaul E. McKenney 	 */
169129365e56SPaul E. McKenney 	rcu_segcblist_advance(&rdp->cblist, rnp->gp_seq);
16924102adabSPaul E. McKenney 
16934102adabSPaul E. McKenney 	/* Classify any remaining callbacks. */
169402f50142SPaul E. McKenney 	return rcu_accelerate_cbs(rnp, rdp);
16954102adabSPaul E. McKenney }
16964102adabSPaul E. McKenney 
16974102adabSPaul E. McKenney /*
16984102adabSPaul E. McKenney  * Update CPU-local rcu_data state to record the beginnings and ends of
16994102adabSPaul E. McKenney  * grace periods.  The caller must hold the ->lock of the leaf rcu_node
17004102adabSPaul E. McKenney  * structure corresponding to the current CPU, and must have irqs disabled.
170148a7639cSPaul E. McKenney  * Returns true if the grace-period kthread needs to be awakened.
17024102adabSPaul E. McKenney  */
1703c7e48f7bSPaul E. McKenney static bool __note_gp_changes(struct rcu_node *rnp, struct rcu_data *rdp)
17044102adabSPaul E. McKenney {
170548a7639cSPaul E. McKenney 	bool ret;
17063563a438SPaul E. McKenney 	bool need_gp;
170748a7639cSPaul E. McKenney 
1708a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1709c0b334c5SPaul E. McKenney 
171067e14c1eSPaul E. McKenney 	if (rdp->gp_seq == rnp->gp_seq)
171167e14c1eSPaul E. McKenney 		return false; /* Nothing to do. */
171267e14c1eSPaul E. McKenney 
17134102adabSPaul E. McKenney 	/* Handle the ends of any preceding grace periods first. */
171467e14c1eSPaul E. McKenney 	if (rcu_seq_completed_gp(rdp->gp_seq, rnp->gp_seq) ||
171567e14c1eSPaul E. McKenney 	    unlikely(READ_ONCE(rdp->gpwrap))) {
1716834f56bfSPaul E. McKenney 		ret = rcu_advance_cbs(rnp, rdp); /* Advance callbacks. */
17179cbc5b97SPaul E. McKenney 		trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("cpuend"));
171867e14c1eSPaul E. McKenney 	} else {
171902f50142SPaul E. McKenney 		ret = rcu_accelerate_cbs(rnp, rdp); /* Recent callbacks. */
17204102adabSPaul E. McKenney 	}
17214102adabSPaul E. McKenney 
172267e14c1eSPaul E. McKenney 	/* Now handle the beginnings of any new-to-this-CPU grace periods. */
172367e14c1eSPaul E. McKenney 	if (rcu_seq_new_gp(rdp->gp_seq, rnp->gp_seq) ||
172467e14c1eSPaul E. McKenney 	    unlikely(READ_ONCE(rdp->gpwrap))) {
17254102adabSPaul E. McKenney 		/*
17264102adabSPaul E. McKenney 		 * If the current grace period is waiting for this CPU,
17274102adabSPaul E. McKenney 		 * set up to detect a quiescent state, otherwise don't
17284102adabSPaul E. McKenney 		 * go looking for one.
17294102adabSPaul E. McKenney 		 */
17309cbc5b97SPaul E. McKenney 		trace_rcu_grace_period(rcu_state.name, rnp->gp_seq, TPS("cpustart"));
17313563a438SPaul E. McKenney 		need_gp = !!(rnp->qsmask & rdp->grpmask);
17323563a438SPaul E. McKenney 		rdp->cpu_no_qs.b.norm = need_gp;
17333563a438SPaul E. McKenney 		rdp->core_needs_qs = need_gp;
17344102adabSPaul E. McKenney 		zero_cpu_stall_ticks(rdp);
17354102adabSPaul E. McKenney 	}
173667e14c1eSPaul E. McKenney 	rdp->gp_seq = rnp->gp_seq;  /* Remember new grace-period state. */
173713dc7d0cSZhang, Jun 	if (ULONG_CMP_LT(rdp->gp_seq_needed, rnp->gp_seq_needed) || rdp->gpwrap)
17383d18469aSPaul E. McKenney 		rdp->gp_seq_needed = rnp->gp_seq_needed;
17393d18469aSPaul E. McKenney 	WRITE_ONCE(rdp->gpwrap, false);
17403d18469aSPaul E. McKenney 	rcu_gpnum_ovf(rnp, rdp);
174148a7639cSPaul E. McKenney 	return ret;
17424102adabSPaul E. McKenney }
17434102adabSPaul E. McKenney 
174415cabdffSPaul E. McKenney static void note_gp_changes(struct rcu_data *rdp)
17454102adabSPaul E. McKenney {
17464102adabSPaul E. McKenney 	unsigned long flags;
174748a7639cSPaul E. McKenney 	bool needwake;
17484102adabSPaul E. McKenney 	struct rcu_node *rnp;
17494102adabSPaul E. McKenney 
17504102adabSPaul E. McKenney 	local_irq_save(flags);
17514102adabSPaul E. McKenney 	rnp = rdp->mynode;
175267e14c1eSPaul E. McKenney 	if ((rdp->gp_seq == rcu_seq_current(&rnp->gp_seq) &&
17537d0ae808SPaul E. McKenney 	     !unlikely(READ_ONCE(rdp->gpwrap))) || /* w/out lock. */
17542a67e741SPeter Zijlstra 	    !raw_spin_trylock_rcu_node(rnp)) { /* irqs already off, so later. */
17554102adabSPaul E. McKenney 		local_irq_restore(flags);
17564102adabSPaul E. McKenney 		return;
17574102adabSPaul E. McKenney 	}
1758c7e48f7bSPaul E. McKenney 	needwake = __note_gp_changes(rnp, rdp);
175967c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
176048a7639cSPaul E. McKenney 	if (needwake)
1761532c00c9SPaul E. McKenney 		rcu_gp_kthread_wake();
17624102adabSPaul E. McKenney }
17634102adabSPaul E. McKenney 
176422212332SPaul E. McKenney static void rcu_gp_slow(int delay)
17650f41c0ddSPaul E. McKenney {
17660f41c0ddSPaul E. McKenney 	if (delay > 0 &&
176722212332SPaul E. McKenney 	    !(rcu_seq_ctr(rcu_state.gp_seq) %
1768dee4f422SPaul E. McKenney 	      (rcu_num_nodes * PER_RCU_NODE_PERIOD * delay)))
17690f41c0ddSPaul E. McKenney 		schedule_timeout_uninterruptible(delay);
17700f41c0ddSPaul E. McKenney }
17710f41c0ddSPaul E. McKenney 
17724102adabSPaul E. McKenney /*
177345fed3e7SPaul E. McKenney  * Initialize a new grace period.  Return false if no grace period required.
17744102adabSPaul E. McKenney  */
17750854a05cSPaul E. McKenney static bool rcu_gp_init(void)
17764102adabSPaul E. McKenney {
1777ec2c2976SPaul E. McKenney 	unsigned long flags;
17780aa04b05SPaul E. McKenney 	unsigned long oldmask;
1779ec2c2976SPaul E. McKenney 	unsigned long mask;
17804102adabSPaul E. McKenney 	struct rcu_data *rdp;
1781336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
17824102adabSPaul E. McKenney 
17839cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_activity, jiffies);
17842a67e741SPeter Zijlstra 	raw_spin_lock_irq_rcu_node(rnp);
17859cbc5b97SPaul E. McKenney 	if (!READ_ONCE(rcu_state.gp_flags)) {
17864102adabSPaul E. McKenney 		/* Spurious wakeup, tell caller to go back to sleep.  */
178767c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
178845fed3e7SPaul E. McKenney 		return false;
17894102adabSPaul E. McKenney 	}
17909cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_flags, 0); /* Clear all flags: New GP. */
17914102adabSPaul E. McKenney 
1792de8e8730SPaul E. McKenney 	if (WARN_ON_ONCE(rcu_gp_in_progress())) {
17934102adabSPaul E. McKenney 		/*
17944102adabSPaul E. McKenney 		 * Grace period already in progress, don't start another.
17954102adabSPaul E. McKenney 		 * Not supposed to be able to happen.
17964102adabSPaul E. McKenney 		 */
179767c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
179845fed3e7SPaul E. McKenney 		return false;
17994102adabSPaul E. McKenney 	}
18004102adabSPaul E. McKenney 
18014102adabSPaul E. McKenney 	/* Advance to a new grace period and initialize state. */
1802ad3832e9SPaul E. McKenney 	record_gp_stall_check_time();
1803ff3bb6f4SPaul E. McKenney 	/* Record GP times before starting GP, hence rcu_seq_start(). */
18049cbc5b97SPaul E. McKenney 	rcu_seq_start(&rcu_state.gp_seq);
18059cbc5b97SPaul E. McKenney 	trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq, TPS("start"));
180667c583a7SBoqun Feng 	raw_spin_unlock_irq_rcu_node(rnp);
18074102adabSPaul E. McKenney 
18084102adabSPaul E. McKenney 	/*
18090aa04b05SPaul E. McKenney 	 * Apply per-leaf buffered online and offline operations to the
18100aa04b05SPaul E. McKenney 	 * rcu_node tree.  Note that this new grace period need not wait
18110aa04b05SPaul E. McKenney 	 * for subsequent online CPUs, and that quiescent-state forcing
18120aa04b05SPaul E. McKenney 	 * will handle subsequent offline CPUs.
18130aa04b05SPaul E. McKenney 	 */
18149cbc5b97SPaul E. McKenney 	rcu_state.gp_state = RCU_GP_ONOFF;
1815aedf4ba9SPaul E. McKenney 	rcu_for_each_leaf_node(rnp) {
1816894d45bbSMike Galbraith 		raw_spin_lock(&rcu_state.ofl_lock);
18172a67e741SPeter Zijlstra 		raw_spin_lock_irq_rcu_node(rnp);
18180aa04b05SPaul E. McKenney 		if (rnp->qsmaskinit == rnp->qsmaskinitnext &&
18190aa04b05SPaul E. McKenney 		    !rnp->wait_blkd_tasks) {
18200aa04b05SPaul E. McKenney 			/* Nothing to do on this leaf rcu_node structure. */
182167c583a7SBoqun Feng 			raw_spin_unlock_irq_rcu_node(rnp);
1822894d45bbSMike Galbraith 			raw_spin_unlock(&rcu_state.ofl_lock);
18230aa04b05SPaul E. McKenney 			continue;
18240aa04b05SPaul E. McKenney 		}
18250aa04b05SPaul E. McKenney 
18260aa04b05SPaul E. McKenney 		/* Record old state, apply changes to ->qsmaskinit field. */
18270aa04b05SPaul E. McKenney 		oldmask = rnp->qsmaskinit;
18280aa04b05SPaul E. McKenney 		rnp->qsmaskinit = rnp->qsmaskinitnext;
18290aa04b05SPaul E. McKenney 
18300aa04b05SPaul E. McKenney 		/* If zero-ness of ->qsmaskinit changed, propagate up tree. */
18310aa04b05SPaul E. McKenney 		if (!oldmask != !rnp->qsmaskinit) {
1832962aff03SPaul E. McKenney 			if (!oldmask) { /* First online CPU for rcu_node. */
1833962aff03SPaul E. McKenney 				if (!rnp->wait_blkd_tasks) /* Ever offline? */
18340aa04b05SPaul E. McKenney 					rcu_init_new_rnp(rnp);
1835962aff03SPaul E. McKenney 			} else if (rcu_preempt_has_tasks(rnp)) {
1836962aff03SPaul E. McKenney 				rnp->wait_blkd_tasks = true; /* blocked tasks */
1837962aff03SPaul E. McKenney 			} else { /* Last offline CPU and can propagate. */
18380aa04b05SPaul E. McKenney 				rcu_cleanup_dead_rnp(rnp);
18390aa04b05SPaul E. McKenney 			}
1840962aff03SPaul E. McKenney 		}
18410aa04b05SPaul E. McKenney 
18420aa04b05SPaul E. McKenney 		/*
18430aa04b05SPaul E. McKenney 		 * If all waited-on tasks from prior grace period are
18440aa04b05SPaul E. McKenney 		 * done, and if all this rcu_node structure's CPUs are
18450aa04b05SPaul E. McKenney 		 * still offline, propagate up the rcu_node tree and
18460aa04b05SPaul E. McKenney 		 * clear ->wait_blkd_tasks.  Otherwise, if one of this
18470aa04b05SPaul E. McKenney 		 * rcu_node structure's CPUs has since come back online,
1848962aff03SPaul E. McKenney 		 * simply clear ->wait_blkd_tasks.
18490aa04b05SPaul E. McKenney 		 */
18500aa04b05SPaul E. McKenney 		if (rnp->wait_blkd_tasks &&
1851962aff03SPaul E. McKenney 		    (!rcu_preempt_has_tasks(rnp) || rnp->qsmaskinit)) {
18520aa04b05SPaul E. McKenney 			rnp->wait_blkd_tasks = false;
1853962aff03SPaul E. McKenney 			if (!rnp->qsmaskinit)
18540aa04b05SPaul E. McKenney 				rcu_cleanup_dead_rnp(rnp);
18550aa04b05SPaul E. McKenney 		}
18560aa04b05SPaul E. McKenney 
185767c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
1858894d45bbSMike Galbraith 		raw_spin_unlock(&rcu_state.ofl_lock);
18590aa04b05SPaul E. McKenney 	}
186022212332SPaul E. McKenney 	rcu_gp_slow(gp_preinit_delay); /* Races with CPU hotplug. */
18614102adabSPaul E. McKenney 
18624102adabSPaul E. McKenney 	/*
18634102adabSPaul E. McKenney 	 * Set the quiescent-state-needed bits in all the rcu_node
18649cbc5b97SPaul E. McKenney 	 * structures for all currently online CPUs in breadth-first
18659cbc5b97SPaul E. McKenney 	 * order, starting from the root rcu_node structure, relying on the
18669cbc5b97SPaul E. McKenney 	 * layout of the tree within the rcu_state.node[] array.  Note that
18679cbc5b97SPaul E. McKenney 	 * other CPUs will access only the leaves of the hierarchy, thus
18689cbc5b97SPaul E. McKenney 	 * seeing that no grace period is in progress, at least until the
18699cbc5b97SPaul E. McKenney 	 * corresponding leaf node has been initialized.
18704102adabSPaul E. McKenney 	 *
18714102adabSPaul E. McKenney 	 * The grace period cannot complete until the initialization
18724102adabSPaul E. McKenney 	 * process finishes, because this kthread handles both.
18734102adabSPaul E. McKenney 	 */
18749cbc5b97SPaul E. McKenney 	rcu_state.gp_state = RCU_GP_INIT;
1875aedf4ba9SPaul E. McKenney 	rcu_for_each_node_breadth_first(rnp) {
187622212332SPaul E. McKenney 		rcu_gp_slow(gp_init_delay);
1877ec2c2976SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
1878da1df50dSPaul E. McKenney 		rdp = this_cpu_ptr(&rcu_data);
187981ab59a3SPaul E. McKenney 		rcu_preempt_check_blocked_tasks(rnp);
18804102adabSPaul E. McKenney 		rnp->qsmask = rnp->qsmaskinit;
18819cbc5b97SPaul E. McKenney 		WRITE_ONCE(rnp->gp_seq, rcu_state.gp_seq);
18824102adabSPaul E. McKenney 		if (rnp == rdp->mynode)
1883c7e48f7bSPaul E. McKenney 			(void)__note_gp_changes(rnp, rdp);
18844102adabSPaul E. McKenney 		rcu_preempt_boost_start_gp(rnp);
18859cbc5b97SPaul E. McKenney 		trace_rcu_grace_period_init(rcu_state.name, rnp->gp_seq,
18864102adabSPaul E. McKenney 					    rnp->level, rnp->grplo,
18874102adabSPaul E. McKenney 					    rnp->grphi, rnp->qsmask);
1888ec2c2976SPaul E. McKenney 		/* Quiescent states for tasks on any now-offline CPUs. */
1889ec2c2976SPaul E. McKenney 		mask = rnp->qsmask & ~rnp->qsmaskinitnext;
1890f2e2df59SPaul E. McKenney 		rnp->rcu_gp_init_mask = mask;
1891ec2c2976SPaul E. McKenney 		if ((mask || rnp->wait_blkd_tasks) && rcu_is_leaf_node(rnp))
1892b50912d0SPaul E. McKenney 			rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
1893ec2c2976SPaul E. McKenney 		else
189467c583a7SBoqun Feng 			raw_spin_unlock_irq_rcu_node(rnp);
1895cee43939SPaul E. McKenney 		cond_resched_tasks_rcu_qs();
18969cbc5b97SPaul E. McKenney 		WRITE_ONCE(rcu_state.gp_activity, jiffies);
18974102adabSPaul E. McKenney 	}
18984102adabSPaul E. McKenney 
189945fed3e7SPaul E. McKenney 	return true;
19004102adabSPaul E. McKenney }
19014102adabSPaul E. McKenney 
19024102adabSPaul E. McKenney /*
1903b3dae109SPeter Zijlstra  * Helper function for swait_event_idle_exclusive() wakeup at force-quiescent-state
1904d5374226SLuis R. Rodriguez  * time.
1905b9a425cfSPaul E. McKenney  */
19060854a05cSPaul E. McKenney static bool rcu_gp_fqs_check_wake(int *gfp)
1907b9a425cfSPaul E. McKenney {
1908336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
1909b9a425cfSPaul E. McKenney 
1910b9a425cfSPaul E. McKenney 	/* Someone like call_rcu() requested a force-quiescent-state scan. */
19110854a05cSPaul E. McKenney 	*gfp = READ_ONCE(rcu_state.gp_flags);
1912b9a425cfSPaul E. McKenney 	if (*gfp & RCU_GP_FLAG_FQS)
1913b9a425cfSPaul E. McKenney 		return true;
1914b9a425cfSPaul E. McKenney 
1915b9a425cfSPaul E. McKenney 	/* The current grace period has completed. */
1916b9a425cfSPaul E. McKenney 	if (!READ_ONCE(rnp->qsmask) && !rcu_preempt_blocked_readers_cgp(rnp))
1917b9a425cfSPaul E. McKenney 		return true;
1918b9a425cfSPaul E. McKenney 
1919b9a425cfSPaul E. McKenney 	return false;
1920b9a425cfSPaul E. McKenney }
1921b9a425cfSPaul E. McKenney 
1922b9a425cfSPaul E. McKenney /*
19234102adabSPaul E. McKenney  * Do one round of quiescent-state forcing.
19244102adabSPaul E. McKenney  */
19250854a05cSPaul E. McKenney static void rcu_gp_fqs(bool first_time)
19264102adabSPaul E. McKenney {
1927336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
19284102adabSPaul E. McKenney 
19299cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_activity, jiffies);
19309cbc5b97SPaul E. McKenney 	rcu_state.n_force_qs++;
193177f81fe0SPetr Mladek 	if (first_time) {
19324102adabSPaul E. McKenney 		/* Collect dyntick-idle snapshots. */
1933e9ecb780SPaul E. McKenney 		force_qs_rnp(dyntick_save_progress_counter);
19344102adabSPaul E. McKenney 	} else {
19354102adabSPaul E. McKenney 		/* Handle dyntick-idle and offline CPUs. */
1936e9ecb780SPaul E. McKenney 		force_qs_rnp(rcu_implicit_dynticks_qs);
19374102adabSPaul E. McKenney 	}
19384102adabSPaul E. McKenney 	/* Clear flag to prevent immediate re-entry. */
19399cbc5b97SPaul E. McKenney 	if (READ_ONCE(rcu_state.gp_flags) & RCU_GP_FLAG_FQS) {
19402a67e741SPeter Zijlstra 		raw_spin_lock_irq_rcu_node(rnp);
19419cbc5b97SPaul E. McKenney 		WRITE_ONCE(rcu_state.gp_flags,
19429cbc5b97SPaul E. McKenney 			   READ_ONCE(rcu_state.gp_flags) & ~RCU_GP_FLAG_FQS);
194367c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
19444102adabSPaul E. McKenney 	}
19454102adabSPaul E. McKenney }
19464102adabSPaul E. McKenney 
19474102adabSPaul E. McKenney /*
1948c3854a05SPaul E. McKenney  * Loop doing repeated quiescent-state forcing until the grace period ends.
1949c3854a05SPaul E. McKenney  */
1950c3854a05SPaul E. McKenney static void rcu_gp_fqs_loop(void)
1951c3854a05SPaul E. McKenney {
1952c3854a05SPaul E. McKenney 	bool first_gp_fqs;
1953c3854a05SPaul E. McKenney 	int gf;
1954c3854a05SPaul E. McKenney 	unsigned long j;
1955c3854a05SPaul E. McKenney 	int ret;
1956c3854a05SPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
1957c3854a05SPaul E. McKenney 
1958c3854a05SPaul E. McKenney 	first_gp_fqs = true;
1959c06aed0eSPaul E. McKenney 	j = READ_ONCE(jiffies_till_first_fqs);
1960c3854a05SPaul E. McKenney 	ret = 0;
1961c3854a05SPaul E. McKenney 	for (;;) {
1962c3854a05SPaul E. McKenney 		if (!ret) {
1963c3854a05SPaul E. McKenney 			rcu_state.jiffies_force_qs = jiffies + j;
1964c3854a05SPaul E. McKenney 			WRITE_ONCE(rcu_state.jiffies_kick_kthreads,
19659cf422a8SPaul E. McKenney 				   jiffies + (j ? 3 * j : 2));
1966c3854a05SPaul E. McKenney 		}
1967c3854a05SPaul E. McKenney 		trace_rcu_grace_period(rcu_state.name,
1968c3854a05SPaul E. McKenney 				       READ_ONCE(rcu_state.gp_seq),
1969c3854a05SPaul E. McKenney 				       TPS("fqswait"));
1970c3854a05SPaul E. McKenney 		rcu_state.gp_state = RCU_GP_WAIT_FQS;
1971c3854a05SPaul E. McKenney 		ret = swait_event_idle_timeout_exclusive(
1972c3854a05SPaul E. McKenney 				rcu_state.gp_wq, rcu_gp_fqs_check_wake(&gf), j);
1973c3854a05SPaul E. McKenney 		rcu_state.gp_state = RCU_GP_DOING_FQS;
1974c3854a05SPaul E. McKenney 		/* Locking provides needed memory barriers. */
1975c3854a05SPaul E. McKenney 		/* If grace period done, leave loop. */
1976c3854a05SPaul E. McKenney 		if (!READ_ONCE(rnp->qsmask) &&
1977c3854a05SPaul E. McKenney 		    !rcu_preempt_blocked_readers_cgp(rnp))
1978c3854a05SPaul E. McKenney 			break;
1979c3854a05SPaul E. McKenney 		/* If time for quiescent-state forcing, do it. */
1980c3854a05SPaul E. McKenney 		if (ULONG_CMP_GE(jiffies, rcu_state.jiffies_force_qs) ||
1981c3854a05SPaul E. McKenney 		    (gf & RCU_GP_FLAG_FQS)) {
1982c3854a05SPaul E. McKenney 			trace_rcu_grace_period(rcu_state.name,
1983c3854a05SPaul E. McKenney 					       READ_ONCE(rcu_state.gp_seq),
1984c3854a05SPaul E. McKenney 					       TPS("fqsstart"));
1985c3854a05SPaul E. McKenney 			rcu_gp_fqs(first_gp_fqs);
1986c3854a05SPaul E. McKenney 			first_gp_fqs = false;
1987c3854a05SPaul E. McKenney 			trace_rcu_grace_period(rcu_state.name,
1988c3854a05SPaul E. McKenney 					       READ_ONCE(rcu_state.gp_seq),
1989c3854a05SPaul E. McKenney 					       TPS("fqsend"));
1990c3854a05SPaul E. McKenney 			cond_resched_tasks_rcu_qs();
1991c3854a05SPaul E. McKenney 			WRITE_ONCE(rcu_state.gp_activity, jiffies);
1992c3854a05SPaul E. McKenney 			ret = 0; /* Force full wait till next FQS. */
1993c06aed0eSPaul E. McKenney 			j = READ_ONCE(jiffies_till_next_fqs);
1994c3854a05SPaul E. McKenney 		} else {
1995c3854a05SPaul E. McKenney 			/* Deal with stray signal. */
1996c3854a05SPaul E. McKenney 			cond_resched_tasks_rcu_qs();
1997c3854a05SPaul E. McKenney 			WRITE_ONCE(rcu_state.gp_activity, jiffies);
1998c3854a05SPaul E. McKenney 			WARN_ON(signal_pending(current));
1999c3854a05SPaul E. McKenney 			trace_rcu_grace_period(rcu_state.name,
2000c3854a05SPaul E. McKenney 					       READ_ONCE(rcu_state.gp_seq),
2001c3854a05SPaul E. McKenney 					       TPS("fqswaitsig"));
2002c3854a05SPaul E. McKenney 			ret = 1; /* Keep old FQS timing. */
2003c3854a05SPaul E. McKenney 			j = jiffies;
2004c3854a05SPaul E. McKenney 			if (time_after(jiffies, rcu_state.jiffies_force_qs))
2005c3854a05SPaul E. McKenney 				j = 1;
2006c3854a05SPaul E. McKenney 			else
2007c3854a05SPaul E. McKenney 				j = rcu_state.jiffies_force_qs - j;
2008c3854a05SPaul E. McKenney 		}
2009c3854a05SPaul E. McKenney 	}
2010c3854a05SPaul E. McKenney }
2011c3854a05SPaul E. McKenney 
2012c3854a05SPaul E. McKenney /*
20134102adabSPaul E. McKenney  * Clean up after the old grace period.
20144102adabSPaul E. McKenney  */
20150854a05cSPaul E. McKenney static void rcu_gp_cleanup(void)
20164102adabSPaul E. McKenney {
20174102adabSPaul E. McKenney 	unsigned long gp_duration;
201848a7639cSPaul E. McKenney 	bool needgp = false;
2019de30ad51SPaul E. McKenney 	unsigned long new_gp_seq;
20204102adabSPaul E. McKenney 	struct rcu_data *rdp;
2021336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
2022abedf8e2SPaul Gortmaker 	struct swait_queue_head *sq;
20234102adabSPaul E. McKenney 
20249cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_activity, jiffies);
20252a67e741SPeter Zijlstra 	raw_spin_lock_irq_rcu_node(rnp);
2026c51d7b5eSPaul E. McKenney 	rcu_state.gp_end = jiffies;
2027c51d7b5eSPaul E. McKenney 	gp_duration = rcu_state.gp_end - rcu_state.gp_start;
20289cbc5b97SPaul E. McKenney 	if (gp_duration > rcu_state.gp_max)
20299cbc5b97SPaul E. McKenney 		rcu_state.gp_max = gp_duration;
20304102adabSPaul E. McKenney 
20314102adabSPaul E. McKenney 	/*
20324102adabSPaul E. McKenney 	 * We know the grace period is complete, but to everyone else
20334102adabSPaul E. McKenney 	 * it appears to still be ongoing.  But it is also the case
20344102adabSPaul E. McKenney 	 * that to everyone else it looks like there is nothing that
20354102adabSPaul E. McKenney 	 * they can do to advance the grace period.  It is therefore
20364102adabSPaul E. McKenney 	 * safe for us to drop the lock in order to mark the grace
20374102adabSPaul E. McKenney 	 * period as completed in all of the rcu_node structures.
20384102adabSPaul E. McKenney 	 */
203967c583a7SBoqun Feng 	raw_spin_unlock_irq_rcu_node(rnp);
20404102adabSPaul E. McKenney 
20414102adabSPaul E. McKenney 	/*
2042ff3bb6f4SPaul E. McKenney 	 * Propagate new ->gp_seq value to rcu_node structures so that
2043ff3bb6f4SPaul E. McKenney 	 * other CPUs don't have to wait until the start of the next grace
2044ff3bb6f4SPaul E. McKenney 	 * period to process their callbacks.  This also avoids some nasty
2045ff3bb6f4SPaul E. McKenney 	 * RCU grace-period initialization races by forcing the end of
2046ff3bb6f4SPaul E. McKenney 	 * the current grace period to be completely recorded in all of
2047ff3bb6f4SPaul E. McKenney 	 * the rcu_node structures before the beginning of the next grace
2048ff3bb6f4SPaul E. McKenney 	 * period is recorded in any of the rcu_node structures.
20494102adabSPaul E. McKenney 	 */
20509cbc5b97SPaul E. McKenney 	new_gp_seq = rcu_state.gp_seq;
2051de30ad51SPaul E. McKenney 	rcu_seq_end(&new_gp_seq);
2052aedf4ba9SPaul E. McKenney 	rcu_for_each_node_breadth_first(rnp) {
20532a67e741SPeter Zijlstra 		raw_spin_lock_irq_rcu_node(rnp);
20544bc8d555SPaul E. McKenney 		if (WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp)))
205581ab59a3SPaul E. McKenney 			dump_blkd_tasks(rnp, 10);
20565c60d25fSPaul E. McKenney 		WARN_ON_ONCE(rnp->qsmask);
2057de30ad51SPaul E. McKenney 		WRITE_ONCE(rnp->gp_seq, new_gp_seq);
2058da1df50dSPaul E. McKenney 		rdp = this_cpu_ptr(&rcu_data);
20594102adabSPaul E. McKenney 		if (rnp == rdp->mynode)
2060c7e48f7bSPaul E. McKenney 			needgp = __note_gp_changes(rnp, rdp) || needgp;
206178e4bc34SPaul E. McKenney 		/* smp_mb() provided by prior unlock-lock pair. */
20623481f2eaSPaul E. McKenney 		needgp = rcu_future_gp_cleanup(rnp) || needgp;
2063065bb78cSDaniel Wagner 		sq = rcu_nocb_gp_get(rnp);
206467c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
2065065bb78cSDaniel Wagner 		rcu_nocb_gp_cleanup(sq);
2066cee43939SPaul E. McKenney 		cond_resched_tasks_rcu_qs();
20679cbc5b97SPaul E. McKenney 		WRITE_ONCE(rcu_state.gp_activity, jiffies);
206822212332SPaul E. McKenney 		rcu_gp_slow(gp_cleanup_delay);
20694102adabSPaul E. McKenney 	}
2070336a4f6cSPaul E. McKenney 	rnp = rcu_get_root();
20719cbc5b97SPaul E. McKenney 	raw_spin_lock_irq_rcu_node(rnp); /* GP before ->gp_seq update. */
20724102adabSPaul E. McKenney 
20730a89e5a4SPaul E. McKenney 	/* Declare grace period done, trace first to use old GP number. */
20749cbc5b97SPaul E. McKenney 	trace_rcu_grace_period(rcu_state.name, rcu_state.gp_seq, TPS("end"));
20750a89e5a4SPaul E. McKenney 	rcu_seq_end(&rcu_state.gp_seq);
20769cbc5b97SPaul E. McKenney 	rcu_state.gp_state = RCU_GP_IDLE;
2077fb31340fSPaul E. McKenney 	/* Check for GP requests since above loop. */
2078da1df50dSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
20795b55072fSJoel Fernandes (Google) 	if (!needgp && ULONG_CMP_LT(rnp->gp_seq, rnp->gp_seq_needed)) {
2080abd13fddSPaul E. McKenney 		trace_rcu_this_gp(rnp, rdp, rnp->gp_seq_needed,
2081fb31340fSPaul E. McKenney 				  TPS("CleanupMore"));
2082fb31340fSPaul E. McKenney 		needgp = true;
2083fb31340fSPaul E. McKenney 	}
208448a7639cSPaul E. McKenney 	/* Advance CBs to reduce false positives below. */
208502f50142SPaul E. McKenney 	if (!rcu_accelerate_cbs(rnp, rdp) && needgp) {
20869cbc5b97SPaul E. McKenney 		WRITE_ONCE(rcu_state.gp_flags, RCU_GP_FLAG_INIT);
20879cbc5b97SPaul E. McKenney 		rcu_state.gp_req_activity = jiffies;
20889cbc5b97SPaul E. McKenney 		trace_rcu_grace_period(rcu_state.name,
20899cbc5b97SPaul E. McKenney 				       READ_ONCE(rcu_state.gp_seq),
20904102adabSPaul E. McKenney 				       TPS("newreq"));
209118390aeaSPaul E. McKenney 	} else {
20929cbc5b97SPaul E. McKenney 		WRITE_ONCE(rcu_state.gp_flags,
20939cbc5b97SPaul E. McKenney 			   rcu_state.gp_flags & RCU_GP_FLAG_INIT);
209418390aeaSPaul E. McKenney 	}
209567c583a7SBoqun Feng 	raw_spin_unlock_irq_rcu_node(rnp);
20964102adabSPaul E. McKenney }
20974102adabSPaul E. McKenney 
20984102adabSPaul E. McKenney /*
20994102adabSPaul E. McKenney  * Body of kthread that handles grace periods.
21004102adabSPaul E. McKenney  */
21010854a05cSPaul E. McKenney static int __noreturn rcu_gp_kthread(void *unused)
21024102adabSPaul E. McKenney {
21035871968dSPaul E. McKenney 	rcu_bind_gp_kthread();
21044102adabSPaul E. McKenney 	for (;;) {
21054102adabSPaul E. McKenney 
21064102adabSPaul E. McKenney 		/* Handle grace-period start. */
21074102adabSPaul E. McKenney 		for (;;) {
21089cbc5b97SPaul E. McKenney 			trace_rcu_grace_period(rcu_state.name,
21099cbc5b97SPaul E. McKenney 					       READ_ONCE(rcu_state.gp_seq),
21104102adabSPaul E. McKenney 					       TPS("reqwait"));
21119cbc5b97SPaul E. McKenney 			rcu_state.gp_state = RCU_GP_WAIT_GPS;
21129cbc5b97SPaul E. McKenney 			swait_event_idle_exclusive(rcu_state.gp_wq,
21139cbc5b97SPaul E. McKenney 					 READ_ONCE(rcu_state.gp_flags) &
21144102adabSPaul E. McKenney 					 RCU_GP_FLAG_INIT);
21159cbc5b97SPaul E. McKenney 			rcu_state.gp_state = RCU_GP_DONE_GPS;
211678e4bc34SPaul E. McKenney 			/* Locking provides needed memory barrier. */
21170854a05cSPaul E. McKenney 			if (rcu_gp_init())
21184102adabSPaul E. McKenney 				break;
2119cee43939SPaul E. McKenney 			cond_resched_tasks_rcu_qs();
21209cbc5b97SPaul E. McKenney 			WRITE_ONCE(rcu_state.gp_activity, jiffies);
212173a860cdSPaul E. McKenney 			WARN_ON(signal_pending(current));
21229cbc5b97SPaul E. McKenney 			trace_rcu_grace_period(rcu_state.name,
21239cbc5b97SPaul E. McKenney 					       READ_ONCE(rcu_state.gp_seq),
21244102adabSPaul E. McKenney 					       TPS("reqwaitsig"));
21254102adabSPaul E. McKenney 		}
21264102adabSPaul E. McKenney 
21274102adabSPaul E. McKenney 		/* Handle quiescent-state forcing. */
2128c3854a05SPaul E. McKenney 		rcu_gp_fqs_loop();
21294102adabSPaul E. McKenney 
21304102adabSPaul E. McKenney 		/* Handle grace-period end. */
21319cbc5b97SPaul E. McKenney 		rcu_state.gp_state = RCU_GP_CLEANUP;
21320854a05cSPaul E. McKenney 		rcu_gp_cleanup();
21339cbc5b97SPaul E. McKenney 		rcu_state.gp_state = RCU_GP_CLEANED;
21344102adabSPaul E. McKenney 	}
21354102adabSPaul E. McKenney }
21364102adabSPaul E. McKenney 
21374102adabSPaul E. McKenney /*
213849918a54SPaul E. McKenney  * Report a full set of quiescent states to the rcu_state data structure.
213949918a54SPaul E. McKenney  * Invoke rcu_gp_kthread_wake() to awaken the grace-period kthread if
214049918a54SPaul E. McKenney  * another grace period is required.  Whether we wake the grace-period
214149918a54SPaul E. McKenney  * kthread or it awakens itself for the next round of quiescent-state
214249918a54SPaul E. McKenney  * forcing, that kthread will clean up after the just-completed grace
214349918a54SPaul E. McKenney  * period.  Note that the caller must hold rnp->lock, which is released
214449918a54SPaul E. McKenney  * before return.
21454102adabSPaul E. McKenney  */
2146aff4e9edSPaul E. McKenney static void rcu_report_qs_rsp(unsigned long flags)
2147336a4f6cSPaul E. McKenney 	__releases(rcu_get_root()->lock)
21484102adabSPaul E. McKenney {
2149336a4f6cSPaul E. McKenney 	raw_lockdep_assert_held_rcu_node(rcu_get_root());
2150de8e8730SPaul E. McKenney 	WARN_ON_ONCE(!rcu_gp_in_progress());
21519cbc5b97SPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_flags,
21529cbc5b97SPaul E. McKenney 		   READ_ONCE(rcu_state.gp_flags) | RCU_GP_FLAG_FQS);
2153336a4f6cSPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rcu_get_root(), flags);
2154532c00c9SPaul E. McKenney 	rcu_gp_kthread_wake();
21554102adabSPaul E. McKenney }
21564102adabSPaul E. McKenney 
21574102adabSPaul E. McKenney /*
21584102adabSPaul E. McKenney  * Similar to rcu_report_qs_rdp(), for which it is a helper function.
21594102adabSPaul E. McKenney  * Allows quiescent states for a group of CPUs to be reported at one go
21604102adabSPaul E. McKenney  * to the specified rcu_node structure, though all the CPUs in the group
2161654e9533SPaul E. McKenney  * must be represented by the same rcu_node structure (which need not be a
2162654e9533SPaul E. McKenney  * leaf rcu_node structure, though it often will be).  The gps parameter
2163654e9533SPaul E. McKenney  * is the grace-period snapshot, which means that the quiescent states
2164c9a24e2dSPaul E. McKenney  * are valid only if rnp->gp_seq is equal to gps.  That structure's lock
2165654e9533SPaul E. McKenney  * must be held upon entry, and it is released before return.
2166ec2c2976SPaul E. McKenney  *
2167ec2c2976SPaul E. McKenney  * As a special case, if mask is zero, the bit-already-cleared check is
2168ec2c2976SPaul E. McKenney  * disabled.  This allows propagating quiescent state due to resumed tasks
2169ec2c2976SPaul E. McKenney  * during grace-period initialization.
21704102adabSPaul E. McKenney  */
2171b50912d0SPaul E. McKenney static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp,
2172b50912d0SPaul E. McKenney 			      unsigned long gps, unsigned long flags)
21734102adabSPaul E. McKenney 	__releases(rnp->lock)
21744102adabSPaul E. McKenney {
2175654e9533SPaul E. McKenney 	unsigned long oldmask = 0;
21764102adabSPaul E. McKenney 	struct rcu_node *rnp_c;
21774102adabSPaul E. McKenney 
2178a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
2179c0b334c5SPaul E. McKenney 
21804102adabSPaul E. McKenney 	/* Walk up the rcu_node hierarchy. */
21814102adabSPaul E. McKenney 	for (;;) {
2182ec2c2976SPaul E. McKenney 		if ((!(rnp->qsmask & mask) && mask) || rnp->gp_seq != gps) {
21834102adabSPaul E. McKenney 
2184654e9533SPaul E. McKenney 			/*
2185654e9533SPaul E. McKenney 			 * Our bit has already been cleared, or the
2186654e9533SPaul E. McKenney 			 * relevant grace period is already over, so done.
2187654e9533SPaul E. McKenney 			 */
218867c583a7SBoqun Feng 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
21894102adabSPaul E. McKenney 			return;
21904102adabSPaul E. McKenney 		}
2191654e9533SPaul E. McKenney 		WARN_ON_ONCE(oldmask); /* Any child must be all zeroed! */
21925b4c11d5SPaul E. McKenney 		WARN_ON_ONCE(!rcu_is_leaf_node(rnp) &&
21932dee9404SPaul E. McKenney 			     rcu_preempt_blocked_readers_cgp(rnp));
21944102adabSPaul E. McKenney 		rnp->qsmask &= ~mask;
219567a0edbfSPaul E. McKenney 		trace_rcu_quiescent_state_report(rcu_state.name, rnp->gp_seq,
21964102adabSPaul E. McKenney 						 mask, rnp->qsmask, rnp->level,
21974102adabSPaul E. McKenney 						 rnp->grplo, rnp->grphi,
21984102adabSPaul E. McKenney 						 !!rnp->gp_tasks);
21994102adabSPaul E. McKenney 		if (rnp->qsmask != 0 || rcu_preempt_blocked_readers_cgp(rnp)) {
22004102adabSPaul E. McKenney 
22014102adabSPaul E. McKenney 			/* Other bits still set at this level, so done. */
220267c583a7SBoqun Feng 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
22034102adabSPaul E. McKenney 			return;
22044102adabSPaul E. McKenney 		}
2205d43a5d32SPaul E. McKenney 		rnp->completedqs = rnp->gp_seq;
22064102adabSPaul E. McKenney 		mask = rnp->grpmask;
22074102adabSPaul E. McKenney 		if (rnp->parent == NULL) {
22084102adabSPaul E. McKenney 
22094102adabSPaul E. McKenney 			/* No more levels.  Exit loop holding root lock. */
22104102adabSPaul E. McKenney 
22114102adabSPaul E. McKenney 			break;
22124102adabSPaul E. McKenney 		}
221367c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
22144102adabSPaul E. McKenney 		rnp_c = rnp;
22154102adabSPaul E. McKenney 		rnp = rnp->parent;
22162a67e741SPeter Zijlstra 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
2217654e9533SPaul E. McKenney 		oldmask = rnp_c->qsmask;
22184102adabSPaul E. McKenney 	}
22194102adabSPaul E. McKenney 
22204102adabSPaul E. McKenney 	/*
22214102adabSPaul E. McKenney 	 * Get here if we are the last CPU to pass through a quiescent
22224102adabSPaul E. McKenney 	 * state for this grace period.  Invoke rcu_report_qs_rsp()
22234102adabSPaul E. McKenney 	 * to clean up and start the next grace period if one is needed.
22244102adabSPaul E. McKenney 	 */
2225aff4e9edSPaul E. McKenney 	rcu_report_qs_rsp(flags); /* releases rnp->lock. */
22264102adabSPaul E. McKenney }
22274102adabSPaul E. McKenney 
22284102adabSPaul E. McKenney /*
2229cc99a310SPaul E. McKenney  * Record a quiescent state for all tasks that were previously queued
2230cc99a310SPaul E. McKenney  * on the specified rcu_node structure and that were blocking the current
223149918a54SPaul E. McKenney  * RCU grace period.  The caller must hold the corresponding rnp->lock with
2232cc99a310SPaul E. McKenney  * irqs disabled, and this lock is released upon return, but irqs remain
2233cc99a310SPaul E. McKenney  * disabled.
2234cc99a310SPaul E. McKenney  */
223517a8212bSPaul E. McKenney static void __maybe_unused
2236139ad4daSPaul E. McKenney rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags)
2237cc99a310SPaul E. McKenney 	__releases(rnp->lock)
2238cc99a310SPaul E. McKenney {
2239654e9533SPaul E. McKenney 	unsigned long gps;
2240cc99a310SPaul E. McKenney 	unsigned long mask;
2241cc99a310SPaul E. McKenney 	struct rcu_node *rnp_p;
2242cc99a310SPaul E. McKenney 
2243a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
224445975c7dSPaul E. McKenney 	if (WARN_ON_ONCE(!IS_ENABLED(CONFIG_PREEMPT)) ||
2245c74859d1SPaul E. McKenney 	    WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp)) ||
2246c74859d1SPaul E. McKenney 	    rnp->qsmask != 0) {
224767c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2248cc99a310SPaul E. McKenney 		return;  /* Still need more quiescent states! */
2249cc99a310SPaul E. McKenney 	}
2250cc99a310SPaul E. McKenney 
225177cfc7bfSPaul E. McKenney 	rnp->completedqs = rnp->gp_seq;
2252cc99a310SPaul E. McKenney 	rnp_p = rnp->parent;
2253cc99a310SPaul E. McKenney 	if (rnp_p == NULL) {
2254cc99a310SPaul E. McKenney 		/*
2255a77da14cSPaul E. McKenney 		 * Only one rcu_node structure in the tree, so don't
2256a77da14cSPaul E. McKenney 		 * try to report up to its nonexistent parent!
2257cc99a310SPaul E. McKenney 		 */
2258aff4e9edSPaul E. McKenney 		rcu_report_qs_rsp(flags);
2259cc99a310SPaul E. McKenney 		return;
2260cc99a310SPaul E. McKenney 	}
2261cc99a310SPaul E. McKenney 
2262c9a24e2dSPaul E. McKenney 	/* Report up the rest of the hierarchy, tracking current ->gp_seq. */
2263c9a24e2dSPaul E. McKenney 	gps = rnp->gp_seq;
2264cc99a310SPaul E. McKenney 	mask = rnp->grpmask;
226567c583a7SBoqun Feng 	raw_spin_unlock_rcu_node(rnp);	/* irqs remain disabled. */
22662a67e741SPeter Zijlstra 	raw_spin_lock_rcu_node(rnp_p);	/* irqs already disabled. */
2267b50912d0SPaul E. McKenney 	rcu_report_qs_rnp(mask, rnp_p, gps, flags);
2268cc99a310SPaul E. McKenney }
2269cc99a310SPaul E. McKenney 
2270cc99a310SPaul E. McKenney /*
22714102adabSPaul E. McKenney  * Record a quiescent state for the specified CPU to that CPU's rcu_data
22724b455dc3SPaul E. McKenney  * structure.  This must be called from the specified CPU.
22734102adabSPaul E. McKenney  */
22744102adabSPaul E. McKenney static void
227533085c46SPaul E. McKenney rcu_report_qs_rdp(int cpu, struct rcu_data *rdp)
22764102adabSPaul E. McKenney {
22774102adabSPaul E. McKenney 	unsigned long flags;
22784102adabSPaul E. McKenney 	unsigned long mask;
227948a7639cSPaul E. McKenney 	bool needwake;
22804102adabSPaul E. McKenney 	struct rcu_node *rnp;
22814102adabSPaul E. McKenney 
22824102adabSPaul E. McKenney 	rnp = rdp->mynode;
22832a67e741SPeter Zijlstra 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
2284c9a24e2dSPaul E. McKenney 	if (rdp->cpu_no_qs.b.norm || rdp->gp_seq != rnp->gp_seq ||
2285c9a24e2dSPaul E. McKenney 	    rdp->gpwrap) {
22864102adabSPaul E. McKenney 
22874102adabSPaul E. McKenney 		/*
22884102adabSPaul E. McKenney 		 * The grace period in which this quiescent state was
22894102adabSPaul E. McKenney 		 * recorded has ended, so don't report it upwards.
22904102adabSPaul E. McKenney 		 * We will instead need a new quiescent state that lies
22914102adabSPaul E. McKenney 		 * within the current grace period.
22924102adabSPaul E. McKenney 		 */
22935b74c458SPaul E. McKenney 		rdp->cpu_no_qs.b.norm = true;	/* need qs for new gp. */
229467c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
22954102adabSPaul E. McKenney 		return;
22964102adabSPaul E. McKenney 	}
22974102adabSPaul E. McKenney 	mask = rdp->grpmask;
22984102adabSPaul E. McKenney 	if ((rnp->qsmask & mask) == 0) {
229967c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
23004102adabSPaul E. McKenney 	} else {
2301bb53e416SPaul E. McKenney 		rdp->core_needs_qs = false;
23024102adabSPaul E. McKenney 
23034102adabSPaul E. McKenney 		/*
23044102adabSPaul E. McKenney 		 * This GP can't end until cpu checks in, so all of our
23054102adabSPaul E. McKenney 		 * callbacks can be processed during the next GP.
23064102adabSPaul E. McKenney 		 */
230702f50142SPaul E. McKenney 		needwake = rcu_accelerate_cbs(rnp, rdp);
23084102adabSPaul E. McKenney 
2309b50912d0SPaul E. McKenney 		rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
2310654e9533SPaul E. McKenney 		/* ^^^ Released rnp->lock */
231148a7639cSPaul E. McKenney 		if (needwake)
2312532c00c9SPaul E. McKenney 			rcu_gp_kthread_wake();
23134102adabSPaul E. McKenney 	}
23144102adabSPaul E. McKenney }
23154102adabSPaul E. McKenney 
23164102adabSPaul E. McKenney /*
23174102adabSPaul E. McKenney  * Check to see if there is a new grace period of which this CPU
23184102adabSPaul E. McKenney  * is not yet aware, and if so, set up local rcu_data state for it.
23194102adabSPaul E. McKenney  * Otherwise, see if this CPU has just passed through its first
23204102adabSPaul E. McKenney  * quiescent state for this grace period, and record that fact if so.
23214102adabSPaul E. McKenney  */
23224102adabSPaul E. McKenney static void
23238087d3e3SPaul E. McKenney rcu_check_quiescent_state(struct rcu_data *rdp)
23244102adabSPaul E. McKenney {
23254102adabSPaul E. McKenney 	/* Check for grace-period ends and beginnings. */
232615cabdffSPaul E. McKenney 	note_gp_changes(rdp);
23274102adabSPaul E. McKenney 
23284102adabSPaul E. McKenney 	/*
23294102adabSPaul E. McKenney 	 * Does this CPU still need to do its part for current grace period?
23304102adabSPaul E. McKenney 	 * If no, return and let the other CPUs do their part as well.
23314102adabSPaul E. McKenney 	 */
233297c668b8SPaul E. McKenney 	if (!rdp->core_needs_qs)
23334102adabSPaul E. McKenney 		return;
23344102adabSPaul E. McKenney 
23354102adabSPaul E. McKenney 	/*
23364102adabSPaul E. McKenney 	 * Was there a quiescent state since the beginning of the grace
23374102adabSPaul E. McKenney 	 * period? If no, then exit and wait for the next call.
23384102adabSPaul E. McKenney 	 */
23393a19b46aSPaul E. McKenney 	if (rdp->cpu_no_qs.b.norm)
23404102adabSPaul E. McKenney 		return;
23414102adabSPaul E. McKenney 
23424102adabSPaul E. McKenney 	/*
23434102adabSPaul E. McKenney 	 * Tell RCU we are done (but rcu_report_qs_rdp() will be the
23444102adabSPaul E. McKenney 	 * judge of that).
23454102adabSPaul E. McKenney 	 */
234633085c46SPaul E. McKenney 	rcu_report_qs_rdp(rdp->cpu, rdp);
23474102adabSPaul E. McKenney }
23484102adabSPaul E. McKenney 
23494102adabSPaul E. McKenney /*
2350780cd590SPaul E. McKenney  * Near the end of the offline process.  Trace the fact that this CPU
2351780cd590SPaul E. McKenney  * is going offline.
23524102adabSPaul E. McKenney  */
2353780cd590SPaul E. McKenney int rcutree_dying_cpu(unsigned int cpu)
23544102adabSPaul E. McKenney {
2355477351f7SPaul E. McKenney 	RCU_TRACE(bool blkd;)
2356da1df50dSPaul E. McKenney 	RCU_TRACE(struct rcu_data *rdp = this_cpu_ptr(&rcu_data);)
235788a4976dSPaul E. McKenney 	RCU_TRACE(struct rcu_node *rnp = rdp->mynode;)
23584102adabSPaul E. McKenney 
2359ea46351cSPaul E. McKenney 	if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
2360780cd590SPaul E. McKenney 		return 0;
2361ea46351cSPaul E. McKenney 
2362477351f7SPaul E. McKenney 	RCU_TRACE(blkd = !!(rnp->qsmask & rdp->grpmask);)
2363780cd590SPaul E. McKenney 	trace_rcu_grace_period(rcu_state.name, rnp->gp_seq,
2364477351f7SPaul E. McKenney 			       blkd ? TPS("cpuofl") : TPS("cpuofl-bgp"));
2365780cd590SPaul E. McKenney 	return 0;
23664102adabSPaul E. McKenney }
23674102adabSPaul E. McKenney 
23684102adabSPaul E. McKenney /*
23698af3a5e7SPaul E. McKenney  * All CPUs for the specified rcu_node structure have gone offline,
23708af3a5e7SPaul E. McKenney  * and all tasks that were preempted within an RCU read-side critical
23718af3a5e7SPaul E. McKenney  * section while running on one of those CPUs have since exited their RCU
23728af3a5e7SPaul E. McKenney  * read-side critical section.  Some other CPU is reporting this fact with
23738af3a5e7SPaul E. McKenney  * the specified rcu_node structure's ->lock held and interrupts disabled.
23748af3a5e7SPaul E. McKenney  * This function therefore goes up the tree of rcu_node structures,
23758af3a5e7SPaul E. McKenney  * clearing the corresponding bits in the ->qsmaskinit fields.  Note that
23768af3a5e7SPaul E. McKenney  * the leaf rcu_node structure's ->qsmaskinit field has already been
2377c50cbe53SPaul E. McKenney  * updated.
23788af3a5e7SPaul E. McKenney  *
23798af3a5e7SPaul E. McKenney  * This function does check that the specified rcu_node structure has
23808af3a5e7SPaul E. McKenney  * all CPUs offline and no blocked tasks, so it is OK to invoke it
23818af3a5e7SPaul E. McKenney  * prematurely.  That said, invoking it after the fact will cost you
23828af3a5e7SPaul E. McKenney  * a needless lock acquisition.  So once it has done its work, don't
23838af3a5e7SPaul E. McKenney  * invoke it again.
23848af3a5e7SPaul E. McKenney  */
23858af3a5e7SPaul E. McKenney static void rcu_cleanup_dead_rnp(struct rcu_node *rnp_leaf)
23868af3a5e7SPaul E. McKenney {
23878af3a5e7SPaul E. McKenney 	long mask;
23888af3a5e7SPaul E. McKenney 	struct rcu_node *rnp = rnp_leaf;
23898af3a5e7SPaul E. McKenney 
2390962aff03SPaul E. McKenney 	raw_lockdep_assert_held_rcu_node(rnp_leaf);
2391ea46351cSPaul E. McKenney 	if (!IS_ENABLED(CONFIG_HOTPLUG_CPU) ||
2392962aff03SPaul E. McKenney 	    WARN_ON_ONCE(rnp_leaf->qsmaskinit) ||
2393962aff03SPaul E. McKenney 	    WARN_ON_ONCE(rcu_preempt_has_tasks(rnp_leaf)))
23948af3a5e7SPaul E. McKenney 		return;
23958af3a5e7SPaul E. McKenney 	for (;;) {
23968af3a5e7SPaul E. McKenney 		mask = rnp->grpmask;
23978af3a5e7SPaul E. McKenney 		rnp = rnp->parent;
23988af3a5e7SPaul E. McKenney 		if (!rnp)
23998af3a5e7SPaul E. McKenney 			break;
24002a67e741SPeter Zijlstra 		raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
24018af3a5e7SPaul E. McKenney 		rnp->qsmaskinit &= ~mask;
2402962aff03SPaul E. McKenney 		/* Between grace periods, so better already be zero! */
2403962aff03SPaul E. McKenney 		WARN_ON_ONCE(rnp->qsmask);
24048af3a5e7SPaul E. McKenney 		if (rnp->qsmaskinit) {
240567c583a7SBoqun Feng 			raw_spin_unlock_rcu_node(rnp);
240667c583a7SBoqun Feng 			/* irqs remain disabled. */
24078af3a5e7SPaul E. McKenney 			return;
24088af3a5e7SPaul E. McKenney 		}
240967c583a7SBoqun Feng 		raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */
24108af3a5e7SPaul E. McKenney 	}
24118af3a5e7SPaul E. McKenney }
24128af3a5e7SPaul E. McKenney 
24138af3a5e7SPaul E. McKenney /*
24144102adabSPaul E. McKenney  * The CPU has been completely removed, and some other CPU is reporting
2415a58163d8SPaul E. McKenney  * this fact from process context.  Do the remainder of the cleanup.
2416a58163d8SPaul E. McKenney  * There can only be one CPU hotplug operation at a time, so no need for
2417a58163d8SPaul E. McKenney  * explicit locking.
24184102adabSPaul E. McKenney  */
2419780cd590SPaul E. McKenney int rcutree_dead_cpu(unsigned int cpu)
24204102adabSPaul E. McKenney {
2421da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
24224102adabSPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;  /* Outgoing CPU's rdp & rnp. */
24234102adabSPaul E. McKenney 
2424ea46351cSPaul E. McKenney 	if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
2425780cd590SPaul E. McKenney 		return 0;
2426ea46351cSPaul E. McKenney 
24274102adabSPaul E. McKenney 	/* Adjust any no-longer-needed kthreads. */
24284102adabSPaul E. McKenney 	rcu_boost_kthread_setaffinity(rnp, -1);
2429780cd590SPaul E. McKenney 	/* Do any needed no-CB deferred wakeups from this CPU. */
2430780cd590SPaul E. McKenney 	do_nocb_deferred_wakeup(per_cpu_ptr(&rcu_data, cpu));
2431780cd590SPaul E. McKenney 	return 0;
24324102adabSPaul E. McKenney }
24334102adabSPaul E. McKenney 
24344102adabSPaul E. McKenney /*
24354102adabSPaul E. McKenney  * Invoke any RCU callbacks that have made it to the end of their grace
24364102adabSPaul E. McKenney  * period.  Thottle as specified by rdp->blimit.
24374102adabSPaul E. McKenney  */
24385bb5d09cSPaul E. McKenney static void rcu_do_batch(struct rcu_data *rdp)
24394102adabSPaul E. McKenney {
24404102adabSPaul E. McKenney 	unsigned long flags;
244115fecf89SPaul E. McKenney 	struct rcu_head *rhp;
244215fecf89SPaul E. McKenney 	struct rcu_cblist rcl = RCU_CBLIST_INITIALIZER(rcl);
244315fecf89SPaul E. McKenney 	long bl, count;
24444102adabSPaul E. McKenney 
24454102adabSPaul E. McKenney 	/* If no callbacks are ready, just return. */
244615fecf89SPaul E. McKenney 	if (!rcu_segcblist_ready_cbs(&rdp->cblist)) {
24473c779dfeSPaul E. McKenney 		trace_rcu_batch_start(rcu_state.name,
244815fecf89SPaul E. McKenney 				      rcu_segcblist_n_lazy_cbs(&rdp->cblist),
244915fecf89SPaul E. McKenney 				      rcu_segcblist_n_cbs(&rdp->cblist), 0);
24503c779dfeSPaul E. McKenney 		trace_rcu_batch_end(rcu_state.name, 0,
245115fecf89SPaul E. McKenney 				    !rcu_segcblist_empty(&rdp->cblist),
24524102adabSPaul E. McKenney 				    need_resched(), is_idle_task(current),
24534102adabSPaul E. McKenney 				    rcu_is_callbacks_kthread());
24544102adabSPaul E. McKenney 		return;
24554102adabSPaul E. McKenney 	}
24564102adabSPaul E. McKenney 
24574102adabSPaul E. McKenney 	/*
24584102adabSPaul E. McKenney 	 * Extract the list of ready callbacks, disabling to prevent
245915fecf89SPaul E. McKenney 	 * races with call_rcu() from interrupt handlers.  Leave the
246015fecf89SPaul E. McKenney 	 * callback counts, as rcu_barrier() needs to be conservative.
24614102adabSPaul E. McKenney 	 */
24624102adabSPaul E. McKenney 	local_irq_save(flags);
24634102adabSPaul E. McKenney 	WARN_ON_ONCE(cpu_is_offline(smp_processor_id()));
24644102adabSPaul E. McKenney 	bl = rdp->blimit;
24653c779dfeSPaul E. McKenney 	trace_rcu_batch_start(rcu_state.name,
24663c779dfeSPaul E. McKenney 			      rcu_segcblist_n_lazy_cbs(&rdp->cblist),
246715fecf89SPaul E. McKenney 			      rcu_segcblist_n_cbs(&rdp->cblist), bl);
246815fecf89SPaul E. McKenney 	rcu_segcblist_extract_done_cbs(&rdp->cblist, &rcl);
24694102adabSPaul E. McKenney 	local_irq_restore(flags);
24704102adabSPaul E. McKenney 
24714102adabSPaul E. McKenney 	/* Invoke callbacks. */
247215fecf89SPaul E. McKenney 	rhp = rcu_cblist_dequeue(&rcl);
247315fecf89SPaul E. McKenney 	for (; rhp; rhp = rcu_cblist_dequeue(&rcl)) {
247415fecf89SPaul E. McKenney 		debug_rcu_head_unqueue(rhp);
24753c779dfeSPaul E. McKenney 		if (__rcu_reclaim(rcu_state.name, rhp))
247615fecf89SPaul E. McKenney 			rcu_cblist_dequeued_lazy(&rcl);
247715fecf89SPaul E. McKenney 		/*
247815fecf89SPaul E. McKenney 		 * Stop only if limit reached and CPU has something to do.
247915fecf89SPaul E. McKenney 		 * Note: The rcl structure counts down from zero.
248015fecf89SPaul E. McKenney 		 */
24814b27f20bSPaul E. McKenney 		if (-rcl.len >= bl &&
24824102adabSPaul E. McKenney 		    (need_resched() ||
24834102adabSPaul E. McKenney 		     (!is_idle_task(current) && !rcu_is_callbacks_kthread())))
24844102adabSPaul E. McKenney 			break;
24854102adabSPaul E. McKenney 	}
24864102adabSPaul E. McKenney 
24874102adabSPaul E. McKenney 	local_irq_save(flags);
24884b27f20bSPaul E. McKenney 	count = -rcl.len;
24893c779dfeSPaul E. McKenney 	trace_rcu_batch_end(rcu_state.name, count, !!rcl.head, need_resched(),
24908ef0f37eSPaul E. McKenney 			    is_idle_task(current), rcu_is_callbacks_kthread());
24914102adabSPaul E. McKenney 
249215fecf89SPaul E. McKenney 	/* Update counts and requeue any remaining callbacks. */
249315fecf89SPaul E. McKenney 	rcu_segcblist_insert_done_cbs(&rdp->cblist, &rcl);
24944102adabSPaul E. McKenney 	smp_mb(); /* List handling before counting for rcu_barrier(). */
249515fecf89SPaul E. McKenney 	rcu_segcblist_insert_count(&rdp->cblist, &rcl);
24964102adabSPaul E. McKenney 
24974102adabSPaul E. McKenney 	/* Reinstate batch limit if we have worked down the excess. */
249815fecf89SPaul E. McKenney 	count = rcu_segcblist_n_cbs(&rdp->cblist);
249915fecf89SPaul E. McKenney 	if (rdp->blimit == LONG_MAX && count <= qlowmark)
25004102adabSPaul E. McKenney 		rdp->blimit = blimit;
25014102adabSPaul E. McKenney 
25024102adabSPaul E. McKenney 	/* Reset ->qlen_last_fqs_check trigger if enough CBs have drained. */
250315fecf89SPaul E. McKenney 	if (count == 0 && rdp->qlen_last_fqs_check != 0) {
25044102adabSPaul E. McKenney 		rdp->qlen_last_fqs_check = 0;
25053c779dfeSPaul E. McKenney 		rdp->n_force_qs_snap = rcu_state.n_force_qs;
250615fecf89SPaul E. McKenney 	} else if (count < rdp->qlen_last_fqs_check - qhimark)
250715fecf89SPaul E. McKenney 		rdp->qlen_last_fqs_check = count;
2508efd88b02SPaul E. McKenney 
2509efd88b02SPaul E. McKenney 	/*
2510efd88b02SPaul E. McKenney 	 * The following usually indicates a double call_rcu().  To track
2511efd88b02SPaul E. McKenney 	 * this down, try building with CONFIG_DEBUG_OBJECTS_RCU_HEAD=y.
2512efd88b02SPaul E. McKenney 	 */
251315fecf89SPaul E. McKenney 	WARN_ON_ONCE(rcu_segcblist_empty(&rdp->cblist) != (count == 0));
25144102adabSPaul E. McKenney 
25154102adabSPaul E. McKenney 	local_irq_restore(flags);
25164102adabSPaul E. McKenney 
25174102adabSPaul E. McKenney 	/* Re-invoke RCU core processing if there are callbacks remaining. */
251815fecf89SPaul E. McKenney 	if (rcu_segcblist_ready_cbs(&rdp->cblist))
25194102adabSPaul E. McKenney 		invoke_rcu_core();
25204102adabSPaul E. McKenney }
25214102adabSPaul E. McKenney 
25224102adabSPaul E. McKenney /*
2523c98cac60SPaul E. McKenney  * This function is invoked from each scheduling-clock interrupt,
2524c98cac60SPaul E. McKenney  * and checks to see if this CPU is in a non-context-switch quiescent
2525c98cac60SPaul E. McKenney  * state, for example, user mode or idle loop.  It also schedules RCU
2526c98cac60SPaul E. McKenney  * core processing.  If the current grace period has gone on too long,
2527c98cac60SPaul E. McKenney  * it will ask the scheduler to manufacture a context switch for the sole
2528c98cac60SPaul E. McKenney  * purpose of providing a providing the needed quiescent state.
25294102adabSPaul E. McKenney  */
2530c98cac60SPaul E. McKenney void rcu_sched_clock_irq(int user)
25314102adabSPaul E. McKenney {
25324102adabSPaul E. McKenney 	trace_rcu_utilization(TPS("Start scheduler-tick"));
25334e95020cSPaul E. McKenney 	raw_cpu_inc(rcu_data.ticks_this_gp);
253492aa39e9SPaul E. McKenney 	/* The load-acquire pairs with the store-release setting to true. */
25352dba13f0SPaul E. McKenney 	if (smp_load_acquire(this_cpu_ptr(&rcu_data.rcu_urgent_qs))) {
253692aa39e9SPaul E. McKenney 		/* Idle and userspace execution already are quiescent states. */
2537a0ef9ec2SPaul E. McKenney 		if (!rcu_is_cpu_rrupt_from_idle() && !user) {
253892aa39e9SPaul E. McKenney 			set_tsk_need_resched(current);
253992aa39e9SPaul E. McKenney 			set_preempt_need_resched();
25404102adabSPaul E. McKenney 		}
25412dba13f0SPaul E. McKenney 		__this_cpu_write(rcu_data.rcu_urgent_qs, false);
254292aa39e9SPaul E. McKenney 	}
2543c98cac60SPaul E. McKenney 	rcu_flavor_sched_clock_irq(user);
2544e3950ecdSPaul E. McKenney 	if (rcu_pending())
25454102adabSPaul E. McKenney 		invoke_rcu_core();
254607f27570SByungchul Park 
25474102adabSPaul E. McKenney 	trace_rcu_utilization(TPS("End scheduler-tick"));
25484102adabSPaul E. McKenney }
25494102adabSPaul E. McKenney 
25504102adabSPaul E. McKenney /*
25514102adabSPaul E. McKenney  * Scan the leaf rcu_node structures, processing dyntick state for any that
25524102adabSPaul E. McKenney  * have not yet encountered a quiescent state, using the function specified.
25534102adabSPaul E. McKenney  * Also initiate boosting for any threads blocked on the root rcu_node.
25544102adabSPaul E. McKenney  *
25554102adabSPaul E. McKenney  * The caller must have suppressed start of new grace periods.
25564102adabSPaul E. McKenney  */
25578ff0b907SPaul E. McKenney static void force_qs_rnp(int (*f)(struct rcu_data *rdp))
25584102adabSPaul E. McKenney {
25594102adabSPaul E. McKenney 	int cpu;
25604102adabSPaul E. McKenney 	unsigned long flags;
25614102adabSPaul E. McKenney 	unsigned long mask;
25624102adabSPaul E. McKenney 	struct rcu_node *rnp;
25634102adabSPaul E. McKenney 
2564aedf4ba9SPaul E. McKenney 	rcu_for_each_leaf_node(rnp) {
2565cee43939SPaul E. McKenney 		cond_resched_tasks_rcu_qs();
25664102adabSPaul E. McKenney 		mask = 0;
25672a67e741SPeter Zijlstra 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
25684102adabSPaul E. McKenney 		if (rnp->qsmask == 0) {
256945975c7dSPaul E. McKenney 			if (!IS_ENABLED(CONFIG_PREEMPT) ||
2570a77da14cSPaul E. McKenney 			    rcu_preempt_blocked_readers_cgp(rnp)) {
2571a77da14cSPaul E. McKenney 				/*
2572a77da14cSPaul E. McKenney 				 * No point in scanning bits because they
2573a77da14cSPaul E. McKenney 				 * are all zero.  But we might need to
2574a77da14cSPaul E. McKenney 				 * priority-boost blocked readers.
2575a77da14cSPaul E. McKenney 				 */
2576a77da14cSPaul E. McKenney 				rcu_initiate_boost(rnp, flags);
2577a77da14cSPaul E. McKenney 				/* rcu_initiate_boost() releases rnp->lock */
25784102adabSPaul E. McKenney 				continue;
25794102adabSPaul E. McKenney 			}
258092816435SPaul E. McKenney 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
258192816435SPaul E. McKenney 			continue;
2582a77da14cSPaul E. McKenney 		}
2583bc75e999SMark Rutland 		for_each_leaf_node_possible_cpu(rnp, cpu) {
2584bc75e999SMark Rutland 			unsigned long bit = leaf_node_cpu_bit(rnp, cpu);
25854102adabSPaul E. McKenney 			if ((rnp->qsmask & bit) != 0) {
2586da1df50dSPaul E. McKenney 				if (f(per_cpu_ptr(&rcu_data, cpu)))
25874102adabSPaul E. McKenney 					mask |= bit;
25884102adabSPaul E. McKenney 			}
25894102adabSPaul E. McKenney 		}
25904102adabSPaul E. McKenney 		if (mask != 0) {
2591c9a24e2dSPaul E. McKenney 			/* Idle/offline CPUs, report (releases rnp->lock). */
2592b50912d0SPaul E. McKenney 			rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
25930aa04b05SPaul E. McKenney 		} else {
25940aa04b05SPaul E. McKenney 			/* Nothing to do here, so just drop the lock. */
259567c583a7SBoqun Feng 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
25964102adabSPaul E. McKenney 		}
25974102adabSPaul E. McKenney 	}
25980aa04b05SPaul E. McKenney }
25994102adabSPaul E. McKenney 
26004102adabSPaul E. McKenney /*
26014102adabSPaul E. McKenney  * Force quiescent states on reluctant CPUs, and also detect which
26024102adabSPaul E. McKenney  * CPUs are in dyntick-idle mode.
26034102adabSPaul E. McKenney  */
2604cd920e5aSPaul E. McKenney void rcu_force_quiescent_state(void)
26054102adabSPaul E. McKenney {
26064102adabSPaul E. McKenney 	unsigned long flags;
26074102adabSPaul E. McKenney 	bool ret;
26084102adabSPaul E. McKenney 	struct rcu_node *rnp;
26094102adabSPaul E. McKenney 	struct rcu_node *rnp_old = NULL;
26104102adabSPaul E. McKenney 
26114102adabSPaul E. McKenney 	/* Funnel through hierarchy to reduce memory contention. */
2612da1df50dSPaul E. McKenney 	rnp = __this_cpu_read(rcu_data.mynode);
26134102adabSPaul E. McKenney 	for (; rnp != NULL; rnp = rnp->parent) {
261467a0edbfSPaul E. McKenney 		ret = (READ_ONCE(rcu_state.gp_flags) & RCU_GP_FLAG_FQS) ||
26154102adabSPaul E. McKenney 		      !raw_spin_trylock(&rnp->fqslock);
26164102adabSPaul E. McKenney 		if (rnp_old != NULL)
26174102adabSPaul E. McKenney 			raw_spin_unlock(&rnp_old->fqslock);
2618d62df573SPaul E. McKenney 		if (ret)
26194102adabSPaul E. McKenney 			return;
26204102adabSPaul E. McKenney 		rnp_old = rnp;
26214102adabSPaul E. McKenney 	}
2622336a4f6cSPaul E. McKenney 	/* rnp_old == rcu_get_root(), rnp == NULL. */
26234102adabSPaul E. McKenney 
26244102adabSPaul E. McKenney 	/* Reached the root of the rcu_node tree, acquire lock. */
26252a67e741SPeter Zijlstra 	raw_spin_lock_irqsave_rcu_node(rnp_old, flags);
26264102adabSPaul E. McKenney 	raw_spin_unlock(&rnp_old->fqslock);
262767a0edbfSPaul E. McKenney 	if (READ_ONCE(rcu_state.gp_flags) & RCU_GP_FLAG_FQS) {
262867c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp_old, flags);
26294102adabSPaul E. McKenney 		return;  /* Someone beat us to it. */
26304102adabSPaul E. McKenney 	}
263167a0edbfSPaul E. McKenney 	WRITE_ONCE(rcu_state.gp_flags,
263267a0edbfSPaul E. McKenney 		   READ_ONCE(rcu_state.gp_flags) | RCU_GP_FLAG_FQS);
263367c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp_old, flags);
2634532c00c9SPaul E. McKenney 	rcu_gp_kthread_wake();
26354102adabSPaul E. McKenney }
2636cd920e5aSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_force_quiescent_state);
26374102adabSPaul E. McKenney 
26384102adabSPaul E. McKenney /*
263926d950a9SPaul E. McKenney  * This function checks for grace-period requests that fail to motivate
264026d950a9SPaul E. McKenney  * RCU to come out of its idle mode.
264126d950a9SPaul E. McKenney  */
2642791416c4SPaul E. McKenney void
2643791416c4SPaul E. McKenney rcu_check_gp_start_stall(struct rcu_node *rnp, struct rcu_data *rdp,
2644791416c4SPaul E. McKenney 			 const unsigned long gpssdelay)
264526d950a9SPaul E. McKenney {
264626d950a9SPaul E. McKenney 	unsigned long flags;
264726d950a9SPaul E. McKenney 	unsigned long j;
2648336a4f6cSPaul E. McKenney 	struct rcu_node *rnp_root = rcu_get_root();
264926d950a9SPaul E. McKenney 	static atomic_t warned = ATOMIC_INIT(0);
265026d950a9SPaul E. McKenney 
2651de8e8730SPaul E. McKenney 	if (!IS_ENABLED(CONFIG_PROVE_RCU) || rcu_gp_in_progress() ||
26527a1d0f23SPaul E. McKenney 	    ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed))
265326d950a9SPaul E. McKenney 		return;
265426d950a9SPaul E. McKenney 	j = jiffies; /* Expensive access, and in common case don't get here. */
265567a0edbfSPaul E. McKenney 	if (time_before(j, READ_ONCE(rcu_state.gp_req_activity) + gpssdelay) ||
265667a0edbfSPaul E. McKenney 	    time_before(j, READ_ONCE(rcu_state.gp_activity) + gpssdelay) ||
265726d950a9SPaul E. McKenney 	    atomic_read(&warned))
265826d950a9SPaul E. McKenney 		return;
265926d950a9SPaul E. McKenney 
266026d950a9SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
266126d950a9SPaul E. McKenney 	j = jiffies;
2662de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress() ||
26637a1d0f23SPaul E. McKenney 	    ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed) ||
266467a0edbfSPaul E. McKenney 	    time_before(j, READ_ONCE(rcu_state.gp_req_activity) + gpssdelay) ||
266567a0edbfSPaul E. McKenney 	    time_before(j, READ_ONCE(rcu_state.gp_activity) + gpssdelay) ||
266626d950a9SPaul E. McKenney 	    atomic_read(&warned)) {
266726d950a9SPaul E. McKenney 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
266826d950a9SPaul E. McKenney 		return;
266926d950a9SPaul E. McKenney 	}
267026d950a9SPaul E. McKenney 	/* Hold onto the leaf lock to make others see warned==1. */
267126d950a9SPaul E. McKenney 
267226d950a9SPaul E. McKenney 	if (rnp_root != rnp)
267326d950a9SPaul E. McKenney 		raw_spin_lock_rcu_node(rnp_root); /* irqs already disabled. */
267426d950a9SPaul E. McKenney 	j = jiffies;
2675de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress() ||
26767a1d0f23SPaul E. McKenney 	    ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed) ||
267767a0edbfSPaul E. McKenney 	    time_before(j, rcu_state.gp_req_activity + gpssdelay) ||
267867a0edbfSPaul E. McKenney 	    time_before(j, rcu_state.gp_activity + gpssdelay) ||
267926d950a9SPaul E. McKenney 	    atomic_xchg(&warned, 1)) {
268026d950a9SPaul E. McKenney 		raw_spin_unlock_rcu_node(rnp_root); /* irqs remain disabled. */
268126d950a9SPaul E. McKenney 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
268226d950a9SPaul E. McKenney 		return;
268326d950a9SPaul E. McKenney 	}
268426d950a9SPaul E. McKenney 	WARN_ON(1);
268526d950a9SPaul E. McKenney 	if (rnp_root != rnp)
268626d950a9SPaul E. McKenney 		raw_spin_unlock_rcu_node(rnp_root);
268726d950a9SPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2688fd897573SPaul E. McKenney 	show_rcu_gp_kthreads();
268926d950a9SPaul E. McKenney }
269026d950a9SPaul E. McKenney 
269126d950a9SPaul E. McKenney /*
2692e0aff973SPaul E. McKenney  * Do a forward-progress check for rcutorture.  This is normally invoked
2693e0aff973SPaul E. McKenney  * due to an OOM event.  The argument "j" gives the time period during
2694e0aff973SPaul E. McKenney  * which rcutorture would like progress to have been made.
2695e0aff973SPaul E. McKenney  */
2696e0aff973SPaul E. McKenney void rcu_fwd_progress_check(unsigned long j)
2697e0aff973SPaul E. McKenney {
2698bfcfcffcSPaul E. McKenney 	unsigned long cbs;
2699bfcfcffcSPaul E. McKenney 	int cpu;
2700bfcfcffcSPaul E. McKenney 	unsigned long max_cbs = 0;
2701bfcfcffcSPaul E. McKenney 	int max_cpu = -1;
2702e0aff973SPaul E. McKenney 	struct rcu_data *rdp;
2703e0aff973SPaul E. McKenney 
2704e0aff973SPaul E. McKenney 	if (rcu_gp_in_progress()) {
27058dd3b546SPaul E. McKenney 		pr_info("%s: GP age %lu jiffies\n",
27068dd3b546SPaul E. McKenney 			__func__, jiffies - rcu_state.gp_start);
2707e0aff973SPaul E. McKenney 		show_rcu_gp_kthreads();
2708e0aff973SPaul E. McKenney 	} else {
2709c51d7b5eSPaul E. McKenney 		pr_info("%s: Last GP end %lu jiffies ago\n",
2710c51d7b5eSPaul E. McKenney 			__func__, jiffies - rcu_state.gp_end);
2711e0aff973SPaul E. McKenney 		preempt_disable();
2712e0aff973SPaul E. McKenney 		rdp = this_cpu_ptr(&rcu_data);
2713e0aff973SPaul E. McKenney 		rcu_check_gp_start_stall(rdp->mynode, rdp, j);
2714e0aff973SPaul E. McKenney 		preempt_enable();
2715e0aff973SPaul E. McKenney 	}
2716bfcfcffcSPaul E. McKenney 	for_each_possible_cpu(cpu) {
2717bfcfcffcSPaul E. McKenney 		cbs = rcu_get_n_cbs_cpu(cpu);
2718bfcfcffcSPaul E. McKenney 		if (!cbs)
2719bfcfcffcSPaul E. McKenney 			continue;
2720bfcfcffcSPaul E. McKenney 		if (max_cpu < 0)
2721bfcfcffcSPaul E. McKenney 			pr_info("%s: callbacks", __func__);
2722bfcfcffcSPaul E. McKenney 		pr_cont(" %d: %lu", cpu, cbs);
2723bfcfcffcSPaul E. McKenney 		if (cbs <= max_cbs)
2724bfcfcffcSPaul E. McKenney 			continue;
2725bfcfcffcSPaul E. McKenney 		max_cbs = cbs;
2726bfcfcffcSPaul E. McKenney 		max_cpu = cpu;
2727bfcfcffcSPaul E. McKenney 	}
2728bfcfcffcSPaul E. McKenney 	if (max_cpu >= 0)
2729bfcfcffcSPaul E. McKenney 		pr_cont("\n");
2730e0aff973SPaul E. McKenney }
2731e0aff973SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_fwd_progress_check);
2732e0aff973SPaul E. McKenney 
2733fb60e533SPaul E. McKenney /* Perform RCU core processing work for the current CPU.  */
2734fb60e533SPaul E. McKenney static __latent_entropy void rcu_core(struct softirq_action *unused)
27354102adabSPaul E. McKenney {
27364102adabSPaul E. McKenney 	unsigned long flags;
2737da1df50dSPaul E. McKenney 	struct rcu_data *rdp = raw_cpu_ptr(&rcu_data);
27384102adabSPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;
27394102adabSPaul E. McKenney 
27404102adabSPaul E. McKenney 	if (cpu_is_offline(smp_processor_id()))
27414102adabSPaul E. McKenney 		return;
27424102adabSPaul E. McKenney 	trace_rcu_utilization(TPS("Start RCU core"));
27434102adabSPaul E. McKenney 	WARN_ON_ONCE(!rdp->beenonline);
27444102adabSPaul E. McKenney 
27453e310098SPaul E. McKenney 	/* Report any deferred quiescent states if preemption enabled. */
2746fced9c8cSPaul E. McKenney 	if (!(preempt_count() & PREEMPT_MASK)) {
27473e310098SPaul E. McKenney 		rcu_preempt_deferred_qs(current);
2748fced9c8cSPaul E. McKenney 	} else if (rcu_preempt_need_deferred_qs(current)) {
2749fced9c8cSPaul E. McKenney 		set_tsk_need_resched(current);
2750fced9c8cSPaul E. McKenney 		set_preempt_need_resched();
2751fced9c8cSPaul E. McKenney 	}
27523e310098SPaul E. McKenney 
27534102adabSPaul E. McKenney 	/* Update RCU state based on any recent quiescent states. */
27548087d3e3SPaul E. McKenney 	rcu_check_quiescent_state(rdp);
27554102adabSPaul E. McKenney 
27564102adabSPaul E. McKenney 	/* No grace period and unregistered callbacks? */
2757de8e8730SPaul E. McKenney 	if (!rcu_gp_in_progress() &&
275848a7639cSPaul E. McKenney 	    rcu_segcblist_is_enabled(&rdp->cblist)) {
275948a7639cSPaul E. McKenney 		local_irq_save(flags);
27604102adabSPaul E. McKenney 		if (!rcu_segcblist_restempty(&rdp->cblist, RCU_NEXT_READY_TAIL))
2761c6e09b97SPaul E. McKenney 			rcu_accelerate_cbs_unlocked(rnp, rdp);
27624102adabSPaul E. McKenney 		local_irq_restore(flags);
27634102adabSPaul E. McKenney 	}
27649910affaSYao Dongdong 
2765791416c4SPaul E. McKenney 	rcu_check_gp_start_stall(rnp, rdp, rcu_jiffies_till_stall_check());
27664102adabSPaul E. McKenney 
27674102adabSPaul E. McKenney 	/* If there are callbacks ready, invoke them. */
27684102adabSPaul E. McKenney 	if (rcu_segcblist_ready_cbs(&rdp->cblist))
2769aff4e9edSPaul E. McKenney 		invoke_rcu_callbacks(rdp);
27704102adabSPaul E. McKenney 
27714102adabSPaul E. McKenney 	/* Do any needed deferred wakeups of rcuo kthreads. */
27724102adabSPaul E. McKenney 	do_nocb_deferred_wakeup(rdp);
27734102adabSPaul E. McKenney 	trace_rcu_utilization(TPS("End RCU core"));
27744102adabSPaul E. McKenney }
27754102adabSPaul E. McKenney 
27764102adabSPaul E. McKenney /*
277749918a54SPaul E. McKenney  * Schedule RCU callback invocation.  If the running implementation of RCU
277849918a54SPaul E. McKenney  * does not support RCU priority boosting, just do a direct call, otherwise
277949918a54SPaul E. McKenney  * wake up the per-CPU kernel kthread.  Note that because we are running
278049918a54SPaul E. McKenney  * on the current CPU with softirqs disabled, the rcu_cpu_kthread_task
278149918a54SPaul E. McKenney  * cannot disappear out from under us.
27824102adabSPaul E. McKenney  */
2783aff4e9edSPaul E. McKenney static void invoke_rcu_callbacks(struct rcu_data *rdp)
27844102adabSPaul E. McKenney {
27854102adabSPaul E. McKenney 	if (unlikely(!READ_ONCE(rcu_scheduler_fully_active)))
27864102adabSPaul E. McKenney 		return;
27873c779dfeSPaul E. McKenney 	if (likely(!rcu_state.boost)) {
27885bb5d09cSPaul E. McKenney 		rcu_do_batch(rdp);
27894102adabSPaul E. McKenney 		return;
27904102adabSPaul E. McKenney 	}
27914102adabSPaul E. McKenney 	invoke_rcu_callbacks_kthread();
27924102adabSPaul E. McKenney }
27934102adabSPaul E. McKenney 
27944102adabSPaul E. McKenney static void invoke_rcu_core(void)
27954102adabSPaul E. McKenney {
27964102adabSPaul E. McKenney 	if (cpu_online(smp_processor_id()))
27974102adabSPaul E. McKenney 		raise_softirq(RCU_SOFTIRQ);
27984102adabSPaul E. McKenney }
27994102adabSPaul E. McKenney 
28004102adabSPaul E. McKenney /*
28014102adabSPaul E. McKenney  * Handle any core-RCU processing required by a call_rcu() invocation.
28024102adabSPaul E. McKenney  */
28035c7d8967SPaul E. McKenney static void __call_rcu_core(struct rcu_data *rdp, struct rcu_head *head,
28045c7d8967SPaul E. McKenney 			    unsigned long flags)
28054102adabSPaul E. McKenney {
28064102adabSPaul E. McKenney 	/*
28074102adabSPaul E. McKenney 	 * If called from an extended quiescent state, invoke the RCU
28084102adabSPaul E. McKenney 	 * core in order to force a re-evaluation of RCU's idleness.
28094102adabSPaul E. McKenney 	 */
28104102adabSPaul E. McKenney 	if (!rcu_is_watching())
28114102adabSPaul E. McKenney 		invoke_rcu_core();
28124102adabSPaul E. McKenney 
28134102adabSPaul E. McKenney 	/* If interrupts were disabled or CPU offline, don't invoke RCU core. */
28144102adabSPaul E. McKenney 	if (irqs_disabled_flags(flags) || cpu_is_offline(smp_processor_id()))
28154102adabSPaul E. McKenney 		return;
28164102adabSPaul E. McKenney 
28174102adabSPaul E. McKenney 	/*
28184102adabSPaul E. McKenney 	 * Force the grace period if too many callbacks or too long waiting.
2819cd920e5aSPaul E. McKenney 	 * Enforce hysteresis, and don't invoke rcu_force_quiescent_state()
28204102adabSPaul E. McKenney 	 * if some other CPU has recently done so.  Also, don't bother
2821cd920e5aSPaul E. McKenney 	 * invoking rcu_force_quiescent_state() if the newly enqueued callback
28224102adabSPaul E. McKenney 	 * is the only one waiting for a grace period to complete.
28234102adabSPaul E. McKenney 	 */
282415fecf89SPaul E. McKenney 	if (unlikely(rcu_segcblist_n_cbs(&rdp->cblist) >
282515fecf89SPaul E. McKenney 		     rdp->qlen_last_fqs_check + qhimark)) {
28264102adabSPaul E. McKenney 
28274102adabSPaul E. McKenney 		/* Are we ignoring a completed grace period? */
282815cabdffSPaul E. McKenney 		note_gp_changes(rdp);
28294102adabSPaul E. McKenney 
28304102adabSPaul E. McKenney 		/* Start a new grace period if one not already started. */
2831de8e8730SPaul E. McKenney 		if (!rcu_gp_in_progress()) {
2832c6e09b97SPaul E. McKenney 			rcu_accelerate_cbs_unlocked(rdp->mynode, rdp);
28334102adabSPaul E. McKenney 		} else {
28344102adabSPaul E. McKenney 			/* Give the grace period a kick. */
28354102adabSPaul E. McKenney 			rdp->blimit = LONG_MAX;
28365c7d8967SPaul E. McKenney 			if (rcu_state.n_force_qs == rdp->n_force_qs_snap &&
283715fecf89SPaul E. McKenney 			    rcu_segcblist_first_pend_cb(&rdp->cblist) != head)
2838cd920e5aSPaul E. McKenney 				rcu_force_quiescent_state();
28395c7d8967SPaul E. McKenney 			rdp->n_force_qs_snap = rcu_state.n_force_qs;
284015fecf89SPaul E. McKenney 			rdp->qlen_last_fqs_check = rcu_segcblist_n_cbs(&rdp->cblist);
28414102adabSPaul E. McKenney 		}
28424102adabSPaul E. McKenney 	}
28434102adabSPaul E. McKenney }
28444102adabSPaul E. McKenney 
28454102adabSPaul E. McKenney /*
28464102adabSPaul E. McKenney  * RCU callback function to leak a callback.
28474102adabSPaul E. McKenney  */
28484102adabSPaul E. McKenney static void rcu_leak_callback(struct rcu_head *rhp)
28494102adabSPaul E. McKenney {
28504102adabSPaul E. McKenney }
28514102adabSPaul E. McKenney 
28524102adabSPaul E. McKenney /*
28534102adabSPaul E. McKenney  * Helper function for call_rcu() and friends.  The cpu argument will
28544102adabSPaul E. McKenney  * normally be -1, indicating "currently running CPU".  It may specify
2855dd46a788SPaul E. McKenney  * a CPU only if that CPU is a no-CBs CPU.  Currently, only rcu_barrier()
28564102adabSPaul E. McKenney  * is expected to specify a CPU.
28574102adabSPaul E. McKenney  */
28584102adabSPaul E. McKenney static void
28595c7d8967SPaul E. McKenney __call_rcu(struct rcu_head *head, rcu_callback_t func, int cpu, bool lazy)
28604102adabSPaul E. McKenney {
28614102adabSPaul E. McKenney 	unsigned long flags;
28624102adabSPaul E. McKenney 	struct rcu_data *rdp;
28634102adabSPaul E. McKenney 
2864b8f2ed53SPaul E. McKenney 	/* Misaligned rcu_head! */
2865b8f2ed53SPaul E. McKenney 	WARN_ON_ONCE((unsigned long)head & (sizeof(void *) - 1));
2866b8f2ed53SPaul E. McKenney 
28674102adabSPaul E. McKenney 	if (debug_rcu_head_queue(head)) {
2868fa3c6647SPaul E. McKenney 		/*
2869fa3c6647SPaul E. McKenney 		 * Probable double call_rcu(), so leak the callback.
2870fa3c6647SPaul E. McKenney 		 * Use rcu:rcu_callback trace event to find the previous
2871fa3c6647SPaul E. McKenney 		 * time callback was passed to __call_rcu().
2872fa3c6647SPaul E. McKenney 		 */
2873fa3c6647SPaul E. McKenney 		WARN_ONCE(1, "__call_rcu(): Double-freed CB %p->%pF()!!!\n",
2874fa3c6647SPaul E. McKenney 			  head, head->func);
28757d0ae808SPaul E. McKenney 		WRITE_ONCE(head->func, rcu_leak_callback);
28764102adabSPaul E. McKenney 		return;
28774102adabSPaul E. McKenney 	}
28784102adabSPaul E. McKenney 	head->func = func;
28794102adabSPaul E. McKenney 	head->next = NULL;
28804102adabSPaul E. McKenney 	local_irq_save(flags);
2881da1df50dSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
28824102adabSPaul E. McKenney 
28834102adabSPaul E. McKenney 	/* Add the callback to our list. */
288415fecf89SPaul E. McKenney 	if (unlikely(!rcu_segcblist_is_enabled(&rdp->cblist)) || cpu != -1) {
28854102adabSPaul E. McKenney 		int offline;
28864102adabSPaul E. McKenney 
28874102adabSPaul E. McKenney 		if (cpu != -1)
2888da1df50dSPaul E. McKenney 			rdp = per_cpu_ptr(&rcu_data, cpu);
2889143da9c2SPaul E. McKenney 		if (likely(rdp->mynode)) {
2890143da9c2SPaul E. McKenney 			/* Post-boot, so this should be for a no-CBs CPU. */
289196d3fd0dSPaul E. McKenney 			offline = !__call_rcu_nocb(rdp, head, lazy, flags);
28924102adabSPaul E. McKenney 			WARN_ON_ONCE(offline);
2893143da9c2SPaul E. McKenney 			/* Offline CPU, _call_rcu() illegal, leak callback.  */
28944102adabSPaul E. McKenney 			local_irq_restore(flags);
28954102adabSPaul E. McKenney 			return;
28964102adabSPaul E. McKenney 		}
2897143da9c2SPaul E. McKenney 		/*
2898143da9c2SPaul E. McKenney 		 * Very early boot, before rcu_init().  Initialize if needed
2899143da9c2SPaul E. McKenney 		 * and then drop through to queue the callback.
2900143da9c2SPaul E. McKenney 		 */
290108543bdaSPaul E. McKenney 		WARN_ON_ONCE(cpu != -1);
290234404ca8SPaul E. McKenney 		WARN_ON_ONCE(!rcu_is_watching());
290315fecf89SPaul E. McKenney 		if (rcu_segcblist_empty(&rdp->cblist))
290415fecf89SPaul E. McKenney 			rcu_segcblist_init(&rdp->cblist);
2905143da9c2SPaul E. McKenney 	}
290615fecf89SPaul E. McKenney 	rcu_segcblist_enqueue(&rdp->cblist, head, lazy);
29074102adabSPaul E. McKenney 	if (__is_kfree_rcu_offset((unsigned long)func))
29083c779dfeSPaul E. McKenney 		trace_rcu_kfree_callback(rcu_state.name, head,
29093c779dfeSPaul E. McKenney 					 (unsigned long)func,
291015fecf89SPaul E. McKenney 					 rcu_segcblist_n_lazy_cbs(&rdp->cblist),
291115fecf89SPaul E. McKenney 					 rcu_segcblist_n_cbs(&rdp->cblist));
29124102adabSPaul E. McKenney 	else
29133c779dfeSPaul E. McKenney 		trace_rcu_callback(rcu_state.name, head,
291415fecf89SPaul E. McKenney 				   rcu_segcblist_n_lazy_cbs(&rdp->cblist),
291515fecf89SPaul E. McKenney 				   rcu_segcblist_n_cbs(&rdp->cblist));
29164102adabSPaul E. McKenney 
29174102adabSPaul E. McKenney 	/* Go handle any RCU core processing required. */
29185c7d8967SPaul E. McKenney 	__call_rcu_core(rdp, head, flags);
29194102adabSPaul E. McKenney 	local_irq_restore(flags);
29204102adabSPaul E. McKenney }
29214102adabSPaul E. McKenney 
2922a68a2bb2SPaul E. McKenney /**
292345975c7dSPaul E. McKenney  * call_rcu() - Queue an RCU callback for invocation after a grace period.
2924a68a2bb2SPaul E. McKenney  * @head: structure to be used for queueing the RCU updates.
2925a68a2bb2SPaul E. McKenney  * @func: actual callback function to be invoked after the grace period
2926a68a2bb2SPaul E. McKenney  *
2927a68a2bb2SPaul E. McKenney  * The callback function will be invoked some time after a full grace
292845975c7dSPaul E. McKenney  * period elapses, in other words after all pre-existing RCU read-side
292945975c7dSPaul E. McKenney  * critical sections have completed.  However, the callback function
293045975c7dSPaul E. McKenney  * might well execute concurrently with RCU read-side critical sections
293145975c7dSPaul E. McKenney  * that started after call_rcu() was invoked.  RCU read-side critical
293245975c7dSPaul E. McKenney  * sections are delimited by rcu_read_lock() and rcu_read_unlock(), and
293345975c7dSPaul E. McKenney  * may be nested.  In addition, regions of code across which interrupts,
293445975c7dSPaul E. McKenney  * preemption, or softirqs have been disabled also serve as RCU read-side
293545975c7dSPaul E. McKenney  * critical sections.  This includes hardware interrupt handlers, softirq
293645975c7dSPaul E. McKenney  * handlers, and NMI handlers.
293727fdb35fSPaul E. McKenney  *
293845975c7dSPaul E. McKenney  * Note that all CPUs must agree that the grace period extended beyond
293945975c7dSPaul E. McKenney  * all pre-existing RCU read-side critical section.  On systems with more
294045975c7dSPaul E. McKenney  * than one CPU, this means that when "func()" is invoked, each CPU is
294145975c7dSPaul E. McKenney  * guaranteed to have executed a full memory barrier since the end of its
294245975c7dSPaul E. McKenney  * last RCU read-side critical section whose beginning preceded the call
294345975c7dSPaul E. McKenney  * to call_rcu().  It also means that each CPU executing an RCU read-side
294445975c7dSPaul E. McKenney  * critical section that continues beyond the start of "func()" must have
294545975c7dSPaul E. McKenney  * executed a memory barrier after the call_rcu() but before the beginning
294645975c7dSPaul E. McKenney  * of that RCU read-side critical section.  Note that these guarantees
294745975c7dSPaul E. McKenney  * include CPUs that are offline, idle, or executing in user mode, as
294845975c7dSPaul E. McKenney  * well as CPUs that are executing in the kernel.
2949a68a2bb2SPaul E. McKenney  *
295045975c7dSPaul E. McKenney  * Furthermore, if CPU A invoked call_rcu() and CPU B invoked the
295145975c7dSPaul E. McKenney  * resulting RCU callback function "func()", then both CPU A and CPU B are
295245975c7dSPaul E. McKenney  * guaranteed to execute a full memory barrier during the time interval
295345975c7dSPaul E. McKenney  * between the call to call_rcu() and the invocation of "func()" -- even
295445975c7dSPaul E. McKenney  * if CPU A and CPU B are the same CPU (but again only if the system has
295545975c7dSPaul E. McKenney  * more than one CPU).
29564102adabSPaul E. McKenney  */
295745975c7dSPaul E. McKenney void call_rcu(struct rcu_head *head, rcu_callback_t func)
29584102adabSPaul E. McKenney {
29595c7d8967SPaul E. McKenney 	__call_rcu(head, func, -1, 0);
29604102adabSPaul E. McKenney }
296145975c7dSPaul E. McKenney EXPORT_SYMBOL_GPL(call_rcu);
29624102adabSPaul E. McKenney 
29634102adabSPaul E. McKenney /*
2964495aa969SAndreea-Cristina Bernat  * Queue an RCU callback for lazy invocation after a grace period.
2965495aa969SAndreea-Cristina Bernat  * This will likely be later named something like "call_rcu_lazy()",
2966495aa969SAndreea-Cristina Bernat  * but this change will require some way of tagging the lazy RCU
2967495aa969SAndreea-Cristina Bernat  * callbacks in the list of pending callbacks. Until then, this
2968495aa969SAndreea-Cristina Bernat  * function may only be called from __kfree_rcu().
2969495aa969SAndreea-Cristina Bernat  */
297098ece508SPaul E. McKenney void kfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
2971495aa969SAndreea-Cristina Bernat {
29725c7d8967SPaul E. McKenney 	__call_rcu(head, func, -1, 1);
2973495aa969SAndreea-Cristina Bernat }
2974495aa969SAndreea-Cristina Bernat EXPORT_SYMBOL_GPL(kfree_call_rcu);
2975495aa969SAndreea-Cristina Bernat 
2976e5bc3af7SPaul E. McKenney /*
2977e5bc3af7SPaul E. McKenney  * During early boot, any blocking grace-period wait automatically
2978e5bc3af7SPaul E. McKenney  * implies a grace period.  Later on, this is never the case for PREEMPT.
2979e5bc3af7SPaul E. McKenney  *
2980e5bc3af7SPaul E. McKenney  * Howevr, because a context switch is a grace period for !PREEMPT, any
2981e5bc3af7SPaul E. McKenney  * blocking grace-period wait automatically implies a grace period if
2982e5bc3af7SPaul E. McKenney  * there is only one CPU online at any point time during execution of
2983e5bc3af7SPaul E. McKenney  * either synchronize_rcu() or synchronize_rcu_expedited().  It is OK to
2984e5bc3af7SPaul E. McKenney  * occasionally incorrectly indicate that there are multiple CPUs online
2985e5bc3af7SPaul E. McKenney  * when there was in fact only one the whole time, as this just adds some
2986e5bc3af7SPaul E. McKenney  * overhead: RCU still operates correctly.
2987e5bc3af7SPaul E. McKenney  */
2988e5bc3af7SPaul E. McKenney static int rcu_blocking_is_gp(void)
2989e5bc3af7SPaul E. McKenney {
2990e5bc3af7SPaul E. McKenney 	int ret;
2991e5bc3af7SPaul E. McKenney 
2992e5bc3af7SPaul E. McKenney 	if (IS_ENABLED(CONFIG_PREEMPT))
2993e5bc3af7SPaul E. McKenney 		return rcu_scheduler_active == RCU_SCHEDULER_INACTIVE;
2994e5bc3af7SPaul E. McKenney 	might_sleep();  /* Check for RCU read-side critical section. */
2995e5bc3af7SPaul E. McKenney 	preempt_disable();
2996e5bc3af7SPaul E. McKenney 	ret = num_online_cpus() <= 1;
2997e5bc3af7SPaul E. McKenney 	preempt_enable();
2998e5bc3af7SPaul E. McKenney 	return ret;
2999e5bc3af7SPaul E. McKenney }
3000e5bc3af7SPaul E. McKenney 
3001e5bc3af7SPaul E. McKenney /**
3002e5bc3af7SPaul E. McKenney  * synchronize_rcu - wait until a grace period has elapsed.
3003e5bc3af7SPaul E. McKenney  *
3004e5bc3af7SPaul E. McKenney  * Control will return to the caller some time after a full grace
3005e5bc3af7SPaul E. McKenney  * period has elapsed, in other words after all currently executing RCU
3006e5bc3af7SPaul E. McKenney  * read-side critical sections have completed.  Note, however, that
3007e5bc3af7SPaul E. McKenney  * upon return from synchronize_rcu(), the caller might well be executing
3008e5bc3af7SPaul E. McKenney  * concurrently with new RCU read-side critical sections that began while
3009e5bc3af7SPaul E. McKenney  * synchronize_rcu() was waiting.  RCU read-side critical sections are
3010e5bc3af7SPaul E. McKenney  * delimited by rcu_read_lock() and rcu_read_unlock(), and may be nested.
3011e5bc3af7SPaul E. McKenney  * In addition, regions of code across which interrupts, preemption, or
3012e5bc3af7SPaul E. McKenney  * softirqs have been disabled also serve as RCU read-side critical
3013e5bc3af7SPaul E. McKenney  * sections.  This includes hardware interrupt handlers, softirq handlers,
3014e5bc3af7SPaul E. McKenney  * and NMI handlers.
3015e5bc3af7SPaul E. McKenney  *
3016e5bc3af7SPaul E. McKenney  * Note that this guarantee implies further memory-ordering guarantees.
3017e5bc3af7SPaul E. McKenney  * On systems with more than one CPU, when synchronize_rcu() returns,
3018e5bc3af7SPaul E. McKenney  * each CPU is guaranteed to have executed a full memory barrier since
3019e5bc3af7SPaul E. McKenney  * the end of its last RCU read-side critical section whose beginning
3020e5bc3af7SPaul E. McKenney  * preceded the call to synchronize_rcu().  In addition, each CPU having
3021e5bc3af7SPaul E. McKenney  * an RCU read-side critical section that extends beyond the return from
3022e5bc3af7SPaul E. McKenney  * synchronize_rcu() is guaranteed to have executed a full memory barrier
3023e5bc3af7SPaul E. McKenney  * after the beginning of synchronize_rcu() and before the beginning of
3024e5bc3af7SPaul E. McKenney  * that RCU read-side critical section.  Note that these guarantees include
3025e5bc3af7SPaul E. McKenney  * CPUs that are offline, idle, or executing in user mode, as well as CPUs
3026e5bc3af7SPaul E. McKenney  * that are executing in the kernel.
3027e5bc3af7SPaul E. McKenney  *
3028e5bc3af7SPaul E. McKenney  * Furthermore, if CPU A invoked synchronize_rcu(), which returned
3029e5bc3af7SPaul E. McKenney  * to its caller on CPU B, then both CPU A and CPU B are guaranteed
3030e5bc3af7SPaul E. McKenney  * to have executed a full memory barrier during the execution of
3031e5bc3af7SPaul E. McKenney  * synchronize_rcu() -- even if CPU A and CPU B are the same CPU (but
3032e5bc3af7SPaul E. McKenney  * again only if the system has more than one CPU).
3033e5bc3af7SPaul E. McKenney  */
3034e5bc3af7SPaul E. McKenney void synchronize_rcu(void)
3035e5bc3af7SPaul E. McKenney {
3036e5bc3af7SPaul E. McKenney 	RCU_LOCKDEP_WARN(lock_is_held(&rcu_bh_lock_map) ||
3037e5bc3af7SPaul E. McKenney 			 lock_is_held(&rcu_lock_map) ||
3038e5bc3af7SPaul E. McKenney 			 lock_is_held(&rcu_sched_lock_map),
3039e5bc3af7SPaul E. McKenney 			 "Illegal synchronize_rcu() in RCU read-side critical section");
3040e5bc3af7SPaul E. McKenney 	if (rcu_blocking_is_gp())
3041e5bc3af7SPaul E. McKenney 		return;
3042e5bc3af7SPaul E. McKenney 	if (rcu_gp_is_expedited())
3043e5bc3af7SPaul E. McKenney 		synchronize_rcu_expedited();
3044e5bc3af7SPaul E. McKenney 	else
3045e5bc3af7SPaul E. McKenney 		wait_rcu_gp(call_rcu);
3046e5bc3af7SPaul E. McKenney }
3047e5bc3af7SPaul E. McKenney EXPORT_SYMBOL_GPL(synchronize_rcu);
3048e5bc3af7SPaul E. McKenney 
3049765a3f4fSPaul E. McKenney /**
3050765a3f4fSPaul E. McKenney  * get_state_synchronize_rcu - Snapshot current RCU state
3051765a3f4fSPaul E. McKenney  *
3052765a3f4fSPaul E. McKenney  * Returns a cookie that is used by a later call to cond_synchronize_rcu()
3053765a3f4fSPaul E. McKenney  * to determine whether or not a full grace period has elapsed in the
3054765a3f4fSPaul E. McKenney  * meantime.
3055765a3f4fSPaul E. McKenney  */
3056765a3f4fSPaul E. McKenney unsigned long get_state_synchronize_rcu(void)
3057765a3f4fSPaul E. McKenney {
3058765a3f4fSPaul E. McKenney 	/*
3059765a3f4fSPaul E. McKenney 	 * Any prior manipulation of RCU-protected data must happen
3060e4be81a2SPaul E. McKenney 	 * before the load from ->gp_seq.
3061765a3f4fSPaul E. McKenney 	 */
3062765a3f4fSPaul E. McKenney 	smp_mb();  /* ^^^ */
306316fc9c60SPaul E. McKenney 	return rcu_seq_snap(&rcu_state.gp_seq);
3064765a3f4fSPaul E. McKenney }
3065765a3f4fSPaul E. McKenney EXPORT_SYMBOL_GPL(get_state_synchronize_rcu);
3066765a3f4fSPaul E. McKenney 
3067765a3f4fSPaul E. McKenney /**
3068765a3f4fSPaul E. McKenney  * cond_synchronize_rcu - Conditionally wait for an RCU grace period
3069765a3f4fSPaul E. McKenney  *
3070765a3f4fSPaul E. McKenney  * @oldstate: return value from earlier call to get_state_synchronize_rcu()
3071765a3f4fSPaul E. McKenney  *
3072765a3f4fSPaul E. McKenney  * If a full RCU grace period has elapsed since the earlier call to
3073765a3f4fSPaul E. McKenney  * get_state_synchronize_rcu(), just return.  Otherwise, invoke
3074765a3f4fSPaul E. McKenney  * synchronize_rcu() to wait for a full grace period.
3075765a3f4fSPaul E. McKenney  *
3076765a3f4fSPaul E. McKenney  * Yes, this function does not take counter wrap into account.  But
3077765a3f4fSPaul E. McKenney  * counter wrap is harmless.  If the counter wraps, we have waited for
3078765a3f4fSPaul E. McKenney  * more than 2 billion grace periods (and way more on a 64-bit system!),
3079765a3f4fSPaul E. McKenney  * so waiting for one additional grace period should be just fine.
3080765a3f4fSPaul E. McKenney  */
3081765a3f4fSPaul E. McKenney void cond_synchronize_rcu(unsigned long oldstate)
3082765a3f4fSPaul E. McKenney {
308316fc9c60SPaul E. McKenney 	if (!rcu_seq_done(&rcu_state.gp_seq, oldstate))
3084765a3f4fSPaul E. McKenney 		synchronize_rcu();
3085e4be81a2SPaul E. McKenney 	else
3086e4be81a2SPaul E. McKenney 		smp_mb(); /* Ensure GP ends before subsequent accesses. */
3087765a3f4fSPaul E. McKenney }
3088765a3f4fSPaul E. McKenney EXPORT_SYMBOL_GPL(cond_synchronize_rcu);
3089765a3f4fSPaul E. McKenney 
309024560056SPaul E. McKenney /*
309198ece508SPaul E. McKenney  * Check to see if there is any immediate RCU-related work to be done by
309249918a54SPaul E. McKenney  * the current CPU, returning 1 if so and zero otherwise.  The checks are
309349918a54SPaul E. McKenney  * in order of increasing expense: checks that can be carried out against
309449918a54SPaul E. McKenney  * CPU-local state are performed first.  However, we must check for CPU
309549918a54SPaul E. McKenney  * stalls first, else we might not get a chance.
309624560056SPaul E. McKenney  */
309798ece508SPaul E. McKenney static int rcu_pending(void)
309824560056SPaul E. McKenney {
309998ece508SPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
31004102adabSPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;
31014102adabSPaul E. McKenney 
31024102adabSPaul E. McKenney 	/* Check for CPU stalls, if enabled. */
3103ea12ff2bSPaul E. McKenney 	check_cpu_stall(rdp);
31044102adabSPaul E. McKenney 
3105a096932fSPaul E. McKenney 	/* Is this CPU a NO_HZ_FULL CPU that should ignore RCU? */
31064580b054SPaul E. McKenney 	if (rcu_nohz_full_cpu())
3107a096932fSPaul E. McKenney 		return 0;
3108a096932fSPaul E. McKenney 
31094102adabSPaul E. McKenney 	/* Is the RCU core waiting for a quiescent state from this CPU? */
311001c495f7SPaul E. McKenney 	if (rdp->core_needs_qs && !rdp->cpu_no_qs.b.norm)
31114102adabSPaul E. McKenney 		return 1;
31124102adabSPaul E. McKenney 
31134102adabSPaul E. McKenney 	/* Does this CPU have callbacks ready to invoke? */
311401c495f7SPaul E. McKenney 	if (rcu_segcblist_ready_cbs(&rdp->cblist))
31154102adabSPaul E. McKenney 		return 1;
31164102adabSPaul E. McKenney 
31174102adabSPaul E. McKenney 	/* Has RCU gone idle with this CPU needing another grace period? */
3118de8e8730SPaul E. McKenney 	if (!rcu_gp_in_progress() &&
3119c1935209SPaul E. McKenney 	    rcu_segcblist_is_enabled(&rdp->cblist) &&
3120c1935209SPaul E. McKenney 	    !rcu_segcblist_restempty(&rdp->cblist, RCU_NEXT_READY_TAIL))
31214102adabSPaul E. McKenney 		return 1;
31224102adabSPaul E. McKenney 
312367e14c1eSPaul E. McKenney 	/* Have RCU grace period completed or started?  */
312467e14c1eSPaul E. McKenney 	if (rcu_seq_current(&rnp->gp_seq) != rdp->gp_seq ||
312501c495f7SPaul E. McKenney 	    unlikely(READ_ONCE(rdp->gpwrap))) /* outside lock */
31264102adabSPaul E. McKenney 		return 1;
31274102adabSPaul E. McKenney 
312896d3fd0dSPaul E. McKenney 	/* Does this CPU need a deferred NOCB wakeup? */
312901c495f7SPaul E. McKenney 	if (rcu_nocb_need_deferred_wakeup(rdp))
313096d3fd0dSPaul E. McKenney 		return 1;
313196d3fd0dSPaul E. McKenney 
31324102adabSPaul E. McKenney 	/* nothing to do */
31334102adabSPaul E. McKenney 	return 0;
31344102adabSPaul E. McKenney }
31354102adabSPaul E. McKenney 
31364102adabSPaul E. McKenney /*
3137dd46a788SPaul E. McKenney  * Helper function for rcu_barrier() tracing.  If tracing is disabled,
31384102adabSPaul E. McKenney  * the compiler is expected to optimize this away.
31394102adabSPaul E. McKenney  */
3140dd46a788SPaul E. McKenney static void rcu_barrier_trace(const char *s, int cpu, unsigned long done)
31414102adabSPaul E. McKenney {
31428344b871SPaul E. McKenney 	trace_rcu_barrier(rcu_state.name, s, cpu,
31438344b871SPaul E. McKenney 			  atomic_read(&rcu_state.barrier_cpu_count), done);
31444102adabSPaul E. McKenney }
31454102adabSPaul E. McKenney 
31464102adabSPaul E. McKenney /*
3147dd46a788SPaul E. McKenney  * RCU callback function for rcu_barrier().  If we are last, wake
3148dd46a788SPaul E. McKenney  * up the task executing rcu_barrier().
31494102adabSPaul E. McKenney  */
31504102adabSPaul E. McKenney static void rcu_barrier_callback(struct rcu_head *rhp)
31514102adabSPaul E. McKenney {
3152ec9f5835SPaul E. McKenney 	if (atomic_dec_and_test(&rcu_state.barrier_cpu_count)) {
3153dd46a788SPaul E. McKenney 		rcu_barrier_trace(TPS("LastCB"), -1,
3154ec9f5835SPaul E. McKenney 				   rcu_state.barrier_sequence);
3155ec9f5835SPaul E. McKenney 		complete(&rcu_state.barrier_completion);
31564102adabSPaul E. McKenney 	} else {
3157dd46a788SPaul E. McKenney 		rcu_barrier_trace(TPS("CB"), -1, rcu_state.barrier_sequence);
31584102adabSPaul E. McKenney 	}
31594102adabSPaul E. McKenney }
31604102adabSPaul E. McKenney 
31614102adabSPaul E. McKenney /*
31624102adabSPaul E. McKenney  * Called with preemption disabled, and from cross-cpu IRQ context.
31634102adabSPaul E. McKenney  */
3164ec9f5835SPaul E. McKenney static void rcu_barrier_func(void *unused)
31654102adabSPaul E. McKenney {
3166da1df50dSPaul E. McKenney 	struct rcu_data *rdp = raw_cpu_ptr(&rcu_data);
31674102adabSPaul E. McKenney 
3168dd46a788SPaul E. McKenney 	rcu_barrier_trace(TPS("IRQ"), -1, rcu_state.barrier_sequence);
3169f92c734fSPaul E. McKenney 	rdp->barrier_head.func = rcu_barrier_callback;
3170f92c734fSPaul E. McKenney 	debug_rcu_head_queue(&rdp->barrier_head);
3171f92c734fSPaul E. McKenney 	if (rcu_segcblist_entrain(&rdp->cblist, &rdp->barrier_head, 0)) {
3172ec9f5835SPaul E. McKenney 		atomic_inc(&rcu_state.barrier_cpu_count);
3173f92c734fSPaul E. McKenney 	} else {
3174f92c734fSPaul E. McKenney 		debug_rcu_head_unqueue(&rdp->barrier_head);
3175dd46a788SPaul E. McKenney 		rcu_barrier_trace(TPS("IRQNQ"), -1,
3176ec9f5835SPaul E. McKenney 				   rcu_state.barrier_sequence);
3177f92c734fSPaul E. McKenney 	}
31784102adabSPaul E. McKenney }
31794102adabSPaul E. McKenney 
3180dd46a788SPaul E. McKenney /**
3181dd46a788SPaul E. McKenney  * rcu_barrier - Wait until all in-flight call_rcu() callbacks complete.
3182dd46a788SPaul E. McKenney  *
3183dd46a788SPaul E. McKenney  * Note that this primitive does not necessarily wait for an RCU grace period
3184dd46a788SPaul E. McKenney  * to complete.  For example, if there are no RCU callbacks queued anywhere
3185dd46a788SPaul E. McKenney  * in the system, then rcu_barrier() is within its rights to return
3186dd46a788SPaul E. McKenney  * immediately, without waiting for anything, much less an RCU grace period.
31874102adabSPaul E. McKenney  */
3188dd46a788SPaul E. McKenney void rcu_barrier(void)
31894102adabSPaul E. McKenney {
31904102adabSPaul E. McKenney 	int cpu;
31914102adabSPaul E. McKenney 	struct rcu_data *rdp;
3192ec9f5835SPaul E. McKenney 	unsigned long s = rcu_seq_snap(&rcu_state.barrier_sequence);
31934102adabSPaul E. McKenney 
3194dd46a788SPaul E. McKenney 	rcu_barrier_trace(TPS("Begin"), -1, s);
31954102adabSPaul E. McKenney 
31964102adabSPaul E. McKenney 	/* Take mutex to serialize concurrent rcu_barrier() requests. */
3197ec9f5835SPaul E. McKenney 	mutex_lock(&rcu_state.barrier_mutex);
31984102adabSPaul E. McKenney 
31994f525a52SPaul E. McKenney 	/* Did someone else do our work for us? */
3200ec9f5835SPaul E. McKenney 	if (rcu_seq_done(&rcu_state.barrier_sequence, s)) {
3201dd46a788SPaul E. McKenney 		rcu_barrier_trace(TPS("EarlyExit"), -1,
3202ec9f5835SPaul E. McKenney 				   rcu_state.barrier_sequence);
32034102adabSPaul E. McKenney 		smp_mb(); /* caller's subsequent code after above check. */
3204ec9f5835SPaul E. McKenney 		mutex_unlock(&rcu_state.barrier_mutex);
32054102adabSPaul E. McKenney 		return;
32064102adabSPaul E. McKenney 	}
32074102adabSPaul E. McKenney 
32084f525a52SPaul E. McKenney 	/* Mark the start of the barrier operation. */
3209ec9f5835SPaul E. McKenney 	rcu_seq_start(&rcu_state.barrier_sequence);
3210dd46a788SPaul E. McKenney 	rcu_barrier_trace(TPS("Inc1"), -1, rcu_state.barrier_sequence);
32114102adabSPaul E. McKenney 
32124102adabSPaul E. McKenney 	/*
32134102adabSPaul E. McKenney 	 * Initialize the count to one rather than to zero in order to
32144102adabSPaul E. McKenney 	 * avoid a too-soon return to zero in case of a short grace period
32154102adabSPaul E. McKenney 	 * (or preemption of this task).  Exclude CPU-hotplug operations
32164102adabSPaul E. McKenney 	 * to ensure that no offline CPU has callbacks queued.
32174102adabSPaul E. McKenney 	 */
3218ec9f5835SPaul E. McKenney 	init_completion(&rcu_state.barrier_completion);
3219ec9f5835SPaul E. McKenney 	atomic_set(&rcu_state.barrier_cpu_count, 1);
32204102adabSPaul E. McKenney 	get_online_cpus();
32214102adabSPaul E. McKenney 
32224102adabSPaul E. McKenney 	/*
32234102adabSPaul E. McKenney 	 * Force each CPU with callbacks to register a new callback.
32244102adabSPaul E. McKenney 	 * When that callback is invoked, we will know that all of the
32254102adabSPaul E. McKenney 	 * corresponding CPU's preceding callbacks have been invoked.
32264102adabSPaul E. McKenney 	 */
32274102adabSPaul E. McKenney 	for_each_possible_cpu(cpu) {
32284102adabSPaul E. McKenney 		if (!cpu_online(cpu) && !rcu_is_nocb_cpu(cpu))
32294102adabSPaul E. McKenney 			continue;
3230da1df50dSPaul E. McKenney 		rdp = per_cpu_ptr(&rcu_data, cpu);
32314102adabSPaul E. McKenney 		if (rcu_is_nocb_cpu(cpu)) {
32324580b054SPaul E. McKenney 			if (!rcu_nocb_cpu_needs_barrier(cpu)) {
3233dd46a788SPaul E. McKenney 				rcu_barrier_trace(TPS("OfflineNoCB"), cpu,
3234ec9f5835SPaul E. McKenney 						   rcu_state.barrier_sequence);
3235d7e29933SPaul E. McKenney 			} else {
3236dd46a788SPaul E. McKenney 				rcu_barrier_trace(TPS("OnlineNoCB"), cpu,
3237ec9f5835SPaul E. McKenney 						   rcu_state.barrier_sequence);
323841050a00SPaul E. McKenney 				smp_mb__before_atomic();
3239ec9f5835SPaul E. McKenney 				atomic_inc(&rcu_state.barrier_cpu_count);
3240d7e29933SPaul E. McKenney 				__call_rcu(&rdp->barrier_head,
32415c7d8967SPaul E. McKenney 					   rcu_barrier_callback, cpu, 0);
3242d7e29933SPaul E. McKenney 			}
324315fecf89SPaul E. McKenney 		} else if (rcu_segcblist_n_cbs(&rdp->cblist)) {
3244dd46a788SPaul E. McKenney 			rcu_barrier_trace(TPS("OnlineQ"), cpu,
3245ec9f5835SPaul E. McKenney 					   rcu_state.barrier_sequence);
3246ec9f5835SPaul E. McKenney 			smp_call_function_single(cpu, rcu_barrier_func, NULL, 1);
32474102adabSPaul E. McKenney 		} else {
3248dd46a788SPaul E. McKenney 			rcu_barrier_trace(TPS("OnlineNQ"), cpu,
3249ec9f5835SPaul E. McKenney 					   rcu_state.barrier_sequence);
32504102adabSPaul E. McKenney 		}
32514102adabSPaul E. McKenney 	}
32524102adabSPaul E. McKenney 	put_online_cpus();
32534102adabSPaul E. McKenney 
32544102adabSPaul E. McKenney 	/*
32554102adabSPaul E. McKenney 	 * Now that we have an rcu_barrier_callback() callback on each
32564102adabSPaul E. McKenney 	 * CPU, and thus each counted, remove the initial count.
32574102adabSPaul E. McKenney 	 */
3258ec9f5835SPaul E. McKenney 	if (atomic_dec_and_test(&rcu_state.barrier_cpu_count))
3259ec9f5835SPaul E. McKenney 		complete(&rcu_state.barrier_completion);
32604102adabSPaul E. McKenney 
32614102adabSPaul E. McKenney 	/* Wait for all rcu_barrier_callback() callbacks to be invoked. */
3262ec9f5835SPaul E. McKenney 	wait_for_completion(&rcu_state.barrier_completion);
32634102adabSPaul E. McKenney 
32644f525a52SPaul E. McKenney 	/* Mark the end of the barrier operation. */
3265dd46a788SPaul E. McKenney 	rcu_barrier_trace(TPS("Inc2"), -1, rcu_state.barrier_sequence);
3266ec9f5835SPaul E. McKenney 	rcu_seq_end(&rcu_state.barrier_sequence);
32674f525a52SPaul E. McKenney 
32684102adabSPaul E. McKenney 	/* Other rcu_barrier() invocations can now safely proceed. */
3269ec9f5835SPaul E. McKenney 	mutex_unlock(&rcu_state.barrier_mutex);
32704102adabSPaul E. McKenney }
327145975c7dSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_barrier);
32724102adabSPaul E. McKenney 
32734102adabSPaul E. McKenney /*
32740aa04b05SPaul E. McKenney  * Propagate ->qsinitmask bits up the rcu_node tree to account for the
32750aa04b05SPaul E. McKenney  * first CPU in a given leaf rcu_node structure coming online.  The caller
32760aa04b05SPaul E. McKenney  * must hold the corresponding leaf rcu_node ->lock with interrrupts
32770aa04b05SPaul E. McKenney  * disabled.
32780aa04b05SPaul E. McKenney  */
32790aa04b05SPaul E. McKenney static void rcu_init_new_rnp(struct rcu_node *rnp_leaf)
32800aa04b05SPaul E. McKenney {
32810aa04b05SPaul E. McKenney 	long mask;
32828d672fa6SPaul E. McKenney 	long oldmask;
32830aa04b05SPaul E. McKenney 	struct rcu_node *rnp = rnp_leaf;
32840aa04b05SPaul E. McKenney 
32858d672fa6SPaul E. McKenney 	raw_lockdep_assert_held_rcu_node(rnp_leaf);
3286962aff03SPaul E. McKenney 	WARN_ON_ONCE(rnp->wait_blkd_tasks);
32870aa04b05SPaul E. McKenney 	for (;;) {
32880aa04b05SPaul E. McKenney 		mask = rnp->grpmask;
32890aa04b05SPaul E. McKenney 		rnp = rnp->parent;
32900aa04b05SPaul E. McKenney 		if (rnp == NULL)
32910aa04b05SPaul E. McKenney 			return;
32926cf10081SPaul E. McKenney 		raw_spin_lock_rcu_node(rnp); /* Interrupts already disabled. */
32938d672fa6SPaul E. McKenney 		oldmask = rnp->qsmaskinit;
32940aa04b05SPaul E. McKenney 		rnp->qsmaskinit |= mask;
329567c583a7SBoqun Feng 		raw_spin_unlock_rcu_node(rnp); /* Interrupts remain disabled. */
32968d672fa6SPaul E. McKenney 		if (oldmask)
32978d672fa6SPaul E. McKenney 			return;
32980aa04b05SPaul E. McKenney 	}
32990aa04b05SPaul E. McKenney }
33000aa04b05SPaul E. McKenney 
33010aa04b05SPaul E. McKenney /*
33024102adabSPaul E. McKenney  * Do boot-time initialization of a CPU's per-CPU RCU data.
33034102adabSPaul E. McKenney  */
33044102adabSPaul E. McKenney static void __init
330553b46303SPaul E. McKenney rcu_boot_init_percpu_data(int cpu)
33064102adabSPaul E. McKenney {
3307da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
33084102adabSPaul E. McKenney 
33094102adabSPaul E. McKenney 	/* Set up local state, ensuring consistent view of global state. */
3310bc75e999SMark Rutland 	rdp->grpmask = leaf_node_cpu_bit(rdp->mynode, cpu);
33114c5273bfSPaul E. McKenney 	WARN_ON_ONCE(rdp->dynticks_nesting != 1);
3312dc5a4f29SPaul E. McKenney 	WARN_ON_ONCE(rcu_dynticks_in_eqs(rcu_dynticks_snap(rdp)));
331353b46303SPaul E. McKenney 	rdp->rcu_ofl_gp_seq = rcu_state.gp_seq;
331457738942SPaul E. McKenney 	rdp->rcu_ofl_gp_flags = RCU_GP_CLEANED;
331553b46303SPaul E. McKenney 	rdp->rcu_onl_gp_seq = rcu_state.gp_seq;
331657738942SPaul E. McKenney 	rdp->rcu_onl_gp_flags = RCU_GP_CLEANED;
33174102adabSPaul E. McKenney 	rdp->cpu = cpu;
33184102adabSPaul E. McKenney 	rcu_boot_init_nocb_percpu_data(rdp);
33194102adabSPaul E. McKenney }
33204102adabSPaul E. McKenney 
33214102adabSPaul E. McKenney /*
332253b46303SPaul E. McKenney  * Invoked early in the CPU-online process, when pretty much all services
332353b46303SPaul E. McKenney  * are available.  The incoming CPU is not present.
332453b46303SPaul E. McKenney  *
332553b46303SPaul E. McKenney  * Initializes a CPU's per-CPU RCU data.  Note that only one online or
3326ff3bb6f4SPaul E. McKenney  * offline event can be happening at a given time.  Note also that we can
3327ff3bb6f4SPaul E. McKenney  * accept some slop in the rsp->gp_seq access due to the fact that this
3328ff3bb6f4SPaul E. McKenney  * CPU cannot possibly have any RCU callbacks in flight yet.
33294102adabSPaul E. McKenney  */
333053b46303SPaul E. McKenney int rcutree_prepare_cpu(unsigned int cpu)
33314102adabSPaul E. McKenney {
33324102adabSPaul E. McKenney 	unsigned long flags;
3333da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
3334336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
33354102adabSPaul E. McKenney 
33364102adabSPaul E. McKenney 	/* Set up local state, ensuring consistent view of global state. */
33376cf10081SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
33384102adabSPaul E. McKenney 	rdp->qlen_last_fqs_check = 0;
333953b46303SPaul E. McKenney 	rdp->n_force_qs_snap = rcu_state.n_force_qs;
33404102adabSPaul E. McKenney 	rdp->blimit = blimit;
334115fecf89SPaul E. McKenney 	if (rcu_segcblist_empty(&rdp->cblist) && /* No early-boot CBs? */
334215fecf89SPaul E. McKenney 	    !init_nocb_callback_list(rdp))
334315fecf89SPaul E. McKenney 		rcu_segcblist_init(&rdp->cblist);  /* Re-enable callbacks. */
33444c5273bfSPaul E. McKenney 	rdp->dynticks_nesting = 1;	/* CPU not up, no tearing. */
33452625d469SPaul E. McKenney 	rcu_dynticks_eqs_online();
334667c583a7SBoqun Feng 	raw_spin_unlock_rcu_node(rnp);		/* irqs remain disabled. */
33474102adabSPaul E. McKenney 
33480aa04b05SPaul E. McKenney 	/*
33490aa04b05SPaul E. McKenney 	 * Add CPU to leaf rcu_node pending-online bitmask.  Any needed
33500aa04b05SPaul E. McKenney 	 * propagation up the rcu_node tree will happen at the beginning
33510aa04b05SPaul E. McKenney 	 * of the next grace period.
33520aa04b05SPaul E. McKenney 	 */
33534102adabSPaul E. McKenney 	rnp = rdp->mynode;
33542a67e741SPeter Zijlstra 	raw_spin_lock_rcu_node(rnp);		/* irqs already disabled. */
3355b9585e94SPaul E. McKenney 	rdp->beenonline = true;	 /* We have now been online. */
3356de30ad51SPaul E. McKenney 	rdp->gp_seq = rnp->gp_seq;
33577a1d0f23SPaul E. McKenney 	rdp->gp_seq_needed = rnp->gp_seq;
33585b74c458SPaul E. McKenney 	rdp->cpu_no_qs.b.norm = true;
335997c668b8SPaul E. McKenney 	rdp->core_needs_qs = false;
33609b9500daSPaul E. McKenney 	rdp->rcu_iw_pending = false;
33618aa670cdSPaul E. McKenney 	rdp->rcu_iw_gp_seq = rnp->gp_seq - 1;
336253b46303SPaul E. McKenney 	trace_rcu_grace_period(rcu_state.name, rdp->gp_seq, TPS("cpuonl"));
336367c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
33644df83742SThomas Gleixner 	rcu_prepare_kthreads(cpu);
3365ad368d15SPaul E. McKenney 	rcu_spawn_cpu_nocb_kthread(cpu);
33664df83742SThomas Gleixner 
33674df83742SThomas Gleixner 	return 0;
33684df83742SThomas Gleixner }
33694df83742SThomas Gleixner 
3370deb34f36SPaul E. McKenney /*
3371deb34f36SPaul E. McKenney  * Update RCU priority boot kthread affinity for CPU-hotplug changes.
3372deb34f36SPaul E. McKenney  */
33734df83742SThomas Gleixner static void rcutree_affinity_setting(unsigned int cpu, int outgoing)
33744df83742SThomas Gleixner {
3375da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
33764df83742SThomas Gleixner 
33774df83742SThomas Gleixner 	rcu_boost_kthread_setaffinity(rdp->mynode, outgoing);
33784df83742SThomas Gleixner }
33794df83742SThomas Gleixner 
3380deb34f36SPaul E. McKenney /*
3381deb34f36SPaul E. McKenney  * Near the end of the CPU-online process.  Pretty much all services
3382deb34f36SPaul E. McKenney  * enabled, and the CPU is now very much alive.
3383deb34f36SPaul E. McKenney  */
33844df83742SThomas Gleixner int rcutree_online_cpu(unsigned int cpu)
33854df83742SThomas Gleixner {
33869b9500daSPaul E. McKenney 	unsigned long flags;
33879b9500daSPaul E. McKenney 	struct rcu_data *rdp;
33889b9500daSPaul E. McKenney 	struct rcu_node *rnp;
33899b9500daSPaul E. McKenney 
3390da1df50dSPaul E. McKenney 	rdp = per_cpu_ptr(&rcu_data, cpu);
33919b9500daSPaul E. McKenney 	rnp = rdp->mynode;
33929b9500daSPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
33939b9500daSPaul E. McKenney 	rnp->ffmask |= rdp->grpmask;
33949b9500daSPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
33959b9500daSPaul E. McKenney 	if (rcu_scheduler_active == RCU_SCHEDULER_INACTIVE)
33969b9500daSPaul E. McKenney 		return 0; /* Too early in boot for scheduler work. */
33979b9500daSPaul E. McKenney 	sync_sched_exp_online_cleanup(cpu);
33989b9500daSPaul E. McKenney 	rcutree_affinity_setting(cpu, -1);
33994df83742SThomas Gleixner 	return 0;
34004df83742SThomas Gleixner }
34014df83742SThomas Gleixner 
3402deb34f36SPaul E. McKenney /*
3403deb34f36SPaul E. McKenney  * Near the beginning of the process.  The CPU is still very much alive
3404deb34f36SPaul E. McKenney  * with pretty much all services enabled.
3405deb34f36SPaul E. McKenney  */
34064df83742SThomas Gleixner int rcutree_offline_cpu(unsigned int cpu)
34074df83742SThomas Gleixner {
34089b9500daSPaul E. McKenney 	unsigned long flags;
34099b9500daSPaul E. McKenney 	struct rcu_data *rdp;
34109b9500daSPaul E. McKenney 	struct rcu_node *rnp;
34119b9500daSPaul E. McKenney 
3412da1df50dSPaul E. McKenney 	rdp = per_cpu_ptr(&rcu_data, cpu);
34139b9500daSPaul E. McKenney 	rnp = rdp->mynode;
34149b9500daSPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
34159b9500daSPaul E. McKenney 	rnp->ffmask &= ~rdp->grpmask;
34169b9500daSPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
34179b9500daSPaul E. McKenney 
34184df83742SThomas Gleixner 	rcutree_affinity_setting(cpu, cpu);
34194df83742SThomas Gleixner 	return 0;
34204df83742SThomas Gleixner }
34214df83742SThomas Gleixner 
3422f64c6013SPeter Zijlstra static DEFINE_PER_CPU(int, rcu_cpu_started);
3423f64c6013SPeter Zijlstra 
34247ec99de3SPaul E. McKenney /*
34257ec99de3SPaul E. McKenney  * Mark the specified CPU as being online so that subsequent grace periods
34267ec99de3SPaul E. McKenney  * (both expedited and normal) will wait on it.  Note that this means that
34277ec99de3SPaul E. McKenney  * incoming CPUs are not allowed to use RCU read-side critical sections
34287ec99de3SPaul E. McKenney  * until this function is called.  Failing to observe this restriction
34297ec99de3SPaul E. McKenney  * will result in lockdep splats.
3430deb34f36SPaul E. McKenney  *
3431deb34f36SPaul E. McKenney  * Note that this function is special in that it is invoked directly
3432deb34f36SPaul E. McKenney  * from the incoming CPU rather than from the cpuhp_step mechanism.
3433deb34f36SPaul E. McKenney  * This is because this function must be invoked at a precise location.
34347ec99de3SPaul E. McKenney  */
34357ec99de3SPaul E. McKenney void rcu_cpu_starting(unsigned int cpu)
34367ec99de3SPaul E. McKenney {
34377ec99de3SPaul E. McKenney 	unsigned long flags;
34387ec99de3SPaul E. McKenney 	unsigned long mask;
3439313517fcSPaul E. McKenney 	int nbits;
3440313517fcSPaul E. McKenney 	unsigned long oldmask;
34417ec99de3SPaul E. McKenney 	struct rcu_data *rdp;
34427ec99de3SPaul E. McKenney 	struct rcu_node *rnp;
34437ec99de3SPaul E. McKenney 
3444f64c6013SPeter Zijlstra 	if (per_cpu(rcu_cpu_started, cpu))
3445f64c6013SPeter Zijlstra 		return;
3446f64c6013SPeter Zijlstra 
3447f64c6013SPeter Zijlstra 	per_cpu(rcu_cpu_started, cpu) = 1;
3448f64c6013SPeter Zijlstra 
3449da1df50dSPaul E. McKenney 	rdp = per_cpu_ptr(&rcu_data, cpu);
34507ec99de3SPaul E. McKenney 	rnp = rdp->mynode;
34517ec99de3SPaul E. McKenney 	mask = rdp->grpmask;
34527ec99de3SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
34537ec99de3SPaul E. McKenney 	rnp->qsmaskinitnext |= mask;
3454313517fcSPaul E. McKenney 	oldmask = rnp->expmaskinitnext;
34557ec99de3SPaul E. McKenney 	rnp->expmaskinitnext |= mask;
3456313517fcSPaul E. McKenney 	oldmask ^= rnp->expmaskinitnext;
3457313517fcSPaul E. McKenney 	nbits = bitmap_weight(&oldmask, BITS_PER_LONG);
3458313517fcSPaul E. McKenney 	/* Allow lockless access for expedited grace periods. */
3459eb7a6653SPaul E. McKenney 	smp_store_release(&rcu_state.ncpus, rcu_state.ncpus + nbits); /* ^^^ */
3460e05121baSPaul E. McKenney 	rcu_gpnum_ovf(rnp, rdp); /* Offline-induced counter wrap? */
3461eb7a6653SPaul E. McKenney 	rdp->rcu_onl_gp_seq = READ_ONCE(rcu_state.gp_seq);
3462eb7a6653SPaul E. McKenney 	rdp->rcu_onl_gp_flags = READ_ONCE(rcu_state.gp_flags);
346399990da1SPaul E. McKenney 	if (rnp->qsmask & mask) { /* RCU waiting on incoming CPU? */
346499990da1SPaul E. McKenney 		/* Report QS -after- changing ->qsmaskinitnext! */
3465b50912d0SPaul E. McKenney 		rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
346699990da1SPaul E. McKenney 	} else {
34677ec99de3SPaul E. McKenney 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
34687ec99de3SPaul E. McKenney 	}
3469313517fcSPaul E. McKenney 	smp_mb(); /* Ensure RCU read-side usage follows above initialization. */
34707ec99de3SPaul E. McKenney }
34717ec99de3SPaul E. McKenney 
347227d50c7eSThomas Gleixner #ifdef CONFIG_HOTPLUG_CPU
347327d50c7eSThomas Gleixner /*
3474deb34f36SPaul E. McKenney  * The outgoing function has no further need of RCU, so remove it from
347553b46303SPaul E. McKenney  * the rcu_node tree's ->qsmaskinitnext bit masks.
3476deb34f36SPaul E. McKenney  *
3477deb34f36SPaul E. McKenney  * Note that this function is special in that it is invoked directly
3478deb34f36SPaul E. McKenney  * from the outgoing CPU rather than from the cpuhp_step mechanism.
3479deb34f36SPaul E. McKenney  * This is because this function must be invoked at a precise location.
3480deb34f36SPaul E. McKenney  */
348127d50c7eSThomas Gleixner void rcu_report_dead(unsigned int cpu)
348227d50c7eSThomas Gleixner {
348353b46303SPaul E. McKenney 	unsigned long flags;
348453b46303SPaul E. McKenney 	unsigned long mask;
348553b46303SPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
348653b46303SPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;  /* Outgoing CPU's rdp & rnp. */
348727d50c7eSThomas Gleixner 
348849918a54SPaul E. McKenney 	/* QS for any half-done expedited grace period. */
348927d50c7eSThomas Gleixner 	preempt_disable();
349063d4c8c9SPaul E. McKenney 	rcu_report_exp_rdp(this_cpu_ptr(&rcu_data));
349127d50c7eSThomas Gleixner 	preempt_enable();
34923e310098SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
349353b46303SPaul E. McKenney 
349453b46303SPaul E. McKenney 	/* Remove outgoing CPU from mask in the leaf rcu_node structure. */
349553b46303SPaul E. McKenney 	mask = rdp->grpmask;
3496894d45bbSMike Galbraith 	raw_spin_lock(&rcu_state.ofl_lock);
349753b46303SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags); /* Enforce GP memory-order guarantee. */
349853b46303SPaul E. McKenney 	rdp->rcu_ofl_gp_seq = READ_ONCE(rcu_state.gp_seq);
349953b46303SPaul E. McKenney 	rdp->rcu_ofl_gp_flags = READ_ONCE(rcu_state.gp_flags);
350053b46303SPaul E. McKenney 	if (rnp->qsmask & mask) { /* RCU waiting on outgoing CPU? */
350153b46303SPaul E. McKenney 		/* Report quiescent state -before- changing ->qsmaskinitnext! */
350253b46303SPaul E. McKenney 		rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
350353b46303SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
350453b46303SPaul E. McKenney 	}
350553b46303SPaul E. McKenney 	rnp->qsmaskinitnext &= ~mask;
350653b46303SPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
3507894d45bbSMike Galbraith 	raw_spin_unlock(&rcu_state.ofl_lock);
3508f64c6013SPeter Zijlstra 
3509f64c6013SPeter Zijlstra 	per_cpu(rcu_cpu_started, cpu) = 0;
351027d50c7eSThomas Gleixner }
3511a58163d8SPaul E. McKenney 
351253b46303SPaul E. McKenney /*
351353b46303SPaul E. McKenney  * The outgoing CPU has just passed through the dying-idle state, and we
351453b46303SPaul E. McKenney  * are being invoked from the CPU that was IPIed to continue the offline
351553b46303SPaul E. McKenney  * operation.  Migrate the outgoing CPU's callbacks to the current CPU.
351653b46303SPaul E. McKenney  */
351753b46303SPaul E. McKenney void rcutree_migrate_callbacks(int cpu)
3518a58163d8SPaul E. McKenney {
3519a58163d8SPaul E. McKenney 	unsigned long flags;
3520b1a2d79fSPaul E. McKenney 	struct rcu_data *my_rdp;
3521da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
3522336a4f6cSPaul E. McKenney 	struct rcu_node *rnp_root = rcu_get_root();
3523ec4eacceSPaul E. McKenney 	bool needwake;
3524a58163d8SPaul E. McKenney 
352595335c03SPaul E. McKenney 	if (rcu_is_nocb_cpu(cpu) || rcu_segcblist_empty(&rdp->cblist))
352695335c03SPaul E. McKenney 		return;  /* No callbacks to migrate. */
352795335c03SPaul E. McKenney 
3528b1a2d79fSPaul E. McKenney 	local_irq_save(flags);
3529da1df50dSPaul E. McKenney 	my_rdp = this_cpu_ptr(&rcu_data);
3530b1a2d79fSPaul E. McKenney 	if (rcu_nocb_adopt_orphan_cbs(my_rdp, rdp, flags)) {
3531b1a2d79fSPaul E. McKenney 		local_irq_restore(flags);
3532b1a2d79fSPaul E. McKenney 		return;
3533b1a2d79fSPaul E. McKenney 	}
35349fa46fb8SPaul E. McKenney 	raw_spin_lock_rcu_node(rnp_root); /* irqs already disabled. */
3535ec4eacceSPaul E. McKenney 	/* Leverage recent GPs and set GP for new callbacks. */
3536834f56bfSPaul E. McKenney 	needwake = rcu_advance_cbs(rnp_root, rdp) ||
3537834f56bfSPaul E. McKenney 		   rcu_advance_cbs(rnp_root, my_rdp);
3538f2dbe4a5SPaul E. McKenney 	rcu_segcblist_merge(&my_rdp->cblist, &rdp->cblist);
353909efeeeeSPaul E. McKenney 	WARN_ON_ONCE(rcu_segcblist_empty(&my_rdp->cblist) !=
354009efeeeeSPaul E. McKenney 		     !rcu_segcblist_n_cbs(&my_rdp->cblist));
3541537b85c8SPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp_root, flags);
3542ec4eacceSPaul E. McKenney 	if (needwake)
3543532c00c9SPaul E. McKenney 		rcu_gp_kthread_wake();
3544a58163d8SPaul E. McKenney 	WARN_ONCE(rcu_segcblist_n_cbs(&rdp->cblist) != 0 ||
3545a58163d8SPaul E. McKenney 		  !rcu_segcblist_empty(&rdp->cblist),
3546a58163d8SPaul E. McKenney 		  "rcu_cleanup_dead_cpu: Callbacks on offline CPU %d: qlen=%lu, 1stCB=%p\n",
3547a58163d8SPaul E. McKenney 		  cpu, rcu_segcblist_n_cbs(&rdp->cblist),
3548a58163d8SPaul E. McKenney 		  rcu_segcblist_first_cb(&rdp->cblist));
3549a58163d8SPaul E. McKenney }
355027d50c7eSThomas Gleixner #endif
355127d50c7eSThomas Gleixner 
3552deb34f36SPaul E. McKenney /*
3553deb34f36SPaul E. McKenney  * On non-huge systems, use expedited RCU grace periods to make suspend
3554deb34f36SPaul E. McKenney  * and hibernation run faster.
3555deb34f36SPaul E. McKenney  */
35564102adabSPaul E. McKenney static int rcu_pm_notify(struct notifier_block *self,
35574102adabSPaul E. McKenney 			 unsigned long action, void *hcpu)
35584102adabSPaul E. McKenney {
35594102adabSPaul E. McKenney 	switch (action) {
35604102adabSPaul E. McKenney 	case PM_HIBERNATION_PREPARE:
35614102adabSPaul E. McKenney 	case PM_SUSPEND_PREPARE:
35624102adabSPaul E. McKenney 		if (nr_cpu_ids <= 256) /* Expediting bad for large systems. */
35635afff48bSPaul E. McKenney 			rcu_expedite_gp();
35644102adabSPaul E. McKenney 		break;
35654102adabSPaul E. McKenney 	case PM_POST_HIBERNATION:
35664102adabSPaul E. McKenney 	case PM_POST_SUSPEND:
35675afff48bSPaul E. McKenney 		if (nr_cpu_ids <= 256) /* Expediting bad for large systems. */
35685afff48bSPaul E. McKenney 			rcu_unexpedite_gp();
35694102adabSPaul E. McKenney 		break;
35704102adabSPaul E. McKenney 	default:
35714102adabSPaul E. McKenney 		break;
35724102adabSPaul E. McKenney 	}
35734102adabSPaul E. McKenney 	return NOTIFY_OK;
35744102adabSPaul E. McKenney }
35754102adabSPaul E. McKenney 
35764102adabSPaul E. McKenney /*
357749918a54SPaul E. McKenney  * Spawn the kthreads that handle RCU's grace periods.
35784102adabSPaul E. McKenney  */
35794102adabSPaul E. McKenney static int __init rcu_spawn_gp_kthread(void)
35804102adabSPaul E. McKenney {
35814102adabSPaul E. McKenney 	unsigned long flags;
3582a94844b2SPaul E. McKenney 	int kthread_prio_in = kthread_prio;
35834102adabSPaul E. McKenney 	struct rcu_node *rnp;
3584a94844b2SPaul E. McKenney 	struct sched_param sp;
35854102adabSPaul E. McKenney 	struct task_struct *t;
35864102adabSPaul E. McKenney 
3587a94844b2SPaul E. McKenney 	/* Force priority into range. */
3588c7cd161eSJoel Fernandes (Google) 	if (IS_ENABLED(CONFIG_RCU_BOOST) && kthread_prio < 2
3589c7cd161eSJoel Fernandes (Google) 	    && IS_BUILTIN(CONFIG_RCU_TORTURE_TEST))
3590c7cd161eSJoel Fernandes (Google) 		kthread_prio = 2;
3591c7cd161eSJoel Fernandes (Google) 	else if (IS_ENABLED(CONFIG_RCU_BOOST) && kthread_prio < 1)
3592a94844b2SPaul E. McKenney 		kthread_prio = 1;
3593a94844b2SPaul E. McKenney 	else if (kthread_prio < 0)
3594a94844b2SPaul E. McKenney 		kthread_prio = 0;
3595a94844b2SPaul E. McKenney 	else if (kthread_prio > 99)
3596a94844b2SPaul E. McKenney 		kthread_prio = 99;
3597c7cd161eSJoel Fernandes (Google) 
3598a94844b2SPaul E. McKenney 	if (kthread_prio != kthread_prio_in)
3599a94844b2SPaul E. McKenney 		pr_alert("rcu_spawn_gp_kthread(): Limited prio to %d from %d\n",
3600a94844b2SPaul E. McKenney 			 kthread_prio, kthread_prio_in);
3601a94844b2SPaul E. McKenney 
36029386c0b7SPaul E. McKenney 	rcu_scheduler_fully_active = 1;
3603b97d23c5SPaul E. McKenney 	t = kthread_create(rcu_gp_kthread, NULL, "%s", rcu_state.name);
360408543bdaSPaul E. McKenney 	if (WARN_ONCE(IS_ERR(t), "%s: Could not start grace-period kthread, OOM is now expected behavior\n", __func__))
360508543bdaSPaul E. McKenney 		return 0;
3606336a4f6cSPaul E. McKenney 	rnp = rcu_get_root();
36076cf10081SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
3608b97d23c5SPaul E. McKenney 	rcu_state.gp_kthread = t;
3609a94844b2SPaul E. McKenney 	if (kthread_prio) {
3610a94844b2SPaul E. McKenney 		sp.sched_priority = kthread_prio;
3611a94844b2SPaul E. McKenney 		sched_setscheduler_nocheck(t, SCHED_FIFO, &sp);
3612a94844b2SPaul E. McKenney 	}
361367c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
3614e11f1335SPeter Zijlstra 	wake_up_process(t);
361535ce7f29SPaul E. McKenney 	rcu_spawn_nocb_kthreads();
36169386c0b7SPaul E. McKenney 	rcu_spawn_boost_kthreads();
36174102adabSPaul E. McKenney 	return 0;
36184102adabSPaul E. McKenney }
36194102adabSPaul E. McKenney early_initcall(rcu_spawn_gp_kthread);
36204102adabSPaul E. McKenney 
36214102adabSPaul E. McKenney /*
362252d7e48bSPaul E. McKenney  * This function is invoked towards the end of the scheduler's
362352d7e48bSPaul E. McKenney  * initialization process.  Before this is called, the idle task might
362452d7e48bSPaul E. McKenney  * contain synchronous grace-period primitives (during which time, this idle
362552d7e48bSPaul E. McKenney  * task is booting the system, and such primitives are no-ops).  After this
362652d7e48bSPaul E. McKenney  * function is called, any synchronous grace-period primitives are run as
362752d7e48bSPaul E. McKenney  * expedited, with the requesting task driving the grace period forward.
3628900b1028SPaul E. McKenney  * A later core_initcall() rcu_set_runtime_mode() will switch to full
362952d7e48bSPaul E. McKenney  * runtime RCU functionality.
36304102adabSPaul E. McKenney  */
36314102adabSPaul E. McKenney void rcu_scheduler_starting(void)
36324102adabSPaul E. McKenney {
36334102adabSPaul E. McKenney 	WARN_ON(num_online_cpus() != 1);
36344102adabSPaul E. McKenney 	WARN_ON(nr_context_switches() > 0);
363552d7e48bSPaul E. McKenney 	rcu_test_sync_prims();
363652d7e48bSPaul E. McKenney 	rcu_scheduler_active = RCU_SCHEDULER_INIT;
363752d7e48bSPaul E. McKenney 	rcu_test_sync_prims();
36384102adabSPaul E. McKenney }
36394102adabSPaul E. McKenney 
36404102adabSPaul E. McKenney /*
364149918a54SPaul E. McKenney  * Helper function for rcu_init() that initializes the rcu_state structure.
36424102adabSPaul E. McKenney  */
3643b8bb1f63SPaul E. McKenney static void __init rcu_init_one(void)
36444102adabSPaul E. McKenney {
3645cb007102SAlexander Gordeev 	static const char * const buf[] = RCU_NODE_NAME_INIT;
3646cb007102SAlexander Gordeev 	static const char * const fqs[] = RCU_FQS_NAME_INIT;
36473dc5dbe9SPaul E. McKenney 	static struct lock_class_key rcu_node_class[RCU_NUM_LVLS];
36483dc5dbe9SPaul E. McKenney 	static struct lock_class_key rcu_fqs_class[RCU_NUM_LVLS];
3649199977bfSAlexander Gordeev 
3650199977bfSAlexander Gordeev 	int levelspread[RCU_NUM_LVLS];		/* kids/node in each level. */
36514102adabSPaul E. McKenney 	int cpustride = 1;
36524102adabSPaul E. McKenney 	int i;
36534102adabSPaul E. McKenney 	int j;
36544102adabSPaul E. McKenney 	struct rcu_node *rnp;
36554102adabSPaul E. McKenney 
365605b84aecSAlexander Gordeev 	BUILD_BUG_ON(RCU_NUM_LVLS > ARRAY_SIZE(buf));  /* Fix buf[] init! */
36574102adabSPaul E. McKenney 
36583eaaaf6cSPaul E. McKenney 	/* Silence gcc 4.8 false positive about array index out of range. */
36593eaaaf6cSPaul E. McKenney 	if (rcu_num_lvls <= 0 || rcu_num_lvls > RCU_NUM_LVLS)
36603eaaaf6cSPaul E. McKenney 		panic("rcu_init_one: rcu_num_lvls out of range");
36614102adabSPaul E. McKenney 
36624102adabSPaul E. McKenney 	/* Initialize the level-tracking arrays. */
36634102adabSPaul E. McKenney 
36644102adabSPaul E. McKenney 	for (i = 1; i < rcu_num_lvls; i++)
3665eb7a6653SPaul E. McKenney 		rcu_state.level[i] =
3666eb7a6653SPaul E. McKenney 			rcu_state.level[i - 1] + num_rcu_lvl[i - 1];
366741f5c631SPaul E. McKenney 	rcu_init_levelspread(levelspread, num_rcu_lvl);
36684102adabSPaul E. McKenney 
36694102adabSPaul E. McKenney 	/* Initialize the elements themselves, starting from the leaves. */
36704102adabSPaul E. McKenney 
36714102adabSPaul E. McKenney 	for (i = rcu_num_lvls - 1; i >= 0; i--) {
3672199977bfSAlexander Gordeev 		cpustride *= levelspread[i];
3673eb7a6653SPaul E. McKenney 		rnp = rcu_state.level[i];
367441f5c631SPaul E. McKenney 		for (j = 0; j < num_rcu_lvl[i]; j++, rnp++) {
367567c583a7SBoqun Feng 			raw_spin_lock_init(&ACCESS_PRIVATE(rnp, lock));
367667c583a7SBoqun Feng 			lockdep_set_class_and_name(&ACCESS_PRIVATE(rnp, lock),
36774102adabSPaul E. McKenney 						   &rcu_node_class[i], buf[i]);
36784102adabSPaul E. McKenney 			raw_spin_lock_init(&rnp->fqslock);
36794102adabSPaul E. McKenney 			lockdep_set_class_and_name(&rnp->fqslock,
36804102adabSPaul E. McKenney 						   &rcu_fqs_class[i], fqs[i]);
3681eb7a6653SPaul E. McKenney 			rnp->gp_seq = rcu_state.gp_seq;
3682eb7a6653SPaul E. McKenney 			rnp->gp_seq_needed = rcu_state.gp_seq;
3683eb7a6653SPaul E. McKenney 			rnp->completedqs = rcu_state.gp_seq;
36844102adabSPaul E. McKenney 			rnp->qsmask = 0;
36854102adabSPaul E. McKenney 			rnp->qsmaskinit = 0;
36864102adabSPaul E. McKenney 			rnp->grplo = j * cpustride;
36874102adabSPaul E. McKenney 			rnp->grphi = (j + 1) * cpustride - 1;
3688595f3900SHimangi Saraogi 			if (rnp->grphi >= nr_cpu_ids)
3689595f3900SHimangi Saraogi 				rnp->grphi = nr_cpu_ids - 1;
36904102adabSPaul E. McKenney 			if (i == 0) {
36914102adabSPaul E. McKenney 				rnp->grpnum = 0;
36924102adabSPaul E. McKenney 				rnp->grpmask = 0;
36934102adabSPaul E. McKenney 				rnp->parent = NULL;
36944102adabSPaul E. McKenney 			} else {
3695199977bfSAlexander Gordeev 				rnp->grpnum = j % levelspread[i - 1];
3696df63fa5bSPaul E. McKenney 				rnp->grpmask = BIT(rnp->grpnum);
3697eb7a6653SPaul E. McKenney 				rnp->parent = rcu_state.level[i - 1] +
3698199977bfSAlexander Gordeev 					      j / levelspread[i - 1];
36994102adabSPaul E. McKenney 			}
37004102adabSPaul E. McKenney 			rnp->level = i;
37014102adabSPaul E. McKenney 			INIT_LIST_HEAD(&rnp->blkd_tasks);
37024102adabSPaul E. McKenney 			rcu_init_one_nocb(rnp);
3703f6a12f34SPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[0]);
3704f6a12f34SPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[1]);
37053b5f668eSPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[2]);
37063b5f668eSPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[3]);
3707f6a12f34SPaul E. McKenney 			spin_lock_init(&rnp->exp_lock);
37084102adabSPaul E. McKenney 		}
37094102adabSPaul E. McKenney 	}
37104102adabSPaul E. McKenney 
3711eb7a6653SPaul E. McKenney 	init_swait_queue_head(&rcu_state.gp_wq);
3712eb7a6653SPaul E. McKenney 	init_swait_queue_head(&rcu_state.expedited_wq);
3713aedf4ba9SPaul E. McKenney 	rnp = rcu_first_leaf_node();
37144102adabSPaul E. McKenney 	for_each_possible_cpu(i) {
37154102adabSPaul E. McKenney 		while (i > rnp->grphi)
37164102adabSPaul E. McKenney 			rnp++;
3717da1df50dSPaul E. McKenney 		per_cpu_ptr(&rcu_data, i)->mynode = rnp;
371853b46303SPaul E. McKenney 		rcu_boot_init_percpu_data(i);
37194102adabSPaul E. McKenney 	}
37204102adabSPaul E. McKenney }
37214102adabSPaul E. McKenney 
37224102adabSPaul E. McKenney /*
37234102adabSPaul E. McKenney  * Compute the rcu_node tree geometry from kernel parameters.  This cannot
37244102adabSPaul E. McKenney  * replace the definitions in tree.h because those are needed to size
37254102adabSPaul E. McKenney  * the ->node array in the rcu_state structure.
37264102adabSPaul E. McKenney  */
37274102adabSPaul E. McKenney static void __init rcu_init_geometry(void)
37284102adabSPaul E. McKenney {
37294102adabSPaul E. McKenney 	ulong d;
37304102adabSPaul E. McKenney 	int i;
373105b84aecSAlexander Gordeev 	int rcu_capacity[RCU_NUM_LVLS];
37324102adabSPaul E. McKenney 
37334102adabSPaul E. McKenney 	/*
37344102adabSPaul E. McKenney 	 * Initialize any unspecified boot parameters.
37354102adabSPaul E. McKenney 	 * The default values of jiffies_till_first_fqs and
37364102adabSPaul E. McKenney 	 * jiffies_till_next_fqs are set to the RCU_JIFFIES_TILL_FORCE_QS
37374102adabSPaul E. McKenney 	 * value, which is a function of HZ, then adding one for each
37384102adabSPaul E. McKenney 	 * RCU_JIFFIES_FQS_DIV CPUs that might be on the system.
37394102adabSPaul E. McKenney 	 */
37404102adabSPaul E. McKenney 	d = RCU_JIFFIES_TILL_FORCE_QS + nr_cpu_ids / RCU_JIFFIES_FQS_DIV;
37414102adabSPaul E. McKenney 	if (jiffies_till_first_fqs == ULONG_MAX)
37424102adabSPaul E. McKenney 		jiffies_till_first_fqs = d;
37434102adabSPaul E. McKenney 	if (jiffies_till_next_fqs == ULONG_MAX)
37444102adabSPaul E. McKenney 		jiffies_till_next_fqs = d;
3745c06aed0eSPaul E. McKenney 	if (jiffies_till_sched_qs == ULONG_MAX)
3746c06aed0eSPaul E. McKenney 		adjust_jiffies_till_sched_qs();
37474102adabSPaul E. McKenney 
37484102adabSPaul E. McKenney 	/* If the compile-time values are accurate, just leave. */
374947d631afSPaul E. McKenney 	if (rcu_fanout_leaf == RCU_FANOUT_LEAF &&
37504102adabSPaul E. McKenney 	    nr_cpu_ids == NR_CPUS)
37514102adabSPaul E. McKenney 		return;
3752a7538352SJoe Perches 	pr_info("Adjusting geometry for rcu_fanout_leaf=%d, nr_cpu_ids=%u\n",
375339479098SPaul E. McKenney 		rcu_fanout_leaf, nr_cpu_ids);
37544102adabSPaul E. McKenney 
37554102adabSPaul E. McKenney 	/*
3756ee968ac6SPaul E. McKenney 	 * The boot-time rcu_fanout_leaf parameter must be at least two
3757ee968ac6SPaul E. McKenney 	 * and cannot exceed the number of bits in the rcu_node masks.
3758ee968ac6SPaul E. McKenney 	 * Complain and fall back to the compile-time values if this
3759ee968ac6SPaul E. McKenney 	 * limit is exceeded.
37604102adabSPaul E. McKenney 	 */
3761ee968ac6SPaul E. McKenney 	if (rcu_fanout_leaf < 2 ||
376275cf15a4SAlexander Gordeev 	    rcu_fanout_leaf > sizeof(unsigned long) * 8) {
376313bd6494SPaul E. McKenney 		rcu_fanout_leaf = RCU_FANOUT_LEAF;
37644102adabSPaul E. McKenney 		WARN_ON(1);
37654102adabSPaul E. McKenney 		return;
37664102adabSPaul E. McKenney 	}
37674102adabSPaul E. McKenney 
376875cf15a4SAlexander Gordeev 	/*
37694102adabSPaul E. McKenney 	 * Compute number of nodes that can be handled an rcu_node tree
37709618138bSAlexander Gordeev 	 * with the given number of levels.
37714102adabSPaul E. McKenney 	 */
37729618138bSAlexander Gordeev 	rcu_capacity[0] = rcu_fanout_leaf;
377305b84aecSAlexander Gordeev 	for (i = 1; i < RCU_NUM_LVLS; i++)
37744102adabSPaul E. McKenney 		rcu_capacity[i] = rcu_capacity[i - 1] * RCU_FANOUT;
37754102adabSPaul E. McKenney 
37764102adabSPaul E. McKenney 	/*
377775cf15a4SAlexander Gordeev 	 * The tree must be able to accommodate the configured number of CPUs.
3778ee968ac6SPaul E. McKenney 	 * If this limit is exceeded, fall back to the compile-time values.
37794102adabSPaul E. McKenney 	 */
3780ee968ac6SPaul E. McKenney 	if (nr_cpu_ids > rcu_capacity[RCU_NUM_LVLS - 1]) {
3781ee968ac6SPaul E. McKenney 		rcu_fanout_leaf = RCU_FANOUT_LEAF;
3782ee968ac6SPaul E. McKenney 		WARN_ON(1);
3783ee968ac6SPaul E. McKenney 		return;
3784ee968ac6SPaul E. McKenney 	}
37854102adabSPaul E. McKenney 
3786679f9858SAlexander Gordeev 	/* Calculate the number of levels in the tree. */
37879618138bSAlexander Gordeev 	for (i = 0; nr_cpu_ids > rcu_capacity[i]; i++) {
3788372b0ec2SAlexander Gordeev 	}
37899618138bSAlexander Gordeev 	rcu_num_lvls = i + 1;
3790679f9858SAlexander Gordeev 
37914102adabSPaul E. McKenney 	/* Calculate the number of rcu_nodes at each level of the tree. */
3792679f9858SAlexander Gordeev 	for (i = 0; i < rcu_num_lvls; i++) {
37939618138bSAlexander Gordeev 		int cap = rcu_capacity[(rcu_num_lvls - 1) - i];
3794679f9858SAlexander Gordeev 		num_rcu_lvl[i] = DIV_ROUND_UP(nr_cpu_ids, cap);
37954102adabSPaul E. McKenney 	}
37964102adabSPaul E. McKenney 
37974102adabSPaul E. McKenney 	/* Calculate the total number of rcu_node structures. */
37984102adabSPaul E. McKenney 	rcu_num_nodes = 0;
3799679f9858SAlexander Gordeev 	for (i = 0; i < rcu_num_lvls; i++)
38004102adabSPaul E. McKenney 		rcu_num_nodes += num_rcu_lvl[i];
38014102adabSPaul E. McKenney }
38024102adabSPaul E. McKenney 
3803a3dc2948SPaul E. McKenney /*
3804a3dc2948SPaul E. McKenney  * Dump out the structure of the rcu_node combining tree associated
380549918a54SPaul E. McKenney  * with the rcu_state structure.
3806a3dc2948SPaul E. McKenney  */
3807b8bb1f63SPaul E. McKenney static void __init rcu_dump_rcu_node_tree(void)
3808a3dc2948SPaul E. McKenney {
3809a3dc2948SPaul E. McKenney 	int level = 0;
3810a3dc2948SPaul E. McKenney 	struct rcu_node *rnp;
3811a3dc2948SPaul E. McKenney 
3812a3dc2948SPaul E. McKenney 	pr_info("rcu_node tree layout dump\n");
3813a3dc2948SPaul E. McKenney 	pr_info(" ");
3814aedf4ba9SPaul E. McKenney 	rcu_for_each_node_breadth_first(rnp) {
3815a3dc2948SPaul E. McKenney 		if (rnp->level != level) {
3816a3dc2948SPaul E. McKenney 			pr_cont("\n");
3817a3dc2948SPaul E. McKenney 			pr_info(" ");
3818a3dc2948SPaul E. McKenney 			level = rnp->level;
3819a3dc2948SPaul E. McKenney 		}
3820a3dc2948SPaul E. McKenney 		pr_cont("%d:%d ^%d  ", rnp->grplo, rnp->grphi, rnp->grpnum);
3821a3dc2948SPaul E. McKenney 	}
3822a3dc2948SPaul E. McKenney 	pr_cont("\n");
3823a3dc2948SPaul E. McKenney }
3824a3dc2948SPaul E. McKenney 
3825ad7c946bSPaul E. McKenney struct workqueue_struct *rcu_gp_wq;
382625f3d7efSPaul E. McKenney struct workqueue_struct *rcu_par_gp_wq;
3827ad7c946bSPaul E. McKenney 
38284102adabSPaul E. McKenney void __init rcu_init(void)
38294102adabSPaul E. McKenney {
38304102adabSPaul E. McKenney 	int cpu;
38314102adabSPaul E. McKenney 
383247627678SPaul E. McKenney 	rcu_early_boot_tests();
383347627678SPaul E. McKenney 
38344102adabSPaul E. McKenney 	rcu_bootup_announce();
38354102adabSPaul E. McKenney 	rcu_init_geometry();
3836b8bb1f63SPaul E. McKenney 	rcu_init_one();
3837a3dc2948SPaul E. McKenney 	if (dump_tree)
3838b8bb1f63SPaul E. McKenney 		rcu_dump_rcu_node_tree();
3839fb60e533SPaul E. McKenney 	open_softirq(RCU_SOFTIRQ, rcu_core);
38404102adabSPaul E. McKenney 
38414102adabSPaul E. McKenney 	/*
38424102adabSPaul E. McKenney 	 * We don't need protection against CPU-hotplug here because
38434102adabSPaul E. McKenney 	 * this is called early in boot, before either interrupts
38444102adabSPaul E. McKenney 	 * or the scheduler are operational.
38454102adabSPaul E. McKenney 	 */
38464102adabSPaul E. McKenney 	pm_notifier(rcu_pm_notify, 0);
38477ec99de3SPaul E. McKenney 	for_each_online_cpu(cpu) {
38484df83742SThomas Gleixner 		rcutree_prepare_cpu(cpu);
38497ec99de3SPaul E. McKenney 		rcu_cpu_starting(cpu);
38509b9500daSPaul E. McKenney 		rcutree_online_cpu(cpu);
38517ec99de3SPaul E. McKenney 	}
3852ad7c946bSPaul E. McKenney 
3853ad7c946bSPaul E. McKenney 	/* Create workqueue for expedited GPs and for Tree SRCU. */
3854ad7c946bSPaul E. McKenney 	rcu_gp_wq = alloc_workqueue("rcu_gp", WQ_MEM_RECLAIM, 0);
3855ad7c946bSPaul E. McKenney 	WARN_ON(!rcu_gp_wq);
385625f3d7efSPaul E. McKenney 	rcu_par_gp_wq = alloc_workqueue("rcu_par_gp", WQ_MEM_RECLAIM, 0);
385725f3d7efSPaul E. McKenney 	WARN_ON(!rcu_par_gp_wq);
3858e0fcba9aSPaul E. McKenney 	srcu_init();
38594102adabSPaul E. McKenney }
38604102adabSPaul E. McKenney 
3861*10462d6fSPaul E. McKenney #include "tree_stall.h"
38623549c2bcSPaul E. McKenney #include "tree_exp.h"
38634102adabSPaul E. McKenney #include "tree_plugin.h"
3864