xref: /openbmc/linux/kernel/rcu/tree.c (revision 5c7d89676bc51966ea7882703d15795587e7108c)
14102adabSPaul E. McKenney /*
24102adabSPaul E. McKenney  * Read-Copy Update mechanism for mutual exclusion
34102adabSPaul E. McKenney  *
44102adabSPaul E. McKenney  * This program is free software; you can redistribute it and/or modify
54102adabSPaul E. McKenney  * it under the terms of the GNU General Public License as published by
64102adabSPaul E. McKenney  * the Free Software Foundation; either version 2 of the License, or
74102adabSPaul E. McKenney  * (at your option) any later version.
84102adabSPaul E. McKenney  *
94102adabSPaul E. McKenney  * This program is distributed in the hope that it will be useful,
104102adabSPaul E. McKenney  * but WITHOUT ANY WARRANTY; without even the implied warranty of
114102adabSPaul E. McKenney  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
124102adabSPaul E. McKenney  * GNU General Public License for more details.
134102adabSPaul E. McKenney  *
144102adabSPaul E. McKenney  * You should have received a copy of the GNU General Public License
1587de1cfdSPaul E. McKenney  * along with this program; if not, you can access it online at
1687de1cfdSPaul E. McKenney  * http://www.gnu.org/licenses/gpl-2.0.html.
174102adabSPaul E. McKenney  *
184102adabSPaul E. McKenney  * Copyright IBM Corporation, 2008
194102adabSPaul E. McKenney  *
204102adabSPaul E. McKenney  * Authors: Dipankar Sarma <dipankar@in.ibm.com>
214102adabSPaul E. McKenney  *	    Manfred Spraul <manfred@colorfullife.com>
224102adabSPaul E. McKenney  *	    Paul E. McKenney <paulmck@linux.vnet.ibm.com> Hierarchical version
234102adabSPaul E. McKenney  *
244102adabSPaul E. McKenney  * Based on the original work by Paul McKenney <paulmck@us.ibm.com>
254102adabSPaul E. McKenney  * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen.
264102adabSPaul E. McKenney  *
274102adabSPaul E. McKenney  * For detailed explanation of Read-Copy Update mechanism see -
284102adabSPaul E. McKenney  *	Documentation/RCU
294102adabSPaul E. McKenney  */
30a7538352SJoe Perches 
31a7538352SJoe Perches #define pr_fmt(fmt) "rcu: " fmt
32a7538352SJoe Perches 
334102adabSPaul E. McKenney #include <linux/types.h>
344102adabSPaul E. McKenney #include <linux/kernel.h>
354102adabSPaul E. McKenney #include <linux/init.h>
364102adabSPaul E. McKenney #include <linux/spinlock.h>
374102adabSPaul E. McKenney #include <linux/smp.h>
38f9411ebeSIngo Molnar #include <linux/rcupdate_wait.h>
394102adabSPaul E. McKenney #include <linux/interrupt.h>
404102adabSPaul E. McKenney #include <linux/sched.h>
41b17b0153SIngo Molnar #include <linux/sched/debug.h>
424102adabSPaul E. McKenney #include <linux/nmi.h>
434102adabSPaul E. McKenney #include <linux/atomic.h>
444102adabSPaul E. McKenney #include <linux/bitops.h>
454102adabSPaul E. McKenney #include <linux/export.h>
464102adabSPaul E. McKenney #include <linux/completion.h>
474102adabSPaul E. McKenney #include <linux/moduleparam.h>
484102adabSPaul E. McKenney #include <linux/percpu.h>
494102adabSPaul E. McKenney #include <linux/notifier.h>
504102adabSPaul E. McKenney #include <linux/cpu.h>
514102adabSPaul E. McKenney #include <linux/mutex.h>
524102adabSPaul E. McKenney #include <linux/time.h>
534102adabSPaul E. McKenney #include <linux/kernel_stat.h>
544102adabSPaul E. McKenney #include <linux/wait.h>
554102adabSPaul E. McKenney #include <linux/kthread.h>
56ae7e81c0SIngo Molnar #include <uapi/linux/sched/types.h>
574102adabSPaul E. McKenney #include <linux/prefetch.h>
584102adabSPaul E. McKenney #include <linux/delay.h>
594102adabSPaul E. McKenney #include <linux/stop_machine.h>
604102adabSPaul E. McKenney #include <linux/random.h>
61af658dcaSSteven Rostedt (Red Hat) #include <linux/trace_events.h>
624102adabSPaul E. McKenney #include <linux/suspend.h>
63a278d471SPaul E. McKenney #include <linux/ftrace.h>
644102adabSPaul E. McKenney 
654102adabSPaul E. McKenney #include "tree.h"
664102adabSPaul E. McKenney #include "rcu.h"
674102adabSPaul E. McKenney 
684102adabSPaul E. McKenney #ifdef MODULE_PARAM_PREFIX
694102adabSPaul E. McKenney #undef MODULE_PARAM_PREFIX
704102adabSPaul E. McKenney #endif
714102adabSPaul E. McKenney #define MODULE_PARAM_PREFIX "rcutree."
724102adabSPaul E. McKenney 
734102adabSPaul E. McKenney /* Data structures. */
744102adabSPaul E. McKenney 
75358be2d3SPaul E. McKenney static DEFINE_PER_CPU_SHARED_ALIGNED(struct rcu_data, rcu_data);
76358be2d3SPaul E. McKenney struct rcu_state rcu_state = {
77358be2d3SPaul E. McKenney 	.level = { &rcu_state.node[0] },
78358be2d3SPaul E. McKenney 	.gp_state = RCU_GP_IDLE,
79358be2d3SPaul E. McKenney 	.gp_seq = (0UL - 300UL) << RCU_SEQ_CTR_SHIFT,
80358be2d3SPaul E. McKenney 	.barrier_mutex = __MUTEX_INITIALIZER(rcu_state.barrier_mutex),
81358be2d3SPaul E. McKenney 	.name = RCU_NAME,
82358be2d3SPaul E. McKenney 	.abbr = RCU_ABBR,
83358be2d3SPaul E. McKenney 	.exp_mutex = __MUTEX_INITIALIZER(rcu_state.exp_mutex),
84358be2d3SPaul E. McKenney 	.exp_wake_mutex = __MUTEX_INITIALIZER(rcu_state.exp_wake_mutex),
85358be2d3SPaul E. McKenney 	.ofl_lock = __SPIN_LOCK_UNLOCKED(rcu_state.ofl_lock),
86358be2d3SPaul E. McKenney };
874102adabSPaul E. McKenney 
884102adabSPaul E. McKenney LIST_HEAD(rcu_struct_flavors);
894102adabSPaul E. McKenney 
90a3dc2948SPaul E. McKenney /* Dump rcu_node combining tree at boot to verify correct setup. */
91a3dc2948SPaul E. McKenney static bool dump_tree;
92a3dc2948SPaul E. McKenney module_param(dump_tree, bool, 0444);
937fa27001SPaul E. McKenney /* Control rcu_node-tree auto-balancing at boot time. */
947fa27001SPaul E. McKenney static bool rcu_fanout_exact;
957fa27001SPaul E. McKenney module_param(rcu_fanout_exact, bool, 0444);
9647d631afSPaul E. McKenney /* Increase (but not decrease) the RCU_FANOUT_LEAF at boot time. */
9747d631afSPaul E. McKenney static int rcu_fanout_leaf = RCU_FANOUT_LEAF;
984102adabSPaul E. McKenney module_param(rcu_fanout_leaf, int, 0444);
994102adabSPaul E. McKenney int rcu_num_lvls __read_mostly = RCU_NUM_LVLS;
100cb007102SAlexander Gordeev /* Number of rcu_nodes at specified level. */
101e95d68d2SPaul E. McKenney int num_rcu_lvl[] = NUM_RCU_LVL_INIT;
1024102adabSPaul E. McKenney int rcu_num_nodes __read_mostly = NUM_RCU_NODES; /* Total # rcu_nodes in use. */
103088e9d25SDaniel Bristot de Oliveira /* panic() on RCU Stall sysctl. */
104088e9d25SDaniel Bristot de Oliveira int sysctl_panic_on_rcu_stall __read_mostly;
1054102adabSPaul E. McKenney 
1064102adabSPaul E. McKenney /*
10752d7e48bSPaul E. McKenney  * The rcu_scheduler_active variable is initialized to the value
10852d7e48bSPaul E. McKenney  * RCU_SCHEDULER_INACTIVE and transitions RCU_SCHEDULER_INIT just before the
10952d7e48bSPaul E. McKenney  * first task is spawned.  So when this variable is RCU_SCHEDULER_INACTIVE,
11052d7e48bSPaul E. McKenney  * RCU can assume that there is but one task, allowing RCU to (for example)
1110d95092cSPaul E. McKenney  * optimize synchronize_rcu() to a simple barrier().  When this variable
11252d7e48bSPaul E. McKenney  * is RCU_SCHEDULER_INIT, RCU must actually do all the hard work required
11352d7e48bSPaul E. McKenney  * to detect real grace periods.  This variable is also used to suppress
11452d7e48bSPaul E. McKenney  * boot-time false positives from lockdep-RCU error checking.  Finally, it
11552d7e48bSPaul E. McKenney  * transitions from RCU_SCHEDULER_INIT to RCU_SCHEDULER_RUNNING after RCU
11652d7e48bSPaul E. McKenney  * is fully initialized, including all of its kthreads having been spawned.
1174102adabSPaul E. McKenney  */
1184102adabSPaul E. McKenney int rcu_scheduler_active __read_mostly;
1194102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_scheduler_active);
1204102adabSPaul E. McKenney 
1214102adabSPaul E. McKenney /*
1224102adabSPaul E. McKenney  * The rcu_scheduler_fully_active variable transitions from zero to one
1234102adabSPaul E. McKenney  * during the early_initcall() processing, which is after the scheduler
1244102adabSPaul E. McKenney  * is capable of creating new tasks.  So RCU processing (for example,
1254102adabSPaul E. McKenney  * creating tasks for RCU priority boosting) must be delayed until after
1264102adabSPaul E. McKenney  * rcu_scheduler_fully_active transitions from zero to one.  We also
1274102adabSPaul E. McKenney  * currently delay invocation of any RCU callbacks until after this point.
1284102adabSPaul E. McKenney  *
1294102adabSPaul E. McKenney  * It might later prove better for people registering RCU callbacks during
1304102adabSPaul E. McKenney  * early boot to take responsibility for these callbacks, but one step at
1314102adabSPaul E. McKenney  * a time.
1324102adabSPaul E. McKenney  */
1334102adabSPaul E. McKenney static int rcu_scheduler_fully_active __read_mostly;
1344102adabSPaul E. McKenney 
135b50912d0SPaul E. McKenney static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp,
136b50912d0SPaul E. McKenney 			      unsigned long gps, unsigned long flags);
1370aa04b05SPaul E. McKenney static void rcu_init_new_rnp(struct rcu_node *rnp_leaf);
1380aa04b05SPaul E. McKenney static void rcu_cleanup_dead_rnp(struct rcu_node *rnp_leaf);
1394102adabSPaul E. McKenney static void rcu_boost_kthread_setaffinity(struct rcu_node *rnp, int outgoingcpu);
1404102adabSPaul E. McKenney static void invoke_rcu_core(void);
141aff4e9edSPaul E. McKenney static void invoke_rcu_callbacks(struct rcu_data *rdp);
1422bbfc25bSPaul E. McKenney static void rcu_report_exp_rdp(struct rcu_state *rsp, struct rcu_data *rdp);
1433549c2bcSPaul E. McKenney static void sync_sched_exp_online_cleanup(int cpu);
1444102adabSPaul E. McKenney 
145a94844b2SPaul E. McKenney /* rcuc/rcub kthread realtime priority */
14626730f55SPaul E. McKenney static int kthread_prio = IS_ENABLED(CONFIG_RCU_BOOST) ? 1 : 0;
147a94844b2SPaul E. McKenney module_param(kthread_prio, int, 0644);
148a94844b2SPaul E. McKenney 
1498d7dc928SPaul E. McKenney /* Delay in jiffies for grace-period initialization delays, debug only. */
1500f41c0ddSPaul E. McKenney 
15190040c9eSPaul E. McKenney static int gp_preinit_delay;
15290040c9eSPaul E. McKenney module_param(gp_preinit_delay, int, 0444);
15390040c9eSPaul E. McKenney static int gp_init_delay;
15490040c9eSPaul E. McKenney module_param(gp_init_delay, int, 0444);
15590040c9eSPaul E. McKenney static int gp_cleanup_delay;
15690040c9eSPaul E. McKenney module_param(gp_cleanup_delay, int, 0444);
1570f41c0ddSPaul E. McKenney 
1584cf439a2SPaul E. McKenney /* Retrieve RCU kthreads priority for rcutorture */
1594babd855SJoel Fernandes (Google) int rcu_get_gp_kthreads_prio(void)
1604babd855SJoel Fernandes (Google) {
1614babd855SJoel Fernandes (Google) 	return kthread_prio;
1624babd855SJoel Fernandes (Google) }
1634babd855SJoel Fernandes (Google) EXPORT_SYMBOL_GPL(rcu_get_gp_kthreads_prio);
1644babd855SJoel Fernandes (Google) 
165eab128e8SPaul E. McKenney /*
166eab128e8SPaul E. McKenney  * Number of grace periods between delays, normalized by the duration of
167bfd090beSPaul E. McKenney  * the delay.  The longer the delay, the more the grace periods between
168eab128e8SPaul E. McKenney  * each delay.  The reason for this normalization is that it means that,
169eab128e8SPaul E. McKenney  * for non-zero delays, the overall slowdown of grace periods is constant
170eab128e8SPaul E. McKenney  * regardless of the duration of the delay.  This arrangement balances
171eab128e8SPaul E. McKenney  * the need for long delays to increase some race probabilities with the
172eab128e8SPaul E. McKenney  * need for fast grace periods to increase other race probabilities.
173eab128e8SPaul E. McKenney  */
174eab128e8SPaul E. McKenney #define PER_RCU_NODE_PERIOD 3	/* Number of grace periods between delays. */
17537745d28SPaul E. McKenney 
1764102adabSPaul E. McKenney /*
1770aa04b05SPaul E. McKenney  * Compute the mask of online CPUs for the specified rcu_node structure.
1780aa04b05SPaul E. McKenney  * This will not be stable unless the rcu_node structure's ->lock is
1790aa04b05SPaul E. McKenney  * held, but the bit corresponding to the current CPU will be stable
1800aa04b05SPaul E. McKenney  * in most contexts.
1810aa04b05SPaul E. McKenney  */
1820aa04b05SPaul E. McKenney unsigned long rcu_rnp_online_cpus(struct rcu_node *rnp)
1830aa04b05SPaul E. McKenney {
1847d0ae808SPaul E. McKenney 	return READ_ONCE(rnp->qsmaskinitnext);
1850aa04b05SPaul E. McKenney }
1860aa04b05SPaul E. McKenney 
1870aa04b05SPaul E. McKenney /*
1887d0ae808SPaul E. McKenney  * Return true if an RCU grace period is in progress.  The READ_ONCE()s
1894102adabSPaul E. McKenney  * permit this function to be invoked without holding the root rcu_node
1904102adabSPaul E. McKenney  * structure's ->lock, but of course results can be subject to change.
1914102adabSPaul E. McKenney  */
192de8e8730SPaul E. McKenney static int rcu_gp_in_progress(void)
1934102adabSPaul E. McKenney {
194de8e8730SPaul E. McKenney 	return rcu_seq_state(rcu_seq_current(&rcu_state.gp_seq));
1954102adabSPaul E. McKenney }
1964102adabSPaul E. McKenney 
197d28139c4SPaul E. McKenney void rcu_softirq_qs(void)
198d28139c4SPaul E. McKenney {
19945975c7dSPaul E. McKenney 	rcu_qs();
200d28139c4SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
201d28139c4SPaul E. McKenney }
202d28139c4SPaul E. McKenney 
203b8c17e66SPaul E. McKenney /*
204b8c17e66SPaul E. McKenney  * Steal a bit from the bottom of ->dynticks for idle entry/exit
205b8c17e66SPaul E. McKenney  * control.  Initially this is for TLB flushing.
206b8c17e66SPaul E. McKenney  */
207b8c17e66SPaul E. McKenney #define RCU_DYNTICK_CTRL_MASK 0x1
208b8c17e66SPaul E. McKenney #define RCU_DYNTICK_CTRL_CTR  (RCU_DYNTICK_CTRL_MASK + 1)
209b8c17e66SPaul E. McKenney #ifndef rcu_eqs_special_exit
210b8c17e66SPaul E. McKenney #define rcu_eqs_special_exit() do { } while (0)
211b8c17e66SPaul E. McKenney #endif
2124a81e832SPaul E. McKenney 
2134a81e832SPaul E. McKenney static DEFINE_PER_CPU(struct rcu_dynticks, rcu_dynticks) = {
21451a1fd30SPaul E. McKenney 	.dynticks_nesting = 1,
21558721f5dSPaul E. McKenney 	.dynticks_nmi_nesting = DYNTICK_IRQ_NONIDLE,
216b8c17e66SPaul E. McKenney 	.dynticks = ATOMIC_INIT(RCU_DYNTICK_CTRL_CTR),
2174a81e832SPaul E. McKenney };
2184a81e832SPaul E. McKenney 
2196563de9dSPaul E. McKenney /*
2202625d469SPaul E. McKenney  * Record entry into an extended quiescent state.  This is only to be
2212625d469SPaul E. McKenney  * called when not already in an extended quiescent state.
2222625d469SPaul E. McKenney  */
2232625d469SPaul E. McKenney static void rcu_dynticks_eqs_enter(void)
2242625d469SPaul E. McKenney {
2252625d469SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
226b8c17e66SPaul E. McKenney 	int seq;
2272625d469SPaul E. McKenney 
2282625d469SPaul E. McKenney 	/*
229b8c17e66SPaul E. McKenney 	 * CPUs seeing atomic_add_return() must see prior RCU read-side
2302625d469SPaul E. McKenney 	 * critical sections, and we also must force ordering with the
2312625d469SPaul E. McKenney 	 * next idle sojourn.
2322625d469SPaul E. McKenney 	 */
233b8c17e66SPaul E. McKenney 	seq = atomic_add_return(RCU_DYNTICK_CTRL_CTR, &rdtp->dynticks);
234b8c17e66SPaul E. McKenney 	/* Better be in an extended quiescent state! */
235b8c17e66SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
236b8c17e66SPaul E. McKenney 		     (seq & RCU_DYNTICK_CTRL_CTR));
237b8c17e66SPaul E. McKenney 	/* Better not have special action (TLB flush) pending! */
238b8c17e66SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
239b8c17e66SPaul E. McKenney 		     (seq & RCU_DYNTICK_CTRL_MASK));
2402625d469SPaul E. McKenney }
2412625d469SPaul E. McKenney 
2422625d469SPaul E. McKenney /*
2432625d469SPaul E. McKenney  * Record exit from an extended quiescent state.  This is only to be
2442625d469SPaul E. McKenney  * called from an extended quiescent state.
2452625d469SPaul E. McKenney  */
2462625d469SPaul E. McKenney static void rcu_dynticks_eqs_exit(void)
2472625d469SPaul E. McKenney {
2482625d469SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
249b8c17e66SPaul E. McKenney 	int seq;
2502625d469SPaul E. McKenney 
2512625d469SPaul E. McKenney 	/*
252b8c17e66SPaul E. McKenney 	 * CPUs seeing atomic_add_return() must see prior idle sojourns,
2532625d469SPaul E. McKenney 	 * and we also must force ordering with the next RCU read-side
2542625d469SPaul E. McKenney 	 * critical section.
2552625d469SPaul E. McKenney 	 */
256b8c17e66SPaul E. McKenney 	seq = atomic_add_return(RCU_DYNTICK_CTRL_CTR, &rdtp->dynticks);
257b8c17e66SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
258b8c17e66SPaul E. McKenney 		     !(seq & RCU_DYNTICK_CTRL_CTR));
259b8c17e66SPaul E. McKenney 	if (seq & RCU_DYNTICK_CTRL_MASK) {
260b8c17e66SPaul E. McKenney 		atomic_andnot(RCU_DYNTICK_CTRL_MASK, &rdtp->dynticks);
261b8c17e66SPaul E. McKenney 		smp_mb__after_atomic(); /* _exit after clearing mask. */
262b8c17e66SPaul E. McKenney 		/* Prefer duplicate flushes to losing a flush. */
263b8c17e66SPaul E. McKenney 		rcu_eqs_special_exit();
264b8c17e66SPaul E. McKenney 	}
2652625d469SPaul E. McKenney }
2662625d469SPaul E. McKenney 
2672625d469SPaul E. McKenney /*
2682625d469SPaul E. McKenney  * Reset the current CPU's ->dynticks counter to indicate that the
2692625d469SPaul E. McKenney  * newly onlined CPU is no longer in an extended quiescent state.
2702625d469SPaul E. McKenney  * This will either leave the counter unchanged, or increment it
2712625d469SPaul E. McKenney  * to the next non-quiescent value.
2722625d469SPaul E. McKenney  *
2732625d469SPaul E. McKenney  * The non-atomic test/increment sequence works because the upper bits
2742625d469SPaul E. McKenney  * of the ->dynticks counter are manipulated only by the corresponding CPU,
2752625d469SPaul E. McKenney  * or when the corresponding CPU is offline.
2762625d469SPaul E. McKenney  */
2772625d469SPaul E. McKenney static void rcu_dynticks_eqs_online(void)
2782625d469SPaul E. McKenney {
2792625d469SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
2802625d469SPaul E. McKenney 
281b8c17e66SPaul E. McKenney 	if (atomic_read(&rdtp->dynticks) & RCU_DYNTICK_CTRL_CTR)
2822625d469SPaul E. McKenney 		return;
283b8c17e66SPaul E. McKenney 	atomic_add(RCU_DYNTICK_CTRL_CTR, &rdtp->dynticks);
2842625d469SPaul E. McKenney }
2852625d469SPaul E. McKenney 
2862625d469SPaul E. McKenney /*
28702a5c550SPaul E. McKenney  * Is the current CPU in an extended quiescent state?
28802a5c550SPaul E. McKenney  *
28902a5c550SPaul E. McKenney  * No ordering, as we are sampling CPU-local information.
29002a5c550SPaul E. McKenney  */
29102a5c550SPaul E. McKenney bool rcu_dynticks_curr_cpu_in_eqs(void)
29202a5c550SPaul E. McKenney {
29302a5c550SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
29402a5c550SPaul E. McKenney 
295b8c17e66SPaul E. McKenney 	return !(atomic_read(&rdtp->dynticks) & RCU_DYNTICK_CTRL_CTR);
29602a5c550SPaul E. McKenney }
29702a5c550SPaul E. McKenney 
29802a5c550SPaul E. McKenney /*
2998b2f63abSPaul E. McKenney  * Snapshot the ->dynticks counter with full ordering so as to allow
3008b2f63abSPaul E. McKenney  * stable comparison of this counter with past and future snapshots.
3018b2f63abSPaul E. McKenney  */
30202a5c550SPaul E. McKenney int rcu_dynticks_snap(struct rcu_dynticks *rdtp)
3038b2f63abSPaul E. McKenney {
3048b2f63abSPaul E. McKenney 	int snap = atomic_add_return(0, &rdtp->dynticks);
3058b2f63abSPaul E. McKenney 
306b8c17e66SPaul E. McKenney 	return snap & ~RCU_DYNTICK_CTRL_MASK;
3078b2f63abSPaul E. McKenney }
3088b2f63abSPaul E. McKenney 
3098b2f63abSPaul E. McKenney /*
31002a5c550SPaul E. McKenney  * Return true if the snapshot returned from rcu_dynticks_snap()
31102a5c550SPaul E. McKenney  * indicates that RCU is in an extended quiescent state.
31202a5c550SPaul E. McKenney  */
31302a5c550SPaul E. McKenney static bool rcu_dynticks_in_eqs(int snap)
31402a5c550SPaul E. McKenney {
315b8c17e66SPaul E. McKenney 	return !(snap & RCU_DYNTICK_CTRL_CTR);
31602a5c550SPaul E. McKenney }
31702a5c550SPaul E. McKenney 
31802a5c550SPaul E. McKenney /*
31902a5c550SPaul E. McKenney  * Return true if the CPU corresponding to the specified rcu_dynticks
32002a5c550SPaul E. McKenney  * structure has spent some time in an extended quiescent state since
32102a5c550SPaul E. McKenney  * rcu_dynticks_snap() returned the specified snapshot.
32202a5c550SPaul E. McKenney  */
32302a5c550SPaul E. McKenney static bool rcu_dynticks_in_eqs_since(struct rcu_dynticks *rdtp, int snap)
32402a5c550SPaul E. McKenney {
32502a5c550SPaul E. McKenney 	return snap != rcu_dynticks_snap(rdtp);
32602a5c550SPaul E. McKenney }
32702a5c550SPaul E. McKenney 
32802a5c550SPaul E. McKenney /*
329b8c17e66SPaul E. McKenney  * Set the special (bottom) bit of the specified CPU so that it
330b8c17e66SPaul E. McKenney  * will take special action (such as flushing its TLB) on the
331b8c17e66SPaul E. McKenney  * next exit from an extended quiescent state.  Returns true if
332b8c17e66SPaul E. McKenney  * the bit was successfully set, or false if the CPU was not in
333b8c17e66SPaul E. McKenney  * an extended quiescent state.
334b8c17e66SPaul E. McKenney  */
335b8c17e66SPaul E. McKenney bool rcu_eqs_special_set(int cpu)
336b8c17e66SPaul E. McKenney {
337b8c17e66SPaul E. McKenney 	int old;
338b8c17e66SPaul E. McKenney 	int new;
339b8c17e66SPaul E. McKenney 	struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
340b8c17e66SPaul E. McKenney 
341b8c17e66SPaul E. McKenney 	do {
342b8c17e66SPaul E. McKenney 		old = atomic_read(&rdtp->dynticks);
343b8c17e66SPaul E. McKenney 		if (old & RCU_DYNTICK_CTRL_CTR)
344b8c17e66SPaul E. McKenney 			return false;
345b8c17e66SPaul E. McKenney 		new = old | RCU_DYNTICK_CTRL_MASK;
346b8c17e66SPaul E. McKenney 	} while (atomic_cmpxchg(&rdtp->dynticks, old, new) != old);
347b8c17e66SPaul E. McKenney 	return true;
3486563de9dSPaul E. McKenney }
3495cd37193SPaul E. McKenney 
3504a81e832SPaul E. McKenney /*
3514a81e832SPaul E. McKenney  * Let the RCU core know that this CPU has gone through the scheduler,
3524a81e832SPaul E. McKenney  * which is a quiescent state.  This is called when the need for a
3534a81e832SPaul E. McKenney  * quiescent state is urgent, so we burn an atomic operation and full
3544a81e832SPaul E. McKenney  * memory barriers to let the RCU core know about it, regardless of what
3554a81e832SPaul E. McKenney  * this CPU might (or might not) do in the near future.
3564a81e832SPaul E. McKenney  *
3570f9be8caSPaul E. McKenney  * We inform the RCU core by emulating a zero-duration dyntick-idle period.
35846a5d164SPaul E. McKenney  *
3593b57a399SPaul E. McKenney  * The caller must have disabled interrupts and must not be idle.
3604a81e832SPaul E. McKenney  */
3614a81e832SPaul E. McKenney static void rcu_momentary_dyntick_idle(void)
3624a81e832SPaul E. McKenney {
3633b57a399SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
3643b57a399SPaul E. McKenney 	int special;
3653b57a399SPaul E. McKenney 
3660f9be8caSPaul E. McKenney 	raw_cpu_write(rcu_dynticks.rcu_need_heavy_qs, false);
3673b57a399SPaul E. McKenney 	special = atomic_add_return(2 * RCU_DYNTICK_CTRL_CTR, &rdtp->dynticks);
3683b57a399SPaul E. McKenney 	/* It is illegal to call this from idle state. */
3693b57a399SPaul E. McKenney 	WARN_ON_ONCE(!(special & RCU_DYNTICK_CTRL_CTR));
3703e310098SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
3714a81e832SPaul E. McKenney }
3724a81e832SPaul E. McKenney 
37345975c7dSPaul E. McKenney /**
37445975c7dSPaul E. McKenney  * rcu_is_cpu_rrupt_from_idle - see if idle or immediately interrupted from idle
37545975c7dSPaul E. McKenney  *
37645975c7dSPaul E. McKenney  * If the current CPU is idle or running at a first-level (not nested)
37745975c7dSPaul E. McKenney  * interrupt from idle, return true.  The caller must have at least
37845975c7dSPaul E. McKenney  * disabled preemption.
3794102adabSPaul E. McKenney  */
38045975c7dSPaul E. McKenney static int rcu_is_cpu_rrupt_from_idle(void)
3814102adabSPaul E. McKenney {
38245975c7dSPaul E. McKenney 	return __this_cpu_read(rcu_dynticks.dynticks_nesting) <= 0 &&
38345975c7dSPaul E. McKenney 	       __this_cpu_read(rcu_dynticks.dynticks_nmi_nesting) <= 1;
3844102adabSPaul E. McKenney }
3854102adabSPaul E. McKenney 
3865cd37193SPaul E. McKenney /*
3871925d196SPaul E. McKenney  * Register a quiescent state for all RCU flavors.  If there is an
3885cd37193SPaul E. McKenney  * emergency, invoke rcu_momentary_dyntick_idle() to do a heavy-weight
3895cd37193SPaul E. McKenney  * dyntick-idle quiescent state visible to other CPUs (but only for those
3901925d196SPaul E. McKenney  * RCU flavors in desperate need of a quiescent state, which will normally
3915cd37193SPaul E. McKenney  * be none of them).  Either way, do a lightweight quiescent state for
3925cd37193SPaul E. McKenney  * all RCU flavors.
393bb73c52bSBoqun Feng  *
394bb73c52bSBoqun Feng  * The barrier() calls are redundant in the common case when this is
395bb73c52bSBoqun Feng  * called externally, but just in case this is called from within this
396bb73c52bSBoqun Feng  * file.
397bb73c52bSBoqun Feng  *
3985cd37193SPaul E. McKenney  */
3995cd37193SPaul E. McKenney void rcu_all_qs(void)
4005cd37193SPaul E. McKenney {
40146a5d164SPaul E. McKenney 	unsigned long flags;
40246a5d164SPaul E. McKenney 
4039226b10dSPaul E. McKenney 	if (!raw_cpu_read(rcu_dynticks.rcu_urgent_qs))
4049226b10dSPaul E. McKenney 		return;
4059226b10dSPaul E. McKenney 	preempt_disable();
4069226b10dSPaul E. McKenney 	/* Load rcu_urgent_qs before other flags. */
4079226b10dSPaul E. McKenney 	if (!smp_load_acquire(this_cpu_ptr(&rcu_dynticks.rcu_urgent_qs))) {
4089226b10dSPaul E. McKenney 		preempt_enable();
4099226b10dSPaul E. McKenney 		return;
4109226b10dSPaul E. McKenney 	}
4119226b10dSPaul E. McKenney 	this_cpu_write(rcu_dynticks.rcu_urgent_qs, false);
412bb73c52bSBoqun Feng 	barrier(); /* Avoid RCU read-side critical sections leaking down. */
4130f9be8caSPaul E. McKenney 	if (unlikely(raw_cpu_read(rcu_dynticks.rcu_need_heavy_qs))) {
41446a5d164SPaul E. McKenney 		local_irq_save(flags);
4155cd37193SPaul E. McKenney 		rcu_momentary_dyntick_idle();
41646a5d164SPaul E. McKenney 		local_irq_restore(flags);
41746a5d164SPaul E. McKenney 	}
41845975c7dSPaul E. McKenney 	if (unlikely(raw_cpu_read(rcu_data.cpu_no_qs.b.exp)))
41945975c7dSPaul E. McKenney 		rcu_qs();
4209577df9aSPaul E. McKenney 	this_cpu_inc(rcu_dynticks.rcu_qs_ctr);
421bb73c52bSBoqun Feng 	barrier(); /* Avoid RCU read-side critical sections leaking up. */
4229226b10dSPaul E. McKenney 	preempt_enable();
4235cd37193SPaul E. McKenney }
4245cd37193SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_all_qs);
4255cd37193SPaul E. McKenney 
42617c7798bSPaul E. McKenney #define DEFAULT_RCU_BLIMIT 10     /* Maximum callbacks per rcu_do_batch. */
42717c7798bSPaul E. McKenney static long blimit = DEFAULT_RCU_BLIMIT;
42817c7798bSPaul E. McKenney #define DEFAULT_RCU_QHIMARK 10000 /* If this many pending, ignore blimit. */
42917c7798bSPaul E. McKenney static long qhimark = DEFAULT_RCU_QHIMARK;
43017c7798bSPaul E. McKenney #define DEFAULT_RCU_QLOMARK 100   /* Once only this many pending, use blimit. */
43117c7798bSPaul E. McKenney static long qlowmark = DEFAULT_RCU_QLOMARK;
4324102adabSPaul E. McKenney 
4334102adabSPaul E. McKenney module_param(blimit, long, 0444);
4344102adabSPaul E. McKenney module_param(qhimark, long, 0444);
4354102adabSPaul E. McKenney module_param(qlowmark, long, 0444);
4364102adabSPaul E. McKenney 
4374102adabSPaul E. McKenney static ulong jiffies_till_first_fqs = ULONG_MAX;
4384102adabSPaul E. McKenney static ulong jiffies_till_next_fqs = ULONG_MAX;
4398c7c4829SPaul E. McKenney static bool rcu_kick_kthreads;
4404102adabSPaul E. McKenney 
44167abb96cSByungchul Park static int param_set_first_fqs_jiffies(const char *val, const struct kernel_param *kp)
44267abb96cSByungchul Park {
44367abb96cSByungchul Park 	ulong j;
44467abb96cSByungchul Park 	int ret = kstrtoul(val, 0, &j);
44567abb96cSByungchul Park 
44667abb96cSByungchul Park 	if (!ret)
44767abb96cSByungchul Park 		WRITE_ONCE(*(ulong *)kp->arg, (j > HZ) ? HZ : j);
44867abb96cSByungchul Park 	return ret;
44967abb96cSByungchul Park }
45067abb96cSByungchul Park 
45167abb96cSByungchul Park static int param_set_next_fqs_jiffies(const char *val, const struct kernel_param *kp)
45267abb96cSByungchul Park {
45367abb96cSByungchul Park 	ulong j;
45467abb96cSByungchul Park 	int ret = kstrtoul(val, 0, &j);
45567abb96cSByungchul Park 
45667abb96cSByungchul Park 	if (!ret)
45767abb96cSByungchul Park 		WRITE_ONCE(*(ulong *)kp->arg, (j > HZ) ? HZ : (j ?: 1));
45867abb96cSByungchul Park 	return ret;
45967abb96cSByungchul Park }
46067abb96cSByungchul Park 
46167abb96cSByungchul Park static struct kernel_param_ops first_fqs_jiffies_ops = {
46267abb96cSByungchul Park 	.set = param_set_first_fqs_jiffies,
46367abb96cSByungchul Park 	.get = param_get_ulong,
46467abb96cSByungchul Park };
46567abb96cSByungchul Park 
46667abb96cSByungchul Park static struct kernel_param_ops next_fqs_jiffies_ops = {
46767abb96cSByungchul Park 	.set = param_set_next_fqs_jiffies,
46867abb96cSByungchul Park 	.get = param_get_ulong,
46967abb96cSByungchul Park };
47067abb96cSByungchul Park 
47167abb96cSByungchul Park module_param_cb(jiffies_till_first_fqs, &first_fqs_jiffies_ops, &jiffies_till_first_fqs, 0644);
47267abb96cSByungchul Park module_param_cb(jiffies_till_next_fqs, &next_fqs_jiffies_ops, &jiffies_till_next_fqs, 0644);
4738c7c4829SPaul E. McKenney module_param(rcu_kick_kthreads, bool, 0644);
4744102adabSPaul E. McKenney 
4754a81e832SPaul E. McKenney /*
4764a81e832SPaul E. McKenney  * How long the grace period must be before we start recruiting
4774a81e832SPaul E. McKenney  * quiescent-state help from rcu_note_context_switch().
4784a81e832SPaul E. McKenney  */
479f79c3ad6SPaul E. McKenney static ulong jiffies_till_sched_qs = HZ / 10;
480f79c3ad6SPaul E. McKenney module_param(jiffies_till_sched_qs, ulong, 0444);
4814a81e832SPaul E. McKenney 
482e9ecb780SPaul E. McKenney static void force_qs_rnp(int (*f)(struct rcu_data *rsp));
483e9ecb780SPaul E. McKenney static void force_quiescent_state(void);
484e3950ecdSPaul E. McKenney static int rcu_pending(void);
4854102adabSPaul E. McKenney 
4864102adabSPaul E. McKenney /*
48717ef2fe9SPaul E. McKenney  * Return the number of RCU GPs completed thus far for debug & stats.
4884102adabSPaul E. McKenney  */
48917ef2fe9SPaul E. McKenney unsigned long rcu_get_gp_seq(void)
490917963d0SPaul E. McKenney {
49116fc9c60SPaul E. McKenney 	return READ_ONCE(rcu_state.gp_seq);
492917963d0SPaul E. McKenney }
49317ef2fe9SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_get_gp_seq);
494917963d0SPaul E. McKenney 
495917963d0SPaul E. McKenney /*
49617ef2fe9SPaul E. McKenney  * Return the number of RCU-sched GPs completed thus far for debug & stats.
497917963d0SPaul E. McKenney  */
49817ef2fe9SPaul E. McKenney unsigned long rcu_sched_get_gp_seq(void)
499917963d0SPaul E. McKenney {
50045975c7dSPaul E. McKenney 	return rcu_get_gp_seq();
501917963d0SPaul E. McKenney }
50217ef2fe9SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_sched_get_gp_seq);
503917963d0SPaul E. McKenney 
504917963d0SPaul E. McKenney /*
50582fcecfaSPaul E. McKenney  * Return the number of RCU GPs completed thus far for debug & stats.
50682fcecfaSPaul E. McKenney  * This is a transitional API and will soon be removed.
507917963d0SPaul E. McKenney  */
50817ef2fe9SPaul E. McKenney unsigned long rcu_bh_get_gp_seq(void)
509917963d0SPaul E. McKenney {
51016fc9c60SPaul E. McKenney 	return READ_ONCE(rcu_state.gp_seq);
511917963d0SPaul E. McKenney }
51217ef2fe9SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_bh_get_gp_seq);
5134102adabSPaul E. McKenney 
5144102adabSPaul E. McKenney /*
515291783b8SPaul E. McKenney  * Return the number of RCU expedited batches completed thus far for
516291783b8SPaul E. McKenney  * debug & stats.  Odd numbers mean that a batch is in progress, even
517291783b8SPaul E. McKenney  * numbers mean idle.  The value returned will thus be roughly double
518291783b8SPaul E. McKenney  * the cumulative batches since boot.
519291783b8SPaul E. McKenney  */
520291783b8SPaul E. McKenney unsigned long rcu_exp_batches_completed(void)
521291783b8SPaul E. McKenney {
52216fc9c60SPaul E. McKenney 	return rcu_state.expedited_sequence;
523291783b8SPaul E. McKenney }
524291783b8SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_exp_batches_completed);
525291783b8SPaul E. McKenney 
526291783b8SPaul E. McKenney /*
527291783b8SPaul E. McKenney  * Return the number of RCU-sched expedited batches completed thus far
528291783b8SPaul E. McKenney  * for debug & stats.  Similar to rcu_exp_batches_completed().
529291783b8SPaul E. McKenney  */
530291783b8SPaul E. McKenney unsigned long rcu_exp_batches_completed_sched(void)
531291783b8SPaul E. McKenney {
53245975c7dSPaul E. McKenney 	return rcu_state.expedited_sequence;
533291783b8SPaul E. McKenney }
534291783b8SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_exp_batches_completed_sched);
535291783b8SPaul E. McKenney 
536291783b8SPaul E. McKenney /*
537a381d757SAndreea-Cristina Bernat  * Force a quiescent state.
538a381d757SAndreea-Cristina Bernat  */
539a381d757SAndreea-Cristina Bernat void rcu_force_quiescent_state(void)
540a381d757SAndreea-Cristina Bernat {
541e9ecb780SPaul E. McKenney 	force_quiescent_state();
542a381d757SAndreea-Cristina Bernat }
543a381d757SAndreea-Cristina Bernat EXPORT_SYMBOL_GPL(rcu_force_quiescent_state);
544a381d757SAndreea-Cristina Bernat 
545a381d757SAndreea-Cristina Bernat /*
5464102adabSPaul E. McKenney  * Force a quiescent state for RCU BH.
5474102adabSPaul E. McKenney  */
5484102adabSPaul E. McKenney void rcu_bh_force_quiescent_state(void)
5494102adabSPaul E. McKenney {
550e9ecb780SPaul E. McKenney 	force_quiescent_state();
5514102adabSPaul E. McKenney }
5524102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_bh_force_quiescent_state);
5534102adabSPaul E. McKenney 
5544102adabSPaul E. McKenney /*
555e7580f33SPaul E. McKenney  * Force a quiescent state for RCU-sched.
556e7580f33SPaul E. McKenney  */
557e7580f33SPaul E. McKenney void rcu_sched_force_quiescent_state(void)
558e7580f33SPaul E. McKenney {
55945975c7dSPaul E. McKenney 	rcu_force_quiescent_state();
560e7580f33SPaul E. McKenney }
561e7580f33SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_sched_force_quiescent_state);
562e7580f33SPaul E. McKenney 
563e7580f33SPaul E. McKenney /*
564afea227fSPaul E. McKenney  * Show the state of the grace-period kthreads.
565afea227fSPaul E. McKenney  */
566afea227fSPaul E. McKenney void show_rcu_gp_kthreads(void)
567afea227fSPaul E. McKenney {
56847199a08SPaul E. McKenney 	int cpu;
56947199a08SPaul E. McKenney 	struct rcu_data *rdp;
57047199a08SPaul E. McKenney 	struct rcu_node *rnp;
571afea227fSPaul E. McKenney 	struct rcu_state *rsp;
572afea227fSPaul E. McKenney 
573afea227fSPaul E. McKenney 	for_each_rcu_flavor(rsp) {
574afea227fSPaul E. McKenney 		pr_info("%s: wait state: %d ->state: %#lx\n",
575afea227fSPaul E. McKenney 			rsp->name, rsp->gp_state, rsp->gp_kthread->state);
57647199a08SPaul E. McKenney 		rcu_for_each_node_breadth_first(rsp, rnp) {
57747199a08SPaul E. McKenney 			if (ULONG_CMP_GE(rsp->gp_seq, rnp->gp_seq_needed))
57847199a08SPaul E. McKenney 				continue;
57947199a08SPaul E. McKenney 			pr_info("\trcu_node %d:%d ->gp_seq %lu ->gp_seq_needed %lu\n",
58047199a08SPaul E. McKenney 				rnp->grplo, rnp->grphi, rnp->gp_seq,
58147199a08SPaul E. McKenney 				rnp->gp_seq_needed);
58247199a08SPaul E. McKenney 			if (!rcu_is_leaf_node(rnp))
58347199a08SPaul E. McKenney 				continue;
58447199a08SPaul E. McKenney 			for_each_leaf_node_possible_cpu(rnp, cpu) {
585da1df50dSPaul E. McKenney 				rdp = per_cpu_ptr(&rcu_data, cpu);
58647199a08SPaul E. McKenney 				if (rdp->gpwrap ||
58747199a08SPaul E. McKenney 				    ULONG_CMP_GE(rsp->gp_seq,
58847199a08SPaul E. McKenney 						 rdp->gp_seq_needed))
58947199a08SPaul E. McKenney 					continue;
59047199a08SPaul E. McKenney 				pr_info("\tcpu %d ->gp_seq_needed %lu\n",
59147199a08SPaul E. McKenney 					cpu, rdp->gp_seq_needed);
59247199a08SPaul E. McKenney 			}
59347199a08SPaul E. McKenney 		}
594afea227fSPaul E. McKenney 		/* sched_show_task(rsp->gp_kthread); */
595afea227fSPaul E. McKenney 	}
596afea227fSPaul E. McKenney }
597afea227fSPaul E. McKenney EXPORT_SYMBOL_GPL(show_rcu_gp_kthreads);
598afea227fSPaul E. McKenney 
599afea227fSPaul E. McKenney /*
600ad0dc7f9SPaul E. McKenney  * Send along grace-period-related data for rcutorture diagnostics.
601ad0dc7f9SPaul E. McKenney  */
602ad0dc7f9SPaul E. McKenney void rcutorture_get_gp_data(enum rcutorture_type test_type, int *flags,
603aebc8264SPaul E. McKenney 			    unsigned long *gp_seq)
604ad0dc7f9SPaul E. McKenney {
605ad0dc7f9SPaul E. McKenney 	struct rcu_state *rsp = NULL;
606ad0dc7f9SPaul E. McKenney 
607ad0dc7f9SPaul E. McKenney 	switch (test_type) {
608ad0dc7f9SPaul E. McKenney 	case RCU_FLAVOR:
609ad0dc7f9SPaul E. McKenney 	case RCU_BH_FLAVOR:
610ad0dc7f9SPaul E. McKenney 	case RCU_SCHED_FLAVOR:
61116fc9c60SPaul E. McKenney 		rsp = &rcu_state;
612ad0dc7f9SPaul E. McKenney 		break;
613ad0dc7f9SPaul E. McKenney 	default:
614ad0dc7f9SPaul E. McKenney 		break;
615ad0dc7f9SPaul E. McKenney 	}
6167f6733c3SPaul E. McKenney 	if (rsp == NULL)
6177f6733c3SPaul E. McKenney 		return;
6187d0ae808SPaul E. McKenney 	*flags = READ_ONCE(rsp->gp_flags);
619aebc8264SPaul E. McKenney 	*gp_seq = rcu_seq_current(&rsp->gp_seq);
620ad0dc7f9SPaul E. McKenney }
621ad0dc7f9SPaul E. McKenney EXPORT_SYMBOL_GPL(rcutorture_get_gp_data);
622ad0dc7f9SPaul E. McKenney 
623ad0dc7f9SPaul E. McKenney /*
624365187fbSPaul E. McKenney  * Return the root node of the specified rcu_state structure.
625365187fbSPaul E. McKenney  */
626336a4f6cSPaul E. McKenney static struct rcu_node *rcu_get_root(void)
627365187fbSPaul E. McKenney {
628336a4f6cSPaul E. McKenney 	return &rcu_state.node[0];
629365187fbSPaul E. McKenney }
630365187fbSPaul E. McKenney 
631365187fbSPaul E. McKenney /*
632215bba9fSPaul E. McKenney  * Enter an RCU extended quiescent state, which can be either the
633215bba9fSPaul E. McKenney  * idle loop or adaptive-tickless usermode execution.
6344102adabSPaul E. McKenney  *
635215bba9fSPaul E. McKenney  * We crowbar the ->dynticks_nmi_nesting field to zero to allow for
636215bba9fSPaul E. McKenney  * the possibility of usermode upcalls having messed up our count
637215bba9fSPaul E. McKenney  * of interrupt nesting level during the prior busy period.
6384102adabSPaul E. McKenney  */
639215bba9fSPaul E. McKenney static void rcu_eqs_enter(bool user)
6404102adabSPaul E. McKenney {
64196d3fd0dSPaul E. McKenney 	struct rcu_state *rsp;
64296d3fd0dSPaul E. McKenney 	struct rcu_data *rdp;
643215bba9fSPaul E. McKenney 	struct rcu_dynticks *rdtp;
644215bba9fSPaul E. McKenney 
645215bba9fSPaul E. McKenney 	rdtp = this_cpu_ptr(&rcu_dynticks);
646e11ec65cSPaul E. McKenney 	WARN_ON_ONCE(rdtp->dynticks_nmi_nesting != DYNTICK_IRQ_NONIDLE);
647215bba9fSPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nmi_nesting, 0);
648215bba9fSPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) &&
649215bba9fSPaul E. McKenney 		     rdtp->dynticks_nesting == 0);
650215bba9fSPaul E. McKenney 	if (rdtp->dynticks_nesting != 1) {
651215bba9fSPaul E. McKenney 		rdtp->dynticks_nesting--;
652215bba9fSPaul E. McKenney 		return;
653215bba9fSPaul E. McKenney 	}
65496d3fd0dSPaul E. McKenney 
655b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
656dec98900SPaul E. McKenney 	trace_rcu_dyntick(TPS("Start"), rdtp->dynticks_nesting, 0, rdtp->dynticks);
657e68bbb26SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && !user && !is_idle_task(current));
65896d3fd0dSPaul E. McKenney 	for_each_rcu_flavor(rsp) {
659da1df50dSPaul E. McKenney 		rdp = this_cpu_ptr(&rcu_data);
66096d3fd0dSPaul E. McKenney 		do_nocb_deferred_wakeup(rdp);
66196d3fd0dSPaul E. McKenney 	}
662198bbf81SPaul E. McKenney 	rcu_prepare_for_idle();
6633e310098SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
6642342172fSPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nesting, 0); /* Avoid irq-access tearing. */
665844ccdd7SPaul E. McKenney 	rcu_dynticks_eqs_enter();
666176f8f7aSPaul E. McKenney 	rcu_dynticks_task_enter();
6673a592405SPaul E. McKenney }
6684102adabSPaul E. McKenney 
6694102adabSPaul E. McKenney /**
6704102adabSPaul E. McKenney  * rcu_idle_enter - inform RCU that current CPU is entering idle
6714102adabSPaul E. McKenney  *
6724102adabSPaul E. McKenney  * Enter idle mode, in other words, -leave- the mode in which RCU
6734102adabSPaul E. McKenney  * read-side critical sections can occur.  (Though RCU read-side
6744102adabSPaul E. McKenney  * critical sections can occur in irq handlers in idle, a possibility
6754102adabSPaul E. McKenney  * handled by irq_enter() and irq_exit().)
6764102adabSPaul E. McKenney  *
677c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_idle_enter(), be sure to test with
678c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
6794102adabSPaul E. McKenney  */
6804102adabSPaul E. McKenney void rcu_idle_enter(void)
6814102adabSPaul E. McKenney {
682b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
6834102adabSPaul E. McKenney 	rcu_eqs_enter(false);
6844102adabSPaul E. McKenney }
6854102adabSPaul E. McKenney 
686d1ec4c34SPaul E. McKenney #ifdef CONFIG_NO_HZ_FULL
6874102adabSPaul E. McKenney /**
6884102adabSPaul E. McKenney  * rcu_user_enter - inform RCU that we are resuming userspace.
6894102adabSPaul E. McKenney  *
6904102adabSPaul E. McKenney  * Enter RCU idle mode right before resuming userspace.  No use of RCU
6914102adabSPaul E. McKenney  * is permitted between this call and rcu_user_exit(). This way the
6924102adabSPaul E. McKenney  * CPU doesn't need to maintain the tick for RCU maintenance purposes
6934102adabSPaul E. McKenney  * when the CPU runs in userspace.
694c0da313eSPaul E. McKenney  *
695c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_user_enter(), be sure to test with
696c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
6974102adabSPaul E. McKenney  */
6984102adabSPaul E. McKenney void rcu_user_enter(void)
6994102adabSPaul E. McKenney {
700b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
701d4db30afSPaul E. McKenney 	rcu_eqs_enter(true);
7024102adabSPaul E. McKenney }
703d1ec4c34SPaul E. McKenney #endif /* CONFIG_NO_HZ_FULL */
7044102adabSPaul E. McKenney 
705cf7614e1SByungchul Park /*
706fd581a91SPaul E. McKenney  * If we are returning from the outermost NMI handler that interrupted an
707fd581a91SPaul E. McKenney  * RCU-idle period, update rdtp->dynticks and rdtp->dynticks_nmi_nesting
708fd581a91SPaul E. McKenney  * to let the RCU grace-period handling know that the CPU is back to
709fd581a91SPaul E. McKenney  * being RCU-idle.
710fd581a91SPaul E. McKenney  *
711cf7614e1SByungchul Park  * If you add or remove a call to rcu_nmi_exit_common(), be sure to test
712fd581a91SPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
713fd581a91SPaul E. McKenney  */
714cf7614e1SByungchul Park static __always_inline void rcu_nmi_exit_common(bool irq)
715fd581a91SPaul E. McKenney {
716fd581a91SPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
717fd581a91SPaul E. McKenney 
718fd581a91SPaul E. McKenney 	/*
719fd581a91SPaul E. McKenney 	 * Check for ->dynticks_nmi_nesting underflow and bad ->dynticks.
720fd581a91SPaul E. McKenney 	 * (We are exiting an NMI handler, so RCU better be paying attention
721fd581a91SPaul E. McKenney 	 * to us!)
722fd581a91SPaul E. McKenney 	 */
723fd581a91SPaul E. McKenney 	WARN_ON_ONCE(rdtp->dynticks_nmi_nesting <= 0);
724fd581a91SPaul E. McKenney 	WARN_ON_ONCE(rcu_dynticks_curr_cpu_in_eqs());
725fd581a91SPaul E. McKenney 
726fd581a91SPaul E. McKenney 	/*
727fd581a91SPaul E. McKenney 	 * If the nesting level is not 1, the CPU wasn't RCU-idle, so
728fd581a91SPaul E. McKenney 	 * leave it in non-RCU-idle state.
729fd581a91SPaul E. McKenney 	 */
730fd581a91SPaul E. McKenney 	if (rdtp->dynticks_nmi_nesting != 1) {
731dec98900SPaul E. McKenney 		trace_rcu_dyntick(TPS("--="), rdtp->dynticks_nmi_nesting, rdtp->dynticks_nmi_nesting - 2, rdtp->dynticks);
732fd581a91SPaul E. McKenney 		WRITE_ONCE(rdtp->dynticks_nmi_nesting, /* No store tearing. */
733fd581a91SPaul E. McKenney 			   rdtp->dynticks_nmi_nesting - 2);
734fd581a91SPaul E. McKenney 		return;
735fd581a91SPaul E. McKenney 	}
736fd581a91SPaul E. McKenney 
737fd581a91SPaul E. McKenney 	/* This NMI interrupted an RCU-idle CPU, restore RCU-idleness. */
738dec98900SPaul E. McKenney 	trace_rcu_dyntick(TPS("Startirq"), rdtp->dynticks_nmi_nesting, 0, rdtp->dynticks);
739fd581a91SPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nmi_nesting, 0); /* Avoid store tearing. */
740cf7614e1SByungchul Park 
741cf7614e1SByungchul Park 	if (irq)
742cf7614e1SByungchul Park 		rcu_prepare_for_idle();
743cf7614e1SByungchul Park 
744fd581a91SPaul E. McKenney 	rcu_dynticks_eqs_enter();
745cf7614e1SByungchul Park 
746cf7614e1SByungchul Park 	if (irq)
747cf7614e1SByungchul Park 		rcu_dynticks_task_enter();
748cf7614e1SByungchul Park }
749cf7614e1SByungchul Park 
750cf7614e1SByungchul Park /**
751cf7614e1SByungchul Park  * rcu_nmi_exit - inform RCU of exit from NMI context
752cf7614e1SByungchul Park  * @irq: Is this call from rcu_irq_exit?
753cf7614e1SByungchul Park  *
754cf7614e1SByungchul Park  * If you add or remove a call to rcu_nmi_exit(), be sure to test
755cf7614e1SByungchul Park  * with CONFIG_RCU_EQS_DEBUG=y.
756cf7614e1SByungchul Park  */
757cf7614e1SByungchul Park void rcu_nmi_exit(void)
758cf7614e1SByungchul Park {
759cf7614e1SByungchul Park 	rcu_nmi_exit_common(false);
760fd581a91SPaul E. McKenney }
761fd581a91SPaul E. McKenney 
762fd581a91SPaul E. McKenney /**
7634102adabSPaul E. McKenney  * rcu_irq_exit - inform RCU that current CPU is exiting irq towards idle
7644102adabSPaul E. McKenney  *
7654102adabSPaul E. McKenney  * Exit from an interrupt handler, which might possibly result in entering
7664102adabSPaul E. McKenney  * idle mode, in other words, leaving the mode in which read-side critical
7677c9906caSPaul E. McKenney  * sections can occur.  The caller must have disabled interrupts.
7684102adabSPaul E. McKenney  *
7694102adabSPaul E. McKenney  * This code assumes that the idle loop never does anything that might
7704102adabSPaul E. McKenney  * result in unbalanced calls to irq_enter() and irq_exit().  If your
77158721f5dSPaul E. McKenney  * architecture's idle loop violates this assumption, RCU will give you what
77258721f5dSPaul E. McKenney  * you deserve, good and hard.  But very infrequently and irreproducibly.
7734102adabSPaul E. McKenney  *
7744102adabSPaul E. McKenney  * Use things like work queues to work around this limitation.
7754102adabSPaul E. McKenney  *
7764102adabSPaul E. McKenney  * You have been warned.
777c0da313eSPaul E. McKenney  *
778c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_irq_exit(), be sure to test with
779c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
7804102adabSPaul E. McKenney  */
7814102adabSPaul E. McKenney void rcu_irq_exit(void)
7824102adabSPaul E. McKenney {
783b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
784cf7614e1SByungchul Park 	rcu_nmi_exit_common(true);
7857c9906caSPaul E. McKenney }
7867c9906caSPaul E. McKenney 
7877c9906caSPaul E. McKenney /*
7887c9906caSPaul E. McKenney  * Wrapper for rcu_irq_exit() where interrupts are enabled.
789c0da313eSPaul E. McKenney  *
790c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_irq_exit_irqson(), be sure to test
791c0da313eSPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
7927c9906caSPaul E. McKenney  */
7937c9906caSPaul E. McKenney void rcu_irq_exit_irqson(void)
7947c9906caSPaul E. McKenney {
7957c9906caSPaul E. McKenney 	unsigned long flags;
7967c9906caSPaul E. McKenney 
7977c9906caSPaul E. McKenney 	local_irq_save(flags);
7987c9906caSPaul E. McKenney 	rcu_irq_exit();
7994102adabSPaul E. McKenney 	local_irq_restore(flags);
8004102adabSPaul E. McKenney }
8014102adabSPaul E. McKenney 
8024102adabSPaul E. McKenney /*
8034102adabSPaul E. McKenney  * Exit an RCU extended quiescent state, which can be either the
8044102adabSPaul E. McKenney  * idle loop or adaptive-tickless usermode execution.
80551a1fd30SPaul E. McKenney  *
80651a1fd30SPaul E. McKenney  * We crowbar the ->dynticks_nmi_nesting field to DYNTICK_IRQ_NONIDLE to
80751a1fd30SPaul E. McKenney  * allow for the possibility of usermode upcalls messing up our count of
80851a1fd30SPaul E. McKenney  * interrupt nesting level during the busy period that is just now starting.
8094102adabSPaul E. McKenney  */
8104102adabSPaul E. McKenney static void rcu_eqs_exit(bool user)
8114102adabSPaul E. McKenney {
8124102adabSPaul E. McKenney 	struct rcu_dynticks *rdtp;
81384585aa8SPaul E. McKenney 	long oldval;
8144102adabSPaul E. McKenney 
815b04db8e1SFrederic Weisbecker 	lockdep_assert_irqs_disabled();
8164102adabSPaul E. McKenney 	rdtp = this_cpu_ptr(&rcu_dynticks);
8174102adabSPaul E. McKenney 	oldval = rdtp->dynticks_nesting;
8181ce46ee5SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && oldval < 0);
81951a1fd30SPaul E. McKenney 	if (oldval) {
82051a1fd30SPaul E. McKenney 		rdtp->dynticks_nesting++;
8219dd238e2SPaul E. McKenney 		return;
8224102adabSPaul E. McKenney 	}
8239dd238e2SPaul E. McKenney 	rcu_dynticks_task_exit();
8249dd238e2SPaul E. McKenney 	rcu_dynticks_eqs_exit();
8259dd238e2SPaul E. McKenney 	rcu_cleanup_after_idle();
8269dd238e2SPaul E. McKenney 	trace_rcu_dyntick(TPS("End"), rdtp->dynticks_nesting, 1, rdtp->dynticks);
827e68bbb26SPaul E. McKenney 	WARN_ON_ONCE(IS_ENABLED(CONFIG_RCU_EQS_DEBUG) && !user && !is_idle_task(current));
8282342172fSPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nesting, 1);
829e11ec65cSPaul E. McKenney 	WARN_ON_ONCE(rdtp->dynticks_nmi_nesting);
8306136d6e4SPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nmi_nesting, DYNTICK_IRQ_NONIDLE);
8313a592405SPaul E. McKenney }
8324102adabSPaul E. McKenney 
8334102adabSPaul E. McKenney /**
8344102adabSPaul E. McKenney  * rcu_idle_exit - inform RCU that current CPU is leaving idle
8354102adabSPaul E. McKenney  *
8364102adabSPaul E. McKenney  * Exit idle mode, in other words, -enter- the mode in which RCU
8374102adabSPaul E. McKenney  * read-side critical sections can occur.
8384102adabSPaul E. McKenney  *
839c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_idle_exit(), be sure to test with
840c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
8414102adabSPaul E. McKenney  */
8424102adabSPaul E. McKenney void rcu_idle_exit(void)
8434102adabSPaul E. McKenney {
8444102adabSPaul E. McKenney 	unsigned long flags;
8454102adabSPaul E. McKenney 
8464102adabSPaul E. McKenney 	local_irq_save(flags);
8474102adabSPaul E. McKenney 	rcu_eqs_exit(false);
8484102adabSPaul E. McKenney 	local_irq_restore(flags);
8494102adabSPaul E. McKenney }
8504102adabSPaul E. McKenney 
851d1ec4c34SPaul E. McKenney #ifdef CONFIG_NO_HZ_FULL
8524102adabSPaul E. McKenney /**
8534102adabSPaul E. McKenney  * rcu_user_exit - inform RCU that we are exiting userspace.
8544102adabSPaul E. McKenney  *
8554102adabSPaul E. McKenney  * Exit RCU idle mode while entering the kernel because it can
8564102adabSPaul E. McKenney  * run a RCU read side critical section anytime.
857c0da313eSPaul E. McKenney  *
858c0da313eSPaul E. McKenney  * If you add or remove a call to rcu_user_exit(), be sure to test with
859c0da313eSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
8604102adabSPaul E. McKenney  */
8614102adabSPaul E. McKenney void rcu_user_exit(void)
8624102adabSPaul E. McKenney {
8634102adabSPaul E. McKenney 	rcu_eqs_exit(1);
8644102adabSPaul E. McKenney }
865d1ec4c34SPaul E. McKenney #endif /* CONFIG_NO_HZ_FULL */
8664102adabSPaul E. McKenney 
8674102adabSPaul E. McKenney /**
868cf7614e1SByungchul Park  * rcu_nmi_enter_common - inform RCU of entry to NMI context
869cf7614e1SByungchul Park  * @irq: Is this call from rcu_irq_enter?
8704102adabSPaul E. McKenney  *
871734d1680SPaul E. McKenney  * If the CPU was idle from RCU's viewpoint, update rdtp->dynticks and
872734d1680SPaul E. McKenney  * rdtp->dynticks_nmi_nesting to let the RCU grace-period handling know
873734d1680SPaul E. McKenney  * that the CPU is active.  This implementation permits nested NMIs, as
874734d1680SPaul E. McKenney  * long as the nesting level does not overflow an int.  (You will probably
875734d1680SPaul E. McKenney  * run out of stack space first.)
876c0da313eSPaul E. McKenney  *
877cf7614e1SByungchul Park  * If you add or remove a call to rcu_nmi_enter_common(), be sure to test
878c0da313eSPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
8794102adabSPaul E. McKenney  */
880cf7614e1SByungchul Park static __always_inline void rcu_nmi_enter_common(bool irq)
8814102adabSPaul E. McKenney {
8824102adabSPaul E. McKenney 	struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
88384585aa8SPaul E. McKenney 	long incby = 2;
8844102adabSPaul E. McKenney 
885734d1680SPaul E. McKenney 	/* Complain about underflow. */
886734d1680SPaul E. McKenney 	WARN_ON_ONCE(rdtp->dynticks_nmi_nesting < 0);
887734d1680SPaul E. McKenney 
888734d1680SPaul E. McKenney 	/*
889734d1680SPaul E. McKenney 	 * If idle from RCU viewpoint, atomically increment ->dynticks
890734d1680SPaul E. McKenney 	 * to mark non-idle and increment ->dynticks_nmi_nesting by one.
891734d1680SPaul E. McKenney 	 * Otherwise, increment ->dynticks_nmi_nesting by two.  This means
892734d1680SPaul E. McKenney 	 * if ->dynticks_nmi_nesting is equal to one, we are guaranteed
893734d1680SPaul E. McKenney 	 * to be in the outermost NMI handler that interrupted an RCU-idle
894734d1680SPaul E. McKenney 	 * period (observation due to Andy Lutomirski).
895734d1680SPaul E. McKenney 	 */
89602a5c550SPaul E. McKenney 	if (rcu_dynticks_curr_cpu_in_eqs()) {
897cf7614e1SByungchul Park 
898cf7614e1SByungchul Park 		if (irq)
899cf7614e1SByungchul Park 			rcu_dynticks_task_exit();
900cf7614e1SByungchul Park 
9012625d469SPaul E. McKenney 		rcu_dynticks_eqs_exit();
902cf7614e1SByungchul Park 
903cf7614e1SByungchul Park 		if (irq)
904cf7614e1SByungchul Park 			rcu_cleanup_after_idle();
905cf7614e1SByungchul Park 
906734d1680SPaul E. McKenney 		incby = 1;
907734d1680SPaul E. McKenney 	}
908bd2b879aSPaul E. McKenney 	trace_rcu_dyntick(incby == 1 ? TPS("Endirq") : TPS("++="),
909bd2b879aSPaul E. McKenney 			  rdtp->dynticks_nmi_nesting,
910dec98900SPaul E. McKenney 			  rdtp->dynticks_nmi_nesting + incby, rdtp->dynticks);
911fd581a91SPaul E. McKenney 	WRITE_ONCE(rdtp->dynticks_nmi_nesting, /* Prevent store tearing. */
912fd581a91SPaul E. McKenney 		   rdtp->dynticks_nmi_nesting + incby);
913734d1680SPaul E. McKenney 	barrier();
9144102adabSPaul E. McKenney }
9154102adabSPaul E. McKenney 
9164102adabSPaul E. McKenney /**
917cf7614e1SByungchul Park  * rcu_nmi_enter - inform RCU of entry to NMI context
918cf7614e1SByungchul Park  */
919cf7614e1SByungchul Park void rcu_nmi_enter(void)
920cf7614e1SByungchul Park {
921cf7614e1SByungchul Park 	rcu_nmi_enter_common(false);
922cf7614e1SByungchul Park }
923cf7614e1SByungchul Park 
924cf7614e1SByungchul Park /**
9254102adabSPaul E. McKenney  * rcu_irq_enter - inform RCU that current CPU is entering irq away from idle
9264102adabSPaul E. McKenney  *
9274102adabSPaul E. McKenney  * Enter an interrupt handler, which might possibly result in exiting
9284102adabSPaul E. McKenney  * idle mode, in other words, entering the mode in which read-side critical
9294102adabSPaul E. McKenney  * sections can occur.  The caller must have disabled interrupts.
930c0da313eSPaul E. McKenney  *
9314102adabSPaul E. McKenney  * Note that the Linux kernel is fully capable of entering an interrupt
93258721f5dSPaul E. McKenney  * handler that it never exits, for example when doing upcalls to user mode!
93358721f5dSPaul E. McKenney  * This code assumes that the idle loop never does upcalls to user mode.
93458721f5dSPaul E. McKenney  * If your architecture's idle loop does do upcalls to user mode (or does
93558721f5dSPaul E. McKenney  * anything else that results in unbalanced calls to the irq_enter() and
93658721f5dSPaul E. McKenney  * irq_exit() functions), RCU will give you what you deserve, good and hard.
93758721f5dSPaul E. McKenney  * But very infrequently and irreproducibly.
9384102adabSPaul E. McKenney  *
9394102adabSPaul E. McKenney  * Use things like work queues to work around this limitation.
9404102adabSPaul E. McKenney  *
9414102adabSPaul E. McKenney  * You have been warned.
9424102adabSPaul E. McKenney  *
9434102adabSPaul E. McKenney  * If you add or remove a call to rcu_irq_enter(), be sure to test with
9444102adabSPaul E. McKenney  * CONFIG_RCU_EQS_DEBUG=y.
9454102adabSPaul E. McKenney  */
9464102adabSPaul E. McKenney void rcu_irq_enter(void)
9474102adabSPaul E. McKenney {
9484102adabSPaul E. McKenney 	lockdep_assert_irqs_disabled();
949cf7614e1SByungchul Park 	rcu_nmi_enter_common(true);
950734d1680SPaul E. McKenney }
951734d1680SPaul E. McKenney 
9524102adabSPaul E. McKenney /*
9534102adabSPaul E. McKenney  * Wrapper for rcu_irq_enter() where interrupts are enabled.
9544102adabSPaul E. McKenney  *
9554102adabSPaul E. McKenney  * If you add or remove a call to rcu_irq_enter_irqson(), be sure to test
9564102adabSPaul E. McKenney  * with CONFIG_RCU_EQS_DEBUG=y.
9574102adabSPaul E. McKenney  */
9584102adabSPaul E. McKenney void rcu_irq_enter_irqson(void)
9594102adabSPaul E. McKenney {
9604102adabSPaul E. McKenney 	unsigned long flags;
9614102adabSPaul E. McKenney 
9624102adabSPaul E. McKenney 	local_irq_save(flags);
9634102adabSPaul E. McKenney 	rcu_irq_enter();
9644102adabSPaul E. McKenney 	local_irq_restore(flags);
9654102adabSPaul E. McKenney }
9664102adabSPaul E. McKenney 
9674102adabSPaul E. McKenney /**
9684102adabSPaul E. McKenney  * rcu_is_watching - see if RCU thinks that the current CPU is idle
9694102adabSPaul E. McKenney  *
970791875d1SPaul E. McKenney  * Return true if RCU is watching the running CPU, which means that this
971791875d1SPaul E. McKenney  * CPU can safely enter RCU read-side critical sections.  In other words,
972791875d1SPaul E. McKenney  * if the current CPU is in its idle loop and is neither in an interrupt
9734102adabSPaul E. McKenney  * or NMI handler, return true.
9744102adabSPaul E. McKenney  */
975b29c8306SLinus Torvalds bool notrace rcu_is_watching(void)
9764102adabSPaul E. McKenney {
977f534ed1fSPranith Kumar 	bool ret;
9784102adabSPaul E. McKenney 
97946f00d18SAlexei Starovoitov 	preempt_disable_notrace();
980791875d1SPaul E. McKenney 	ret = !rcu_dynticks_curr_cpu_in_eqs();
98146f00d18SAlexei Starovoitov 	preempt_enable_notrace();
9824102adabSPaul E. McKenney 	return ret;
9834102adabSPaul E. McKenney }
9844102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_is_watching);
9854102adabSPaul E. McKenney 
986bcbfdd01SPaul E. McKenney /*
987bcbfdd01SPaul E. McKenney  * If a holdout task is actually running, request an urgent quiescent
988bcbfdd01SPaul E. McKenney  * state from its CPU.  This is unsynchronized, so migrations can cause
989bcbfdd01SPaul E. McKenney  * the request to go to the wrong CPU.  Which is OK, all that will happen
990bcbfdd01SPaul E. McKenney  * is that the CPU's next context switch will be a bit slower and next
991bcbfdd01SPaul E. McKenney  * time around this task will generate another request.
992bcbfdd01SPaul E. McKenney  */
993bcbfdd01SPaul E. McKenney void rcu_request_urgent_qs_task(struct task_struct *t)
994bcbfdd01SPaul E. McKenney {
995bcbfdd01SPaul E. McKenney 	int cpu;
996bcbfdd01SPaul E. McKenney 
997bcbfdd01SPaul E. McKenney 	barrier();
998bcbfdd01SPaul E. McKenney 	cpu = task_cpu(t);
999bcbfdd01SPaul E. McKenney 	if (!task_curr(t))
1000bcbfdd01SPaul E. McKenney 		return; /* This task is not running on that CPU. */
1001bcbfdd01SPaul E. McKenney 	smp_store_release(per_cpu_ptr(&rcu_dynticks.rcu_urgent_qs, cpu), true);
1002bcbfdd01SPaul E. McKenney }
1003bcbfdd01SPaul E. McKenney 
10044102adabSPaul E. McKenney #if defined(CONFIG_PROVE_RCU) && defined(CONFIG_HOTPLUG_CPU)
10054102adabSPaul E. McKenney 
10064102adabSPaul E. McKenney /*
10075554788eSPaul E. McKenney  * Is the current CPU online as far as RCU is concerned?
10084102adabSPaul E. McKenney  *
10095554788eSPaul E. McKenney  * Disable preemption to avoid false positives that could otherwise
10105554788eSPaul E. McKenney  * happen due to the current CPU number being sampled, this task being
10115554788eSPaul E. McKenney  * preempted, its old CPU being taken offline, resuming on some other CPU,
10125554788eSPaul E. McKenney  * then determining that its old CPU is now offline.  Because there are
10135554788eSPaul E. McKenney  * multiple flavors of RCU, and because this function can be called in the
10145554788eSPaul E. McKenney  * midst of updating the flavors while a given CPU coming online or going
10155554788eSPaul E. McKenney  * offline, it is necessary to check all flavors.  If any of the flavors
10165554788eSPaul E. McKenney  * believe that given CPU is online, it is considered to be online.
10174102adabSPaul E. McKenney  *
10185554788eSPaul E. McKenney  * Disable checking if in an NMI handler because we cannot safely
10195554788eSPaul E. McKenney  * report errors from NMI handlers anyway.  In addition, it is OK to use
10205554788eSPaul E. McKenney  * RCU on an offline processor during initial boot, hence the check for
10215554788eSPaul E. McKenney  * rcu_scheduler_fully_active.
10224102adabSPaul E. McKenney  */
10234102adabSPaul E. McKenney bool rcu_lockdep_current_cpu_online(void)
10244102adabSPaul E. McKenney {
10254102adabSPaul E. McKenney 	struct rcu_data *rdp;
10264102adabSPaul E. McKenney 	struct rcu_node *rnp;
10275554788eSPaul E. McKenney 	struct rcu_state *rsp;
10284102adabSPaul E. McKenney 
10295554788eSPaul E. McKenney 	if (in_nmi() || !rcu_scheduler_fully_active)
1030f6f7ee9aSFengguang Wu 		return true;
10314102adabSPaul E. McKenney 	preempt_disable();
10325554788eSPaul E. McKenney 	for_each_rcu_flavor(rsp) {
1033da1df50dSPaul E. McKenney 		rdp = this_cpu_ptr(&rcu_data);
10344102adabSPaul E. McKenney 		rnp = rdp->mynode;
10355554788eSPaul E. McKenney 		if (rdp->grpmask & rcu_rnp_online_cpus(rnp)) {
10364102adabSPaul E. McKenney 			preempt_enable();
10375554788eSPaul E. McKenney 			return true;
10385554788eSPaul E. McKenney 		}
10395554788eSPaul E. McKenney 	}
10405554788eSPaul E. McKenney 	preempt_enable();
10415554788eSPaul E. McKenney 	return false;
10424102adabSPaul E. McKenney }
10434102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_lockdep_current_cpu_online);
10444102adabSPaul E. McKenney 
10454102adabSPaul E. McKenney #endif /* #if defined(CONFIG_PROVE_RCU) && defined(CONFIG_HOTPLUG_CPU) */
10464102adabSPaul E. McKenney 
10474102adabSPaul E. McKenney /*
10489b9500daSPaul E. McKenney  * We are reporting a quiescent state on behalf of some other CPU, so
10499b9500daSPaul E. McKenney  * it is our responsibility to check for and handle potential overflow
1050a66ae8aeSPaul E. McKenney  * of the rcu_node ->gp_seq counter with respect to the rcu_data counters.
10519b9500daSPaul E. McKenney  * After all, the CPU might be in deep idle state, and thus executing no
10529b9500daSPaul E. McKenney  * code whatsoever.
10539b9500daSPaul E. McKenney  */
10549b9500daSPaul E. McKenney static void rcu_gpnum_ovf(struct rcu_node *rnp, struct rcu_data *rdp)
10559b9500daSPaul E. McKenney {
1056a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1057a66ae8aeSPaul E. McKenney 	if (ULONG_CMP_LT(rcu_seq_current(&rdp->gp_seq) + ULONG_MAX / 4,
1058a66ae8aeSPaul E. McKenney 			 rnp->gp_seq))
10599b9500daSPaul E. McKenney 		WRITE_ONCE(rdp->gpwrap, true);
10608aa670cdSPaul E. McKenney 	if (ULONG_CMP_LT(rdp->rcu_iw_gp_seq + ULONG_MAX / 4, rnp->gp_seq))
10618aa670cdSPaul E. McKenney 		rdp->rcu_iw_gp_seq = rnp->gp_seq + ULONG_MAX / 4;
10629b9500daSPaul E. McKenney }
10639b9500daSPaul E. McKenney 
10649b9500daSPaul E. McKenney /*
10654102adabSPaul E. McKenney  * Snapshot the specified CPU's dynticks counter so that we can later
10664102adabSPaul E. McKenney  * credit them with an implicit quiescent state.  Return 1 if this CPU
10674102adabSPaul E. McKenney  * is in dynticks idle mode, which is an extended quiescent state.
10684102adabSPaul E. McKenney  */
1069fe5ac724SPaul E. McKenney static int dyntick_save_progress_counter(struct rcu_data *rdp)
10704102adabSPaul E. McKenney {
10718b2f63abSPaul E. McKenney 	rdp->dynticks_snap = rcu_dynticks_snap(rdp->dynticks);
107202a5c550SPaul E. McKenney 	if (rcu_dynticks_in_eqs(rdp->dynticks_snap)) {
1073fee5997cSPaul E. McKenney 		trace_rcu_fqs(rdp->rsp->name, rdp->gp_seq, rdp->cpu, TPS("dti"));
10749b9500daSPaul E. McKenney 		rcu_gpnum_ovf(rdp->mynode, rdp);
107523a9bacdSPaul E. McKenney 		return 1;
10767941dbdeSAndreea-Cristina Bernat 	}
107723a9bacdSPaul E. McKenney 	return 0;
10784102adabSPaul E. McKenney }
10794102adabSPaul E. McKenney 
10804102adabSPaul E. McKenney /*
10819b9500daSPaul E. McKenney  * Handler for the irq_work request posted when a grace period has
10829b9500daSPaul E. McKenney  * gone on for too long, but not yet long enough for an RCU CPU
10839b9500daSPaul E. McKenney  * stall warning.  Set state appropriately, but just complain if
10849b9500daSPaul E. McKenney  * there is unexpected state on entry.
10859b9500daSPaul E. McKenney  */
10869b9500daSPaul E. McKenney static void rcu_iw_handler(struct irq_work *iwp)
10879b9500daSPaul E. McKenney {
10889b9500daSPaul E. McKenney 	struct rcu_data *rdp;
10899b9500daSPaul E. McKenney 	struct rcu_node *rnp;
10909b9500daSPaul E. McKenney 
10919b9500daSPaul E. McKenney 	rdp = container_of(iwp, struct rcu_data, rcu_iw);
10929b9500daSPaul E. McKenney 	rnp = rdp->mynode;
10939b9500daSPaul E. McKenney 	raw_spin_lock_rcu_node(rnp);
10949b9500daSPaul E. McKenney 	if (!WARN_ON_ONCE(!rdp->rcu_iw_pending)) {
10958aa670cdSPaul E. McKenney 		rdp->rcu_iw_gp_seq = rnp->gp_seq;
10969b9500daSPaul E. McKenney 		rdp->rcu_iw_pending = false;
10979b9500daSPaul E. McKenney 	}
10989b9500daSPaul E. McKenney 	raw_spin_unlock_rcu_node(rnp);
10999b9500daSPaul E. McKenney }
11009b9500daSPaul E. McKenney 
11019b9500daSPaul E. McKenney /*
11024102adabSPaul E. McKenney  * Return true if the specified CPU has passed through a quiescent
11034102adabSPaul E. McKenney  * state by virtue of being in or having passed through an dynticks
11044102adabSPaul E. McKenney  * idle state since the last call to dyntick_save_progress_counter()
11054102adabSPaul E. McKenney  * for this same CPU, or by virtue of having been offline.
11064102adabSPaul E. McKenney  */
1107fe5ac724SPaul E. McKenney static int rcu_implicit_dynticks_qs(struct rcu_data *rdp)
11084102adabSPaul E. McKenney {
11093a19b46aSPaul E. McKenney 	unsigned long jtsq;
11100f9be8caSPaul E. McKenney 	bool *rnhqp;
11119226b10dSPaul E. McKenney 	bool *ruqp;
11129b9500daSPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;
11134102adabSPaul E. McKenney 
11144102adabSPaul E. McKenney 	/*
11154102adabSPaul E. McKenney 	 * If the CPU passed through or entered a dynticks idle phase with
11164102adabSPaul E. McKenney 	 * no active irq/NMI handlers, then we can safely pretend that the CPU
11174102adabSPaul E. McKenney 	 * already acknowledged the request to pass through a quiescent
11184102adabSPaul E. McKenney 	 * state.  Either way, that CPU cannot possibly be in an RCU
11194102adabSPaul E. McKenney 	 * read-side critical section that started before the beginning
11204102adabSPaul E. McKenney 	 * of the current RCU grace period.
11214102adabSPaul E. McKenney 	 */
112202a5c550SPaul E. McKenney 	if (rcu_dynticks_in_eqs_since(rdp->dynticks, rdp->dynticks_snap)) {
1123fee5997cSPaul E. McKenney 		trace_rcu_fqs(rdp->rsp->name, rdp->gp_seq, rdp->cpu, TPS("dti"));
11244102adabSPaul E. McKenney 		rdp->dynticks_fqs++;
11259b9500daSPaul E. McKenney 		rcu_gpnum_ovf(rnp, rdp);
11264102adabSPaul E. McKenney 		return 1;
11274102adabSPaul E. McKenney 	}
11284102adabSPaul E. McKenney 
11294102adabSPaul E. McKenney 	/*
1130cee43939SPaul E. McKenney 	 * Has this CPU encountered a cond_resched() since the beginning
1131cee43939SPaul E. McKenney 	 * of the grace period?  For this to be the case, the CPU has to
1132cee43939SPaul E. McKenney 	 * have noticed the current grace period.  This might not be the
1133cee43939SPaul E. McKenney 	 * case for nohz_full CPUs looping in the kernel.
11344102adabSPaul E. McKenney 	 */
1135f79c3ad6SPaul E. McKenney 	jtsq = jiffies_till_sched_qs;
11369226b10dSPaul E. McKenney 	ruqp = per_cpu_ptr(&rcu_dynticks.rcu_urgent_qs, rdp->cpu);
11373a19b46aSPaul E. McKenney 	if (time_after(jiffies, rdp->rsp->gp_start + jtsq) &&
11389577df9aSPaul E. McKenney 	    READ_ONCE(rdp->rcu_qs_ctr_snap) != per_cpu(rcu_dynticks.rcu_qs_ctr, rdp->cpu) &&
1139e05720b0SPaul E. McKenney 	    rcu_seq_current(&rdp->gp_seq) == rnp->gp_seq && !rdp->gpwrap) {
1140fee5997cSPaul E. McKenney 		trace_rcu_fqs(rdp->rsp->name, rdp->gp_seq, rdp->cpu, TPS("rqc"));
11419b9500daSPaul E. McKenney 		rcu_gpnum_ovf(rnp, rdp);
11423a19b46aSPaul E. McKenney 		return 1;
1143f79c3ad6SPaul E. McKenney 	} else if (time_after(jiffies, rdp->rsp->gp_start + jtsq)) {
11449226b10dSPaul E. McKenney 		/* Load rcu_qs_ctr before store to rcu_urgent_qs. */
11459226b10dSPaul E. McKenney 		smp_store_release(ruqp, true);
11463a19b46aSPaul E. McKenney 	}
11473a19b46aSPaul E. McKenney 
1148f2e2df59SPaul E. McKenney 	/* If waiting too long on an offline CPU, complain. */
1149f2e2df59SPaul E. McKenney 	if (!(rdp->grpmask & rcu_rnp_online_cpus(rnp)) &&
1150f2e2df59SPaul E. McKenney 	    time_after(jiffies, rdp->rsp->gp_start + HZ)) {
1151f2e2df59SPaul E. McKenney 		bool onl;
1152f2e2df59SPaul E. McKenney 		struct rcu_node *rnp1;
1153f2e2df59SPaul E. McKenney 
1154f2e2df59SPaul E. McKenney 		WARN_ON(1);  /* Offline CPUs are supposed to report QS! */
1155f2e2df59SPaul E. McKenney 		pr_info("%s: grp: %d-%d level: %d ->gp_seq %ld ->completedqs %ld\n",
1156f2e2df59SPaul E. McKenney 			__func__, rnp->grplo, rnp->grphi, rnp->level,
1157f2e2df59SPaul E. McKenney 			(long)rnp->gp_seq, (long)rnp->completedqs);
1158f2e2df59SPaul E. McKenney 		for (rnp1 = rnp; rnp1; rnp1 = rnp1->parent)
1159f2e2df59SPaul E. McKenney 			pr_info("%s: %d:%d ->qsmask %#lx ->qsmaskinit %#lx ->qsmaskinitnext %#lx ->rcu_gp_init_mask %#lx\n",
1160f2e2df59SPaul E. McKenney 				__func__, rnp1->grplo, rnp1->grphi, rnp1->qsmask, rnp1->qsmaskinit, rnp1->qsmaskinitnext, rnp1->rcu_gp_init_mask);
1161f2e2df59SPaul E. McKenney 		onl = !!(rdp->grpmask & rcu_rnp_online_cpus(rnp));
1162f2e2df59SPaul E. McKenney 		pr_info("%s %d: %c online: %ld(%d) offline: %ld(%d)\n",
1163f2e2df59SPaul E. McKenney 			__func__, rdp->cpu, ".o"[onl],
1164f2e2df59SPaul E. McKenney 			(long)rdp->rcu_onl_gp_seq, rdp->rcu_onl_gp_flags,
1165f2e2df59SPaul E. McKenney 			(long)rdp->rcu_ofl_gp_seq, rdp->rcu_ofl_gp_flags);
1166f2e2df59SPaul E. McKenney 		return 1; /* Break things loose after complaining. */
1167f2e2df59SPaul E. McKenney 	}
1168f2e2df59SPaul E. McKenney 
11694102adabSPaul E. McKenney 	/*
11704a81e832SPaul E. McKenney 	 * A CPU running for an extended time within the kernel can
11714a81e832SPaul E. McKenney 	 * delay RCU grace periods.  When the CPU is in NO_HZ_FULL mode,
11724a81e832SPaul E. McKenney 	 * even context-switching back and forth between a pair of
11734a81e832SPaul E. McKenney 	 * in-kernel CPU-bound tasks cannot advance grace periods.
11744a81e832SPaul E. McKenney 	 * So if the grace period is old enough, make the CPU pay attention.
11754a81e832SPaul E. McKenney 	 * Note that the unsynchronized assignments to the per-CPU
11760f9be8caSPaul E. McKenney 	 * rcu_need_heavy_qs variable are safe.  Yes, setting of
11774a81e832SPaul E. McKenney 	 * bits can be lost, but they will be set again on the next
11784a81e832SPaul E. McKenney 	 * force-quiescent-state pass.  So lost bit sets do not result
11794a81e832SPaul E. McKenney 	 * in incorrect behavior, merely in a grace period lasting
11804a81e832SPaul E. McKenney 	 * a few jiffies longer than it might otherwise.  Because
11814a81e832SPaul E. McKenney 	 * there are at most four threads involved, and because the
11824a81e832SPaul E. McKenney 	 * updates are only once every few jiffies, the probability of
11834a81e832SPaul E. McKenney 	 * lossage (and thus of slight grace-period extension) is
11844a81e832SPaul E. McKenney 	 * quite low.
11854102adabSPaul E. McKenney 	 */
11860f9be8caSPaul E. McKenney 	rnhqp = &per_cpu(rcu_dynticks.rcu_need_heavy_qs, rdp->cpu);
11870f9be8caSPaul E. McKenney 	if (!READ_ONCE(*rnhqp) &&
11880f9be8caSPaul E. McKenney 	    (time_after(jiffies, rdp->rsp->gp_start + jtsq) ||
11890f9be8caSPaul E. McKenney 	     time_after(jiffies, rdp->rsp->jiffies_resched))) {
11900f9be8caSPaul E. McKenney 		WRITE_ONCE(*rnhqp, true);
11919226b10dSPaul E. McKenney 		/* Store rcu_need_heavy_qs before rcu_urgent_qs. */
11929226b10dSPaul E. McKenney 		smp_store_release(ruqp, true);
1193f79c3ad6SPaul E. McKenney 		rdp->rsp->jiffies_resched += jtsq; /* Re-enable beating. */
11944a81e832SPaul E. McKenney 	}
11954914950aSPaul E. McKenney 
119628053bc7SPaul E. McKenney 	/*
11979b9500daSPaul E. McKenney 	 * If more than halfway to RCU CPU stall-warning time, do a
11989b9500daSPaul E. McKenney 	 * resched_cpu() to try to loosen things up a bit.  Also check to
11999b9500daSPaul E. McKenney 	 * see if the CPU is getting hammered with interrupts, but only
12009b9500daSPaul E. McKenney 	 * once per grace period, just to keep the IPIs down to a dull roar.
120128053bc7SPaul E. McKenney 	 */
12029b9500daSPaul E. McKenney 	if (jiffies - rdp->rsp->gp_start > rcu_jiffies_till_stall_check() / 2) {
120328053bc7SPaul E. McKenney 		resched_cpu(rdp->cpu);
12049b9500daSPaul E. McKenney 		if (IS_ENABLED(CONFIG_IRQ_WORK) &&
12058aa670cdSPaul E. McKenney 		    !rdp->rcu_iw_pending && rdp->rcu_iw_gp_seq != rnp->gp_seq &&
12069b9500daSPaul E. McKenney 		    (rnp->ffmask & rdp->grpmask)) {
12079b9500daSPaul E. McKenney 			init_irq_work(&rdp->rcu_iw, rcu_iw_handler);
12089b9500daSPaul E. McKenney 			rdp->rcu_iw_pending = true;
12098aa670cdSPaul E. McKenney 			rdp->rcu_iw_gp_seq = rnp->gp_seq;
12109b9500daSPaul E. McKenney 			irq_work_queue_on(&rdp->rcu_iw, rdp->cpu);
12119b9500daSPaul E. McKenney 		}
12129b9500daSPaul E. McKenney 	}
12136193c76aSPaul E. McKenney 
12144102adabSPaul E. McKenney 	return 0;
12154102adabSPaul E. McKenney }
12164102adabSPaul E. McKenney 
1217ad3832e9SPaul E. McKenney static void record_gp_stall_check_time(void)
12184102adabSPaul E. McKenney {
1219cb1e78cfSPaul E. McKenney 	unsigned long j = jiffies;
12206193c76aSPaul E. McKenney 	unsigned long j1;
12214102adabSPaul E. McKenney 
1222ad3832e9SPaul E. McKenney 	rcu_state.gp_start = j;
12236193c76aSPaul E. McKenney 	j1 = rcu_jiffies_till_stall_check();
122491f63cedSPaul E. McKenney 	/* Record ->gp_start before ->jiffies_stall. */
1225ad3832e9SPaul E. McKenney 	smp_store_release(&rcu_state.jiffies_stall, j + j1); /* ^^^ */
1226ad3832e9SPaul E. McKenney 	rcu_state.jiffies_resched = j + j1 / 2;
1227ad3832e9SPaul E. McKenney 	rcu_state.n_force_qs_gpstart = READ_ONCE(rcu_state.n_force_qs);
12284102adabSPaul E. McKenney }
12294102adabSPaul E. McKenney 
12304102adabSPaul E. McKenney /*
12316b50e119SPaul E. McKenney  * Convert a ->gp_state value to a character string.
12326b50e119SPaul E. McKenney  */
12336b50e119SPaul E. McKenney static const char *gp_state_getname(short gs)
12346b50e119SPaul E. McKenney {
12356b50e119SPaul E. McKenney 	if (gs < 0 || gs >= ARRAY_SIZE(gp_state_names))
12366b50e119SPaul E. McKenney 		return "???";
12376b50e119SPaul E. McKenney 	return gp_state_names[gs];
12386b50e119SPaul E. McKenney }
12396b50e119SPaul E. McKenney 
12406b50e119SPaul E. McKenney /*
1241fb81a44bSPaul E. McKenney  * Complain about starvation of grace-period kthread.
1242fb81a44bSPaul E. McKenney  */
12438fd119b6SPaul E. McKenney static void rcu_check_gp_kthread_starvation(void)
1244fb81a44bSPaul E. McKenney {
1245fb81a44bSPaul E. McKenney 	unsigned long gpa;
1246fb81a44bSPaul E. McKenney 	unsigned long j;
12478fd119b6SPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
1248fb81a44bSPaul E. McKenney 
1249fb81a44bSPaul E. McKenney 	j = jiffies;
12507d0ae808SPaul E. McKenney 	gpa = READ_ONCE(rsp->gp_activity);
1251b1adb3e2SPaul E. McKenney 	if (j - gpa > 2 * HZ) {
125278c5a67fSPaul E. McKenney 		pr_err("%s kthread starved for %ld jiffies! g%ld f%#x %s(%d) ->state=%#lx ->cpu=%d\n",
125381e701e4SPaul E. McKenney 		       rsp->name, j - gpa,
125478c5a67fSPaul E. McKenney 		       (long)rcu_seq_current(&rsp->gp_seq),
12556b50e119SPaul E. McKenney 		       rsp->gp_flags,
12566b50e119SPaul E. McKenney 		       gp_state_getname(rsp->gp_state), rsp->gp_state,
125796036c43SPaul E. McKenney 		       rsp->gp_kthread ? rsp->gp_kthread->state : ~0,
125896036c43SPaul E. McKenney 		       rsp->gp_kthread ? task_cpu(rsp->gp_kthread) : -1);
125986057b80SPaul E. McKenney 		if (rsp->gp_kthread) {
1260d07aee2cSPaul E. McKenney 			pr_err("RCU grace-period kthread stack dump:\n");
1261b1adb3e2SPaul E. McKenney 			sched_show_task(rsp->gp_kthread);
126286057b80SPaul E. McKenney 			wake_up_process(rsp->gp_kthread);
126386057b80SPaul E. McKenney 		}
1264b1adb3e2SPaul E. McKenney 	}
12654102adabSPaul E. McKenney }
12664102adabSPaul E. McKenney 
12674102adabSPaul E. McKenney /*
12687aa92230SPaul E. McKenney  * Dump stacks of all tasks running on stalled CPUs.  First try using
12697aa92230SPaul E. McKenney  * NMIs, but fall back to manual remote stack tracing on architectures
12707aa92230SPaul E. McKenney  * that don't support NMI-based stack dumps.  The NMI-triggered stack
12717aa92230SPaul E. McKenney  * traces are more accurate because they are printed by the target CPU.
12724102adabSPaul E. McKenney  */
127333dbdbf0SPaul E. McKenney static void rcu_dump_cpu_stacks(void)
12744102adabSPaul E. McKenney {
12754102adabSPaul E. McKenney 	int cpu;
12764102adabSPaul E. McKenney 	unsigned long flags;
12774102adabSPaul E. McKenney 	struct rcu_node *rnp;
12784102adabSPaul E. McKenney 
127933dbdbf0SPaul E. McKenney 	rcu_for_each_leaf_node(&rcu_state, rnp) {
12806cf10081SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
1281bc75e999SMark Rutland 		for_each_leaf_node_possible_cpu(rnp, cpu)
1282bc75e999SMark Rutland 			if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu))
12837aa92230SPaul E. McKenney 				if (!trigger_single_cpu_backtrace(cpu))
1284bc75e999SMark Rutland 					dump_cpu_task(cpu);
128567c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
12864102adabSPaul E. McKenney 	}
12874102adabSPaul E. McKenney }
12884102adabSPaul E. McKenney 
12898c7c4829SPaul E. McKenney /*
12908c7c4829SPaul E. McKenney  * If too much time has passed in the current grace period, and if
12918c7c4829SPaul E. McKenney  * so configured, go kick the relevant kthreads.
12928c7c4829SPaul E. McKenney  */
1293e1741c69SPaul E. McKenney static void rcu_stall_kick_kthreads(void)
12948c7c4829SPaul E. McKenney {
12958c7c4829SPaul E. McKenney 	unsigned long j;
1296e1741c69SPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
12978c7c4829SPaul E. McKenney 
12988c7c4829SPaul E. McKenney 	if (!rcu_kick_kthreads)
12998c7c4829SPaul E. McKenney 		return;
13008c7c4829SPaul E. McKenney 	j = READ_ONCE(rsp->jiffies_kick_kthreads);
1301aa3e0bf1SPaul E. McKenney 	if (time_after(jiffies, j) && rsp->gp_kthread &&
1302de8e8730SPaul E. McKenney 	    (rcu_gp_in_progress() || READ_ONCE(rsp->gp_flags))) {
13038c7c4829SPaul E. McKenney 		WARN_ONCE(1, "Kicking %s grace-period kthread\n", rsp->name);
13045dffed1eSPaul E. McKenney 		rcu_ftrace_dump(DUMP_ALL);
13058c7c4829SPaul E. McKenney 		wake_up_process(rsp->gp_kthread);
13068c7c4829SPaul E. McKenney 		WRITE_ONCE(rsp->jiffies_kick_kthreads, j + HZ);
13078c7c4829SPaul E. McKenney 	}
13088c7c4829SPaul E. McKenney }
13098c7c4829SPaul E. McKenney 
131095394e69SPaul E. McKenney static void panic_on_rcu_stall(void)
1311088e9d25SDaniel Bristot de Oliveira {
1312088e9d25SDaniel Bristot de Oliveira 	if (sysctl_panic_on_rcu_stall)
1313088e9d25SDaniel Bristot de Oliveira 		panic("RCU Stall\n");
1314088e9d25SDaniel Bristot de Oliveira }
1315088e9d25SDaniel Bristot de Oliveira 
1316a91e7e58SPaul E. McKenney static void print_other_cpu_stall(unsigned long gp_seq)
13174102adabSPaul E. McKenney {
13184102adabSPaul E. McKenney 	int cpu;
13194102adabSPaul E. McKenney 	unsigned long flags;
13206ccd2ecdSPaul E. McKenney 	unsigned long gpa;
13216ccd2ecdSPaul E. McKenney 	unsigned long j;
13224102adabSPaul E. McKenney 	int ndetected = 0;
1323336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
1324a91e7e58SPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
13254102adabSPaul E. McKenney 	long totqlen = 0;
13264102adabSPaul E. McKenney 
13278c7c4829SPaul E. McKenney 	/* Kick and suppress, if so configured. */
1328e1741c69SPaul E. McKenney 	rcu_stall_kick_kthreads();
13298c7c4829SPaul E. McKenney 	if (rcu_cpu_stall_suppress)
13308c7c4829SPaul E. McKenney 		return;
13318c7c4829SPaul E. McKenney 
13324102adabSPaul E. McKenney 	/*
13334102adabSPaul E. McKenney 	 * OK, time to rat on our buddy...
13344102adabSPaul E. McKenney 	 * See Documentation/RCU/stallwarn.txt for info on how to debug
13354102adabSPaul E. McKenney 	 * RCU CPU stall warnings.
13364102adabSPaul E. McKenney 	 */
1337a7538352SJoe Perches 	pr_err("INFO: %s detected stalls on CPUs/tasks:", rsp->name);
13384102adabSPaul E. McKenney 	print_cpu_stall_info_begin();
13394102adabSPaul E. McKenney 	rcu_for_each_leaf_node(rsp, rnp) {
13406cf10081SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
13414102adabSPaul E. McKenney 		ndetected += rcu_print_task_stall(rnp);
13424102adabSPaul E. McKenney 		if (rnp->qsmask != 0) {
1343bc75e999SMark Rutland 			for_each_leaf_node_possible_cpu(rnp, cpu)
1344bc75e999SMark Rutland 				if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu)) {
1345bc75e999SMark Rutland 					print_cpu_stall_info(rsp, cpu);
13464102adabSPaul E. McKenney 					ndetected++;
13474102adabSPaul E. McKenney 				}
13484102adabSPaul E. McKenney 		}
134967c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
13504102adabSPaul E. McKenney 	}
13514102adabSPaul E. McKenney 
13524102adabSPaul E. McKenney 	print_cpu_stall_info_end();
13534102adabSPaul E. McKenney 	for_each_possible_cpu(cpu)
1354da1df50dSPaul E. McKenney 		totqlen += rcu_segcblist_n_cbs(&per_cpu_ptr(&rcu_data,
135515fecf89SPaul E. McKenney 							    cpu)->cblist);
1356471f87c3SPaul E. McKenney 	pr_cont("(detected by %d, t=%ld jiffies, g=%ld, q=%lu)\n",
13574102adabSPaul E. McKenney 	       smp_processor_id(), (long)(jiffies - rsp->gp_start),
1358471f87c3SPaul E. McKenney 	       (long)rcu_seq_current(&rsp->gp_seq), totqlen);
13596ccd2ecdSPaul E. McKenney 	if (ndetected) {
136033dbdbf0SPaul E. McKenney 		rcu_dump_cpu_stacks();
1361c4402b27SByungchul Park 
1362c4402b27SByungchul Park 		/* Complain about tasks blocking the grace period. */
1363c4402b27SByungchul Park 		rcu_print_detail_task_stall(rsp);
13646ccd2ecdSPaul E. McKenney 	} else {
1365471f87c3SPaul E. McKenney 		if (rcu_seq_current(&rsp->gp_seq) != gp_seq) {
13666ccd2ecdSPaul E. McKenney 			pr_err("INFO: Stall ended before state dump start\n");
13676ccd2ecdSPaul E. McKenney 		} else {
13686ccd2ecdSPaul E. McKenney 			j = jiffies;
13697d0ae808SPaul E. McKenney 			gpa = READ_ONCE(rsp->gp_activity);
1370237a0f21SPaul E. McKenney 			pr_err("All QSes seen, last %s kthread activity %ld (%ld-%ld), jiffies_till_next_fqs=%ld, root ->qsmask %#lx\n",
13716ccd2ecdSPaul E. McKenney 			       rsp->name, j - gpa, j, gpa,
1372237a0f21SPaul E. McKenney 			       jiffies_till_next_fqs,
1373336a4f6cSPaul E. McKenney 			       rcu_get_root()->qsmask);
13746ccd2ecdSPaul E. McKenney 			/* In this case, the current CPU might be at fault. */
13756ccd2ecdSPaul E. McKenney 			sched_show_task(current);
13766ccd2ecdSPaul E. McKenney 		}
13776ccd2ecdSPaul E. McKenney 	}
13788c42b1f3SPaul E. McKenney 	/* Rewrite if needed in case of slow consoles. */
13798c42b1f3SPaul E. McKenney 	if (ULONG_CMP_GE(jiffies, READ_ONCE(rsp->jiffies_stall)))
13808c42b1f3SPaul E. McKenney 		WRITE_ONCE(rsp->jiffies_stall,
13818c42b1f3SPaul E. McKenney 			   jiffies + 3 * rcu_jiffies_till_stall_check() + 3);
13824102adabSPaul E. McKenney 
13838fd119b6SPaul E. McKenney 	rcu_check_gp_kthread_starvation();
1384fb81a44bSPaul E. McKenney 
1385088e9d25SDaniel Bristot de Oliveira 	panic_on_rcu_stall();
1386088e9d25SDaniel Bristot de Oliveira 
1387e9ecb780SPaul E. McKenney 	force_quiescent_state();  /* Kick them all. */
13884102adabSPaul E. McKenney }
13894102adabSPaul E. McKenney 
13904e8b8e08SPaul E. McKenney static void print_cpu_stall(void)
13914102adabSPaul E. McKenney {
13924102adabSPaul E. McKenney 	int cpu;
13934102adabSPaul E. McKenney 	unsigned long flags;
1394da1df50dSPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
1395336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
13964e8b8e08SPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
13974102adabSPaul E. McKenney 	long totqlen = 0;
13984102adabSPaul E. McKenney 
13998c7c4829SPaul E. McKenney 	/* Kick and suppress, if so configured. */
1400e1741c69SPaul E. McKenney 	rcu_stall_kick_kthreads();
14018c7c4829SPaul E. McKenney 	if (rcu_cpu_stall_suppress)
14028c7c4829SPaul E. McKenney 		return;
14038c7c4829SPaul E. McKenney 
14044102adabSPaul E. McKenney 	/*
14054102adabSPaul E. McKenney 	 * OK, time to rat on ourselves...
14064102adabSPaul E. McKenney 	 * See Documentation/RCU/stallwarn.txt for info on how to debug
14074102adabSPaul E. McKenney 	 * RCU CPU stall warnings.
14084102adabSPaul E. McKenney 	 */
14094102adabSPaul E. McKenney 	pr_err("INFO: %s self-detected stall on CPU", rsp->name);
14104102adabSPaul E. McKenney 	print_cpu_stall_info_begin();
14119b9500daSPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rdp->mynode, flags);
14124102adabSPaul E. McKenney 	print_cpu_stall_info(rsp, smp_processor_id());
14139b9500daSPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rdp->mynode, flags);
14144102adabSPaul E. McKenney 	print_cpu_stall_info_end();
14154102adabSPaul E. McKenney 	for_each_possible_cpu(cpu)
1416da1df50dSPaul E. McKenney 		totqlen += rcu_segcblist_n_cbs(&per_cpu_ptr(&rcu_data,
141715fecf89SPaul E. McKenney 							    cpu)->cblist);
1418471f87c3SPaul E. McKenney 	pr_cont(" (t=%lu jiffies g=%ld q=%lu)\n",
141983ebe63eSPaul E. McKenney 		jiffies - rsp->gp_start,
1420471f87c3SPaul E. McKenney 		(long)rcu_seq_current(&rsp->gp_seq), totqlen);
1421fb81a44bSPaul E. McKenney 
14228fd119b6SPaul E. McKenney 	rcu_check_gp_kthread_starvation();
1423fb81a44bSPaul E. McKenney 
142433dbdbf0SPaul E. McKenney 	rcu_dump_cpu_stacks();
14254102adabSPaul E. McKenney 
14266cf10081SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
14278c42b1f3SPaul E. McKenney 	/* Rewrite if needed in case of slow consoles. */
14287d0ae808SPaul E. McKenney 	if (ULONG_CMP_GE(jiffies, READ_ONCE(rsp->jiffies_stall)))
14297d0ae808SPaul E. McKenney 		WRITE_ONCE(rsp->jiffies_stall,
14307d0ae808SPaul E. McKenney 			   jiffies + 3 * rcu_jiffies_till_stall_check() + 3);
143167c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
14324102adabSPaul E. McKenney 
1433088e9d25SDaniel Bristot de Oliveira 	panic_on_rcu_stall();
1434088e9d25SDaniel Bristot de Oliveira 
143539cf275aSLinus Torvalds 	/*
143639cf275aSLinus Torvalds 	 * Attempt to revive the RCU machinery by forcing a context switch.
143739cf275aSLinus Torvalds 	 *
143839cf275aSLinus Torvalds 	 * A context switch would normally allow the RCU state machine to make
143939cf275aSLinus Torvalds 	 * progress and it could be we're stuck in kernel space without context
144039cf275aSLinus Torvalds 	 * switches for an entirely unreasonable amount of time.
144139cf275aSLinus Torvalds 	 */
144239cf275aSLinus Torvalds 	resched_cpu(smp_processor_id());
14434102adabSPaul E. McKenney }
14444102adabSPaul E. McKenney 
1445ea12ff2bSPaul E. McKenney static void check_cpu_stall(struct rcu_data *rdp)
14464102adabSPaul E. McKenney {
1447471f87c3SPaul E. McKenney 	unsigned long gs1;
1448471f87c3SPaul E. McKenney 	unsigned long gs2;
14494102adabSPaul E. McKenney 	unsigned long gps;
14504102adabSPaul E. McKenney 	unsigned long j;
14518c42b1f3SPaul E. McKenney 	unsigned long jn;
14524102adabSPaul E. McKenney 	unsigned long js;
14534102adabSPaul E. McKenney 	struct rcu_node *rnp;
1454ea12ff2bSPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
14554102adabSPaul E. McKenney 
14568c7c4829SPaul E. McKenney 	if ((rcu_cpu_stall_suppress && !rcu_kick_kthreads) ||
1457de8e8730SPaul E. McKenney 	    !rcu_gp_in_progress())
14584102adabSPaul E. McKenney 		return;
1459e1741c69SPaul E. McKenney 	rcu_stall_kick_kthreads();
1460cb1e78cfSPaul E. McKenney 	j = jiffies;
14614102adabSPaul E. McKenney 
14624102adabSPaul E. McKenney 	/*
14634102adabSPaul E. McKenney 	 * Lots of memory barriers to reject false positives.
14644102adabSPaul E. McKenney 	 *
1465471f87c3SPaul E. McKenney 	 * The idea is to pick up rsp->gp_seq, then rsp->jiffies_stall,
1466471f87c3SPaul E. McKenney 	 * then rsp->gp_start, and finally another copy of rsp->gp_seq.
1467471f87c3SPaul E. McKenney 	 * These values are updated in the opposite order with memory
1468471f87c3SPaul E. McKenney 	 * barriers (or equivalent) during grace-period initialization
1469471f87c3SPaul E. McKenney 	 * and cleanup.  Now, a false positive can occur if we get an new
1470471f87c3SPaul E. McKenney 	 * value of rsp->gp_start and a old value of rsp->jiffies_stall.
1471471f87c3SPaul E. McKenney 	 * But given the memory barriers, the only way that this can happen
1472471f87c3SPaul E. McKenney 	 * is if one grace period ends and another starts between these
1473471f87c3SPaul E. McKenney 	 * two fetches.  This is detected by comparing the second fetch
1474471f87c3SPaul E. McKenney 	 * of rsp->gp_seq with the previous fetch from rsp->gp_seq.
14754102adabSPaul E. McKenney 	 *
14764102adabSPaul E. McKenney 	 * Given this check, comparisons of jiffies, rsp->jiffies_stall,
14774102adabSPaul E. McKenney 	 * and rsp->gp_start suffice to forestall false positives.
14784102adabSPaul E. McKenney 	 */
1479471f87c3SPaul E. McKenney 	gs1 = READ_ONCE(rsp->gp_seq);
1480471f87c3SPaul E. McKenney 	smp_rmb(); /* Pick up ->gp_seq first... */
14817d0ae808SPaul E. McKenney 	js = READ_ONCE(rsp->jiffies_stall);
14824102adabSPaul E. McKenney 	smp_rmb(); /* ...then ->jiffies_stall before the rest... */
14837d0ae808SPaul E. McKenney 	gps = READ_ONCE(rsp->gp_start);
1484471f87c3SPaul E. McKenney 	smp_rmb(); /* ...and finally ->gp_start before ->gp_seq again. */
1485471f87c3SPaul E. McKenney 	gs2 = READ_ONCE(rsp->gp_seq);
1486471f87c3SPaul E. McKenney 	if (gs1 != gs2 ||
14874102adabSPaul E. McKenney 	    ULONG_CMP_LT(j, js) ||
14884102adabSPaul E. McKenney 	    ULONG_CMP_GE(gps, js))
14894102adabSPaul E. McKenney 		return; /* No stall or GP completed since entering function. */
14904102adabSPaul E. McKenney 	rnp = rdp->mynode;
14918c42b1f3SPaul E. McKenney 	jn = jiffies + 3 * rcu_jiffies_till_stall_check() + 3;
1492de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress() &&
14938c42b1f3SPaul E. McKenney 	    (READ_ONCE(rnp->qsmask) & rdp->grpmask) &&
14948c42b1f3SPaul E. McKenney 	    cmpxchg(&rsp->jiffies_stall, js, jn) == js) {
14954102adabSPaul E. McKenney 
14964102adabSPaul E. McKenney 		/* We haven't checked in, so go dump stack. */
14974e8b8e08SPaul E. McKenney 		print_cpu_stall();
14984102adabSPaul E. McKenney 
1499de8e8730SPaul E. McKenney 	} else if (rcu_gp_in_progress() &&
15008c42b1f3SPaul E. McKenney 		   ULONG_CMP_GE(j, js + RCU_STALL_RAT_DELAY) &&
15018c42b1f3SPaul E. McKenney 		   cmpxchg(&rsp->jiffies_stall, js, jn) == js) {
15024102adabSPaul E. McKenney 
15034102adabSPaul E. McKenney 		/* They had a few time units to dump stack, so complain. */
1504a91e7e58SPaul E. McKenney 		print_other_cpu_stall(gs2);
15054102adabSPaul E. McKenney 	}
15064102adabSPaul E. McKenney }
15074102adabSPaul E. McKenney 
15084102adabSPaul E. McKenney /**
15094102adabSPaul E. McKenney  * rcu_cpu_stall_reset - prevent further stall warnings in current grace period
15104102adabSPaul E. McKenney  *
15114102adabSPaul E. McKenney  * Set the stall-warning timeout way off into the future, thus preventing
15124102adabSPaul E. McKenney  * any RCU CPU stall-warning messages from appearing in the current set of
15134102adabSPaul E. McKenney  * RCU grace periods.
15144102adabSPaul E. McKenney  *
15154102adabSPaul E. McKenney  * The caller must disable hard irqs.
15164102adabSPaul E. McKenney  */
15174102adabSPaul E. McKenney void rcu_cpu_stall_reset(void)
15184102adabSPaul E. McKenney {
15194102adabSPaul E. McKenney 	struct rcu_state *rsp;
15204102adabSPaul E. McKenney 
15214102adabSPaul E. McKenney 	for_each_rcu_flavor(rsp)
15227d0ae808SPaul E. McKenney 		WRITE_ONCE(rsp->jiffies_stall, jiffies + ULONG_MAX / 2);
15234102adabSPaul E. McKenney }
15244102adabSPaul E. McKenney 
152541e80595SPaul E. McKenney /* Trace-event wrapper function for trace_rcu_future_grace_period.  */
152641e80595SPaul E. McKenney static void trace_rcu_this_gp(struct rcu_node *rnp, struct rcu_data *rdp,
1527b73de91dSJoel Fernandes 			      unsigned long gp_seq_req, const char *s)
15284102adabSPaul E. McKenney {
1529b73de91dSJoel Fernandes 	trace_rcu_future_grace_period(rdp->rsp->name, rnp->gp_seq, gp_seq_req,
1530abd13fddSPaul E. McKenney 				      rnp->level, rnp->grplo, rnp->grphi, s);
15314102adabSPaul E. McKenney }
15324102adabSPaul E. McKenney 
15334102adabSPaul E. McKenney /*
1534b73de91dSJoel Fernandes  * rcu_start_this_gp - Request the start of a particular grace period
1535df2bf8f7SJoel Fernandes (Google)  * @rnp_start: The leaf node of the CPU from which to start.
1536b73de91dSJoel Fernandes  * @rdp: The rcu_data corresponding to the CPU from which to start.
1537b73de91dSJoel Fernandes  * @gp_seq_req: The gp_seq of the grace period to start.
1538b73de91dSJoel Fernandes  *
153941e80595SPaul E. McKenney  * Start the specified grace period, as needed to handle newly arrived
15404102adabSPaul E. McKenney  * callbacks.  The required future grace periods are recorded in each
15417a1d0f23SPaul E. McKenney  * rcu_node structure's ->gp_seq_needed field.  Returns true if there
154248a7639cSPaul E. McKenney  * is reason to awaken the grace-period kthread.
15434102adabSPaul E. McKenney  *
1544d5cd9685SPaul E. McKenney  * The caller must hold the specified rcu_node structure's ->lock, which
1545d5cd9685SPaul E. McKenney  * is why the caller is responsible for waking the grace-period kthread.
1546b73de91dSJoel Fernandes  *
1547b73de91dSJoel Fernandes  * Returns true if the GP thread needs to be awakened else false.
15484102adabSPaul E. McKenney  */
1549df2bf8f7SJoel Fernandes (Google) static bool rcu_start_this_gp(struct rcu_node *rnp_start, struct rcu_data *rdp,
1550b73de91dSJoel Fernandes 			      unsigned long gp_seq_req)
15514102adabSPaul E. McKenney {
155248a7639cSPaul E. McKenney 	bool ret = false;
1553d5cd9685SPaul E. McKenney 	struct rcu_state *rsp = rdp->rsp;
1554df2bf8f7SJoel Fernandes (Google) 	struct rcu_node *rnp;
15554102adabSPaul E. McKenney 
1556360e0da6SPaul E. McKenney 	/*
1557360e0da6SPaul E. McKenney 	 * Use funnel locking to either acquire the root rcu_node
1558360e0da6SPaul E. McKenney 	 * structure's lock or bail out if the need for this grace period
1559df2bf8f7SJoel Fernandes (Google) 	 * has already been recorded -- or if that grace period has in
1560df2bf8f7SJoel Fernandes (Google) 	 * fact already started.  If there is already a grace period in
1561df2bf8f7SJoel Fernandes (Google) 	 * progress in a non-leaf node, no recording is needed because the
1562df2bf8f7SJoel Fernandes (Google) 	 * end of the grace period will scan the leaf rcu_node structures.
1563df2bf8f7SJoel Fernandes (Google) 	 * Note that rnp_start->lock must not be released.
1564360e0da6SPaul E. McKenney 	 */
1565df2bf8f7SJoel Fernandes (Google) 	raw_lockdep_assert_held_rcu_node(rnp_start);
1566df2bf8f7SJoel Fernandes (Google) 	trace_rcu_this_gp(rnp_start, rdp, gp_seq_req, TPS("Startleaf"));
1567df2bf8f7SJoel Fernandes (Google) 	for (rnp = rnp_start; 1; rnp = rnp->parent) {
1568df2bf8f7SJoel Fernandes (Google) 		if (rnp != rnp_start)
1569df2bf8f7SJoel Fernandes (Google) 			raw_spin_lock_rcu_node(rnp);
1570df2bf8f7SJoel Fernandes (Google) 		if (ULONG_CMP_GE(rnp->gp_seq_needed, gp_seq_req) ||
1571df2bf8f7SJoel Fernandes (Google) 		    rcu_seq_started(&rnp->gp_seq, gp_seq_req) ||
1572df2bf8f7SJoel Fernandes (Google) 		    (rnp != rnp_start &&
1573df2bf8f7SJoel Fernandes (Google) 		     rcu_seq_state(rcu_seq_current(&rnp->gp_seq)))) {
1574df2bf8f7SJoel Fernandes (Google) 			trace_rcu_this_gp(rnp, rdp, gp_seq_req,
1575b73de91dSJoel Fernandes 					  TPS("Prestarted"));
15764102adabSPaul E. McKenney 			goto unlock_out;
15774102adabSPaul E. McKenney 		}
1578df2bf8f7SJoel Fernandes (Google) 		rnp->gp_seq_needed = gp_seq_req;
1579226ca5e7SJoel Fernandes (Google) 		if (rcu_seq_state(rcu_seq_current(&rnp->gp_seq))) {
1580a2165e41SPaul E. McKenney 			/*
1581226ca5e7SJoel Fernandes (Google) 			 * We just marked the leaf or internal node, and a
1582226ca5e7SJoel Fernandes (Google) 			 * grace period is in progress, which means that
1583226ca5e7SJoel Fernandes (Google) 			 * rcu_gp_cleanup() will see the marking.  Bail to
1584226ca5e7SJoel Fernandes (Google) 			 * reduce contention.
1585a2165e41SPaul E. McKenney 			 */
1586df2bf8f7SJoel Fernandes (Google) 			trace_rcu_this_gp(rnp_start, rdp, gp_seq_req,
1587b73de91dSJoel Fernandes 					  TPS("Startedleaf"));
1588a2165e41SPaul E. McKenney 			goto unlock_out;
1589a2165e41SPaul E. McKenney 		}
1590df2bf8f7SJoel Fernandes (Google) 		if (rnp != rnp_start && rnp->parent != NULL)
1591df2bf8f7SJoel Fernandes (Google) 			raw_spin_unlock_rcu_node(rnp);
1592df2bf8f7SJoel Fernandes (Google) 		if (!rnp->parent)
1593360e0da6SPaul E. McKenney 			break;  /* At root, and perhaps also leaf. */
15944102adabSPaul E. McKenney 	}
1595360e0da6SPaul E. McKenney 
1596360e0da6SPaul E. McKenney 	/* If GP already in progress, just leave, otherwise start one. */
1597de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress()) {
1598df2bf8f7SJoel Fernandes (Google) 		trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedleafroot"));
1599360e0da6SPaul E. McKenney 		goto unlock_out;
1600360e0da6SPaul E. McKenney 	}
1601df2bf8f7SJoel Fernandes (Google) 	trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("Startedroot"));
1602360e0da6SPaul E. McKenney 	WRITE_ONCE(rsp->gp_flags, rsp->gp_flags | RCU_GP_FLAG_INIT);
160326d950a9SPaul E. McKenney 	rsp->gp_req_activity = jiffies;
1604360e0da6SPaul E. McKenney 	if (!rsp->gp_kthread) {
1605df2bf8f7SJoel Fernandes (Google) 		trace_rcu_this_gp(rnp, rdp, gp_seq_req, TPS("NoGPkthread"));
1606360e0da6SPaul E. McKenney 		goto unlock_out;
1607360e0da6SPaul E. McKenney 	}
1608477351f7SPaul E. McKenney 	trace_rcu_grace_period(rsp->name, READ_ONCE(rsp->gp_seq), TPS("newreq"));
1609360e0da6SPaul E. McKenney 	ret = true;  /* Caller must wake GP kthread. */
16104102adabSPaul E. McKenney unlock_out:
1611ab5e869cSPaul E. McKenney 	/* Push furthest requested GP to leaf node and rcu_data structure. */
1612df2bf8f7SJoel Fernandes (Google) 	if (ULONG_CMP_LT(gp_seq_req, rnp->gp_seq_needed)) {
1613df2bf8f7SJoel Fernandes (Google) 		rnp_start->gp_seq_needed = rnp->gp_seq_needed;
1614df2bf8f7SJoel Fernandes (Google) 		rdp->gp_seq_needed = rnp->gp_seq_needed;
1615ab5e869cSPaul E. McKenney 	}
1616df2bf8f7SJoel Fernandes (Google) 	if (rnp != rnp_start)
1617df2bf8f7SJoel Fernandes (Google) 		raw_spin_unlock_rcu_node(rnp);
161848a7639cSPaul E. McKenney 	return ret;
16194102adabSPaul E. McKenney }
16204102adabSPaul E. McKenney 
16214102adabSPaul E. McKenney /*
16224102adabSPaul E. McKenney  * Clean up any old requests for the just-ended grace period.  Also return
1623d1e4f01dSPaul E. McKenney  * whether any additional grace periods have been requested.
16244102adabSPaul E. McKenney  */
16253481f2eaSPaul E. McKenney static bool rcu_future_gp_cleanup(struct rcu_node *rnp)
16264102adabSPaul E. McKenney {
1627fb31340fSPaul E. McKenney 	bool needmore;
1628da1df50dSPaul E. McKenney 	struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
16294102adabSPaul E. McKenney 
16307a1d0f23SPaul E. McKenney 	needmore = ULONG_CMP_LT(rnp->gp_seq, rnp->gp_seq_needed);
16317a1d0f23SPaul E. McKenney 	if (!needmore)
16327a1d0f23SPaul E. McKenney 		rnp->gp_seq_needed = rnp->gp_seq; /* Avoid counter wrap. */
1633b73de91dSJoel Fernandes 	trace_rcu_this_gp(rnp, rdp, rnp->gp_seq,
16344102adabSPaul E. McKenney 			  needmore ? TPS("CleanupMore") : TPS("Cleanup"));
16354102adabSPaul E. McKenney 	return needmore;
16364102adabSPaul E. McKenney }
16374102adabSPaul E. McKenney 
16384102adabSPaul E. McKenney /*
163948a7639cSPaul E. McKenney  * Awaken the grace-period kthread for the specified flavor of RCU.
164048a7639cSPaul E. McKenney  * Don't do a self-awaken, and don't bother awakening when there is
164148a7639cSPaul E. McKenney  * nothing for the grace-period kthread to do (as in several CPUs
164248a7639cSPaul E. McKenney  * raced to awaken, and we lost), and finally don't try to awaken
164348a7639cSPaul E. McKenney  * a kthread that has not yet been created.
164448a7639cSPaul E. McKenney  */
1645532c00c9SPaul E. McKenney static void rcu_gp_kthread_wake(void)
164648a7639cSPaul E. McKenney {
1647532c00c9SPaul E. McKenney 	if (current == rcu_state.gp_kthread ||
1648532c00c9SPaul E. McKenney 	    !READ_ONCE(rcu_state.gp_flags) ||
1649532c00c9SPaul E. McKenney 	    !rcu_state.gp_kthread)
165048a7639cSPaul E. McKenney 		return;
1651532c00c9SPaul E. McKenney 	swake_up_one(&rcu_state.gp_wq);
165248a7639cSPaul E. McKenney }
165348a7639cSPaul E. McKenney 
165448a7639cSPaul E. McKenney /*
165529365e56SPaul E. McKenney  * If there is room, assign a ->gp_seq number to any callbacks on this
165629365e56SPaul E. McKenney  * CPU that have not already been assigned.  Also accelerate any callbacks
165729365e56SPaul E. McKenney  * that were previously assigned a ->gp_seq number that has since proven
165829365e56SPaul E. McKenney  * to be too conservative, which can happen if callbacks get assigned a
165929365e56SPaul E. McKenney  * ->gp_seq number while RCU is idle, but with reference to a non-root
166029365e56SPaul E. McKenney  * rcu_node structure.  This function is idempotent, so it does not hurt
166129365e56SPaul E. McKenney  * to call it repeatedly.  Returns an flag saying that we should awaken
166229365e56SPaul E. McKenney  * the RCU grace-period kthread.
16634102adabSPaul E. McKenney  *
16644102adabSPaul E. McKenney  * The caller must hold rnp->lock with interrupts disabled.
16654102adabSPaul E. McKenney  */
166602f50142SPaul E. McKenney static bool rcu_accelerate_cbs(struct rcu_node *rnp, struct rcu_data *rdp)
16674102adabSPaul E. McKenney {
1668b73de91dSJoel Fernandes 	unsigned long gp_seq_req;
166915fecf89SPaul E. McKenney 	bool ret = false;
167002f50142SPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
16714102adabSPaul E. McKenney 
1672a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1673c0b334c5SPaul E. McKenney 
167415fecf89SPaul E. McKenney 	/* If no pending (not yet ready to invoke) callbacks, nothing to do. */
167515fecf89SPaul E. McKenney 	if (!rcu_segcblist_pend_cbs(&rdp->cblist))
167648a7639cSPaul E. McKenney 		return false;
16774102adabSPaul E. McKenney 
16784102adabSPaul E. McKenney 	/*
167915fecf89SPaul E. McKenney 	 * Callbacks are often registered with incomplete grace-period
168015fecf89SPaul E. McKenney 	 * information.  Something about the fact that getting exact
168115fecf89SPaul E. McKenney 	 * information requires acquiring a global lock...  RCU therefore
168215fecf89SPaul E. McKenney 	 * makes a conservative estimate of the grace period number at which
168315fecf89SPaul E. McKenney 	 * a given callback will become ready to invoke.	The following
168415fecf89SPaul E. McKenney 	 * code checks this estimate and improves it when possible, thus
168515fecf89SPaul E. McKenney 	 * accelerating callback invocation to an earlier grace-period
168615fecf89SPaul E. McKenney 	 * number.
16874102adabSPaul E. McKenney 	 */
1688b73de91dSJoel Fernandes 	gp_seq_req = rcu_seq_snap(&rsp->gp_seq);
1689b73de91dSJoel Fernandes 	if (rcu_segcblist_accelerate(&rdp->cblist, gp_seq_req))
1690b73de91dSJoel Fernandes 		ret = rcu_start_this_gp(rnp, rdp, gp_seq_req);
16914102adabSPaul E. McKenney 
16924102adabSPaul E. McKenney 	/* Trace depending on how much we were able to accelerate. */
169315fecf89SPaul E. McKenney 	if (rcu_segcblist_restempty(&rdp->cblist, RCU_WAIT_TAIL))
1694477351f7SPaul E. McKenney 		trace_rcu_grace_period(rsp->name, rdp->gp_seq, TPS("AccWaitCB"));
16954102adabSPaul E. McKenney 	else
1696477351f7SPaul E. McKenney 		trace_rcu_grace_period(rsp->name, rdp->gp_seq, TPS("AccReadyCB"));
169748a7639cSPaul E. McKenney 	return ret;
16984102adabSPaul E. McKenney }
16994102adabSPaul E. McKenney 
17004102adabSPaul E. McKenney /*
1701e44e73caSPaul E. McKenney  * Similar to rcu_accelerate_cbs(), but does not require that the leaf
1702e44e73caSPaul E. McKenney  * rcu_node structure's ->lock be held.  It consults the cached value
1703e44e73caSPaul E. McKenney  * of ->gp_seq_needed in the rcu_data structure, and if that indicates
1704e44e73caSPaul E. McKenney  * that a new grace-period request be made, invokes rcu_accelerate_cbs()
1705e44e73caSPaul E. McKenney  * while holding the leaf rcu_node structure's ->lock.
1706e44e73caSPaul E. McKenney  */
1707c6e09b97SPaul E. McKenney static void rcu_accelerate_cbs_unlocked(struct rcu_node *rnp,
1708e44e73caSPaul E. McKenney 					struct rcu_data *rdp)
1709e44e73caSPaul E. McKenney {
1710e44e73caSPaul E. McKenney 	unsigned long c;
1711e44e73caSPaul E. McKenney 	bool needwake;
1712e44e73caSPaul E. McKenney 
1713e44e73caSPaul E. McKenney 	lockdep_assert_irqs_disabled();
1714c6e09b97SPaul E. McKenney 	c = rcu_seq_snap(&rcu_state.gp_seq);
1715e44e73caSPaul E. McKenney 	if (!rdp->gpwrap && ULONG_CMP_GE(rdp->gp_seq_needed, c)) {
1716e44e73caSPaul E. McKenney 		/* Old request still live, so mark recent callbacks. */
1717e44e73caSPaul E. McKenney 		(void)rcu_segcblist_accelerate(&rdp->cblist, c);
1718e44e73caSPaul E. McKenney 		return;
1719e44e73caSPaul E. McKenney 	}
1720e44e73caSPaul E. McKenney 	raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
172102f50142SPaul E. McKenney 	needwake = rcu_accelerate_cbs(rnp, rdp);
1722e44e73caSPaul E. McKenney 	raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */
1723e44e73caSPaul E. McKenney 	if (needwake)
1724532c00c9SPaul E. McKenney 		rcu_gp_kthread_wake();
1725e44e73caSPaul E. McKenney }
1726e44e73caSPaul E. McKenney 
1727e44e73caSPaul E. McKenney /*
17284102adabSPaul E. McKenney  * Move any callbacks whose grace period has completed to the
17294102adabSPaul E. McKenney  * RCU_DONE_TAIL sublist, then compact the remaining sublists and
173029365e56SPaul E. McKenney  * assign ->gp_seq numbers to any callbacks in the RCU_NEXT_TAIL
17314102adabSPaul E. McKenney  * sublist.  This function is idempotent, so it does not hurt to
17324102adabSPaul E. McKenney  * invoke it repeatedly.  As long as it is not invoked -too- often...
173348a7639cSPaul E. McKenney  * Returns true if the RCU grace-period kthread needs to be awakened.
17344102adabSPaul E. McKenney  *
17354102adabSPaul E. McKenney  * The caller must hold rnp->lock with interrupts disabled.
17364102adabSPaul E. McKenney  */
1737834f56bfSPaul E. McKenney static bool rcu_advance_cbs(struct rcu_node *rnp, struct rcu_data *rdp)
17384102adabSPaul E. McKenney {
1739a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1740c0b334c5SPaul E. McKenney 
174115fecf89SPaul E. McKenney 	/* If no pending (not yet ready to invoke) callbacks, nothing to do. */
174215fecf89SPaul E. McKenney 	if (!rcu_segcblist_pend_cbs(&rdp->cblist))
174348a7639cSPaul E. McKenney 		return false;
17444102adabSPaul E. McKenney 
17454102adabSPaul E. McKenney 	/*
174629365e56SPaul E. McKenney 	 * Find all callbacks whose ->gp_seq numbers indicate that they
17474102adabSPaul E. McKenney 	 * are ready to invoke, and put them into the RCU_DONE_TAIL sublist.
17484102adabSPaul E. McKenney 	 */
174929365e56SPaul E. McKenney 	rcu_segcblist_advance(&rdp->cblist, rnp->gp_seq);
17504102adabSPaul E. McKenney 
17514102adabSPaul E. McKenney 	/* Classify any remaining callbacks. */
175202f50142SPaul E. McKenney 	return rcu_accelerate_cbs(rnp, rdp);
17534102adabSPaul E. McKenney }
17544102adabSPaul E. McKenney 
17554102adabSPaul E. McKenney /*
17564102adabSPaul E. McKenney  * Update CPU-local rcu_data state to record the beginnings and ends of
17574102adabSPaul E. McKenney  * grace periods.  The caller must hold the ->lock of the leaf rcu_node
17584102adabSPaul E. McKenney  * structure corresponding to the current CPU, and must have irqs disabled.
175948a7639cSPaul E. McKenney  * Returns true if the grace-period kthread needs to be awakened.
17604102adabSPaul E. McKenney  */
1761c7e48f7bSPaul E. McKenney static bool __note_gp_changes(struct rcu_node *rnp, struct rcu_data *rdp)
17624102adabSPaul E. McKenney {
176348a7639cSPaul E. McKenney 	bool ret;
17643563a438SPaul E. McKenney 	bool need_gp;
1765c7e48f7bSPaul E. McKenney 	struct rcu_state __maybe_unused *rsp = &rcu_state;
176648a7639cSPaul E. McKenney 
1767a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
1768c0b334c5SPaul E. McKenney 
176967e14c1eSPaul E. McKenney 	if (rdp->gp_seq == rnp->gp_seq)
177067e14c1eSPaul E. McKenney 		return false; /* Nothing to do. */
177167e14c1eSPaul E. McKenney 
17724102adabSPaul E. McKenney 	/* Handle the ends of any preceding grace periods first. */
177367e14c1eSPaul E. McKenney 	if (rcu_seq_completed_gp(rdp->gp_seq, rnp->gp_seq) ||
177467e14c1eSPaul E. McKenney 	    unlikely(READ_ONCE(rdp->gpwrap))) {
1775834f56bfSPaul E. McKenney 		ret = rcu_advance_cbs(rnp, rdp); /* Advance callbacks. */
177667e14c1eSPaul E. McKenney 		trace_rcu_grace_period(rsp->name, rdp->gp_seq, TPS("cpuend"));
177767e14c1eSPaul E. McKenney 	} else {
177802f50142SPaul E. McKenney 		ret = rcu_accelerate_cbs(rnp, rdp); /* Recent callbacks. */
17794102adabSPaul E. McKenney 	}
17804102adabSPaul E. McKenney 
178167e14c1eSPaul E. McKenney 	/* Now handle the beginnings of any new-to-this-CPU grace periods. */
178267e14c1eSPaul E. McKenney 	if (rcu_seq_new_gp(rdp->gp_seq, rnp->gp_seq) ||
178367e14c1eSPaul E. McKenney 	    unlikely(READ_ONCE(rdp->gpwrap))) {
17844102adabSPaul E. McKenney 		/*
17854102adabSPaul E. McKenney 		 * If the current grace period is waiting for this CPU,
17864102adabSPaul E. McKenney 		 * set up to detect a quiescent state, otherwise don't
17874102adabSPaul E. McKenney 		 * go looking for one.
17884102adabSPaul E. McKenney 		 */
17895ca0905fSJoel Fernandes (Google) 		trace_rcu_grace_period(rsp->name, rnp->gp_seq, TPS("cpustart"));
17903563a438SPaul E. McKenney 		need_gp = !!(rnp->qsmask & rdp->grpmask);
17913563a438SPaul E. McKenney 		rdp->cpu_no_qs.b.norm = need_gp;
17929577df9aSPaul E. McKenney 		rdp->rcu_qs_ctr_snap = __this_cpu_read(rcu_dynticks.rcu_qs_ctr);
17933563a438SPaul E. McKenney 		rdp->core_needs_qs = need_gp;
17944102adabSPaul E. McKenney 		zero_cpu_stall_ticks(rdp);
17954102adabSPaul E. McKenney 	}
179667e14c1eSPaul E. McKenney 	rdp->gp_seq = rnp->gp_seq;  /* Remember new grace-period state. */
17973d18469aSPaul E. McKenney 	if (ULONG_CMP_GE(rnp->gp_seq_needed, rdp->gp_seq_needed) || rdp->gpwrap)
17983d18469aSPaul E. McKenney 		rdp->gp_seq_needed = rnp->gp_seq_needed;
17993d18469aSPaul E. McKenney 	WRITE_ONCE(rdp->gpwrap, false);
18003d18469aSPaul E. McKenney 	rcu_gpnum_ovf(rnp, rdp);
180148a7639cSPaul E. McKenney 	return ret;
18024102adabSPaul E. McKenney }
18034102adabSPaul E. McKenney 
180415cabdffSPaul E. McKenney static void note_gp_changes(struct rcu_data *rdp)
18054102adabSPaul E. McKenney {
18064102adabSPaul E. McKenney 	unsigned long flags;
180748a7639cSPaul E. McKenney 	bool needwake;
18084102adabSPaul E. McKenney 	struct rcu_node *rnp;
18094102adabSPaul E. McKenney 
18104102adabSPaul E. McKenney 	local_irq_save(flags);
18114102adabSPaul E. McKenney 	rnp = rdp->mynode;
181267e14c1eSPaul E. McKenney 	if ((rdp->gp_seq == rcu_seq_current(&rnp->gp_seq) &&
18137d0ae808SPaul E. McKenney 	     !unlikely(READ_ONCE(rdp->gpwrap))) || /* w/out lock. */
18142a67e741SPeter Zijlstra 	    !raw_spin_trylock_rcu_node(rnp)) { /* irqs already off, so later. */
18154102adabSPaul E. McKenney 		local_irq_restore(flags);
18164102adabSPaul E. McKenney 		return;
18174102adabSPaul E. McKenney 	}
1818c7e48f7bSPaul E. McKenney 	needwake = __note_gp_changes(rnp, rdp);
181967c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
182048a7639cSPaul E. McKenney 	if (needwake)
1821532c00c9SPaul E. McKenney 		rcu_gp_kthread_wake();
18224102adabSPaul E. McKenney }
18234102adabSPaul E. McKenney 
182422212332SPaul E. McKenney static void rcu_gp_slow(int delay)
18250f41c0ddSPaul E. McKenney {
18260f41c0ddSPaul E. McKenney 	if (delay > 0 &&
182722212332SPaul E. McKenney 	    !(rcu_seq_ctr(rcu_state.gp_seq) %
1828dee4f422SPaul E. McKenney 	      (rcu_num_nodes * PER_RCU_NODE_PERIOD * delay)))
18290f41c0ddSPaul E. McKenney 		schedule_timeout_uninterruptible(delay);
18300f41c0ddSPaul E. McKenney }
18310f41c0ddSPaul E. McKenney 
18324102adabSPaul E. McKenney /*
183345fed3e7SPaul E. McKenney  * Initialize a new grace period.  Return false if no grace period required.
18344102adabSPaul E. McKenney  */
18350854a05cSPaul E. McKenney static bool rcu_gp_init(void)
18364102adabSPaul E. McKenney {
1837ec2c2976SPaul E. McKenney 	unsigned long flags;
18380aa04b05SPaul E. McKenney 	unsigned long oldmask;
1839ec2c2976SPaul E. McKenney 	unsigned long mask;
18404102adabSPaul E. McKenney 	struct rcu_data *rdp;
1841336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
18420854a05cSPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
18434102adabSPaul E. McKenney 
18447d0ae808SPaul E. McKenney 	WRITE_ONCE(rsp->gp_activity, jiffies);
18452a67e741SPeter Zijlstra 	raw_spin_lock_irq_rcu_node(rnp);
18467d0ae808SPaul E. McKenney 	if (!READ_ONCE(rsp->gp_flags)) {
18474102adabSPaul E. McKenney 		/* Spurious wakeup, tell caller to go back to sleep.  */
184867c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
184945fed3e7SPaul E. McKenney 		return false;
18504102adabSPaul E. McKenney 	}
18517d0ae808SPaul E. McKenney 	WRITE_ONCE(rsp->gp_flags, 0); /* Clear all flags: New grace period. */
18524102adabSPaul E. McKenney 
1853de8e8730SPaul E. McKenney 	if (WARN_ON_ONCE(rcu_gp_in_progress())) {
18544102adabSPaul E. McKenney 		/*
18554102adabSPaul E. McKenney 		 * Grace period already in progress, don't start another.
18564102adabSPaul E. McKenney 		 * Not supposed to be able to happen.
18574102adabSPaul E. McKenney 		 */
185867c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
185945fed3e7SPaul E. McKenney 		return false;
18604102adabSPaul E. McKenney 	}
18614102adabSPaul E. McKenney 
18624102adabSPaul E. McKenney 	/* Advance to a new grace period and initialize state. */
1863ad3832e9SPaul E. McKenney 	record_gp_stall_check_time();
1864ff3bb6f4SPaul E. McKenney 	/* Record GP times before starting GP, hence rcu_seq_start(). */
1865de30ad51SPaul E. McKenney 	rcu_seq_start(&rsp->gp_seq);
1866477351f7SPaul E. McKenney 	trace_rcu_grace_period(rsp->name, rsp->gp_seq, TPS("start"));
186767c583a7SBoqun Feng 	raw_spin_unlock_irq_rcu_node(rnp);
18684102adabSPaul E. McKenney 
18694102adabSPaul E. McKenney 	/*
18700aa04b05SPaul E. McKenney 	 * Apply per-leaf buffered online and offline operations to the
18710aa04b05SPaul E. McKenney 	 * rcu_node tree.  Note that this new grace period need not wait
18720aa04b05SPaul E. McKenney 	 * for subsequent online CPUs, and that quiescent-state forcing
18730aa04b05SPaul E. McKenney 	 * will handle subsequent offline CPUs.
18740aa04b05SPaul E. McKenney 	 */
1875fea3f222SPaul E. McKenney 	rsp->gp_state = RCU_GP_ONOFF;
18760aa04b05SPaul E. McKenney 	rcu_for_each_leaf_node(rsp, rnp) {
18771e64b15aSPaul E. McKenney 		spin_lock(&rsp->ofl_lock);
18782a67e741SPeter Zijlstra 		raw_spin_lock_irq_rcu_node(rnp);
18790aa04b05SPaul E. McKenney 		if (rnp->qsmaskinit == rnp->qsmaskinitnext &&
18800aa04b05SPaul E. McKenney 		    !rnp->wait_blkd_tasks) {
18810aa04b05SPaul E. McKenney 			/* Nothing to do on this leaf rcu_node structure. */
188267c583a7SBoqun Feng 			raw_spin_unlock_irq_rcu_node(rnp);
18831e64b15aSPaul E. McKenney 			spin_unlock(&rsp->ofl_lock);
18840aa04b05SPaul E. McKenney 			continue;
18850aa04b05SPaul E. McKenney 		}
18860aa04b05SPaul E. McKenney 
18870aa04b05SPaul E. McKenney 		/* Record old state, apply changes to ->qsmaskinit field. */
18880aa04b05SPaul E. McKenney 		oldmask = rnp->qsmaskinit;
18890aa04b05SPaul E. McKenney 		rnp->qsmaskinit = rnp->qsmaskinitnext;
18900aa04b05SPaul E. McKenney 
18910aa04b05SPaul E. McKenney 		/* If zero-ness of ->qsmaskinit changed, propagate up tree. */
18920aa04b05SPaul E. McKenney 		if (!oldmask != !rnp->qsmaskinit) {
1893962aff03SPaul E. McKenney 			if (!oldmask) { /* First online CPU for rcu_node. */
1894962aff03SPaul E. McKenney 				if (!rnp->wait_blkd_tasks) /* Ever offline? */
18950aa04b05SPaul E. McKenney 					rcu_init_new_rnp(rnp);
1896962aff03SPaul E. McKenney 			} else if (rcu_preempt_has_tasks(rnp)) {
1897962aff03SPaul E. McKenney 				rnp->wait_blkd_tasks = true; /* blocked tasks */
1898962aff03SPaul E. McKenney 			} else { /* Last offline CPU and can propagate. */
18990aa04b05SPaul E. McKenney 				rcu_cleanup_dead_rnp(rnp);
19000aa04b05SPaul E. McKenney 			}
1901962aff03SPaul E. McKenney 		}
19020aa04b05SPaul E. McKenney 
19030aa04b05SPaul E. McKenney 		/*
19040aa04b05SPaul E. McKenney 		 * If all waited-on tasks from prior grace period are
19050aa04b05SPaul E. McKenney 		 * done, and if all this rcu_node structure's CPUs are
19060aa04b05SPaul E. McKenney 		 * still offline, propagate up the rcu_node tree and
19070aa04b05SPaul E. McKenney 		 * clear ->wait_blkd_tasks.  Otherwise, if one of this
19080aa04b05SPaul E. McKenney 		 * rcu_node structure's CPUs has since come back online,
1909962aff03SPaul E. McKenney 		 * simply clear ->wait_blkd_tasks.
19100aa04b05SPaul E. McKenney 		 */
19110aa04b05SPaul E. McKenney 		if (rnp->wait_blkd_tasks &&
1912962aff03SPaul E. McKenney 		    (!rcu_preempt_has_tasks(rnp) || rnp->qsmaskinit)) {
19130aa04b05SPaul E. McKenney 			rnp->wait_blkd_tasks = false;
1914962aff03SPaul E. McKenney 			if (!rnp->qsmaskinit)
19150aa04b05SPaul E. McKenney 				rcu_cleanup_dead_rnp(rnp);
19160aa04b05SPaul E. McKenney 		}
19170aa04b05SPaul E. McKenney 
191867c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
19191e64b15aSPaul E. McKenney 		spin_unlock(&rsp->ofl_lock);
19200aa04b05SPaul E. McKenney 	}
192122212332SPaul E. McKenney 	rcu_gp_slow(gp_preinit_delay); /* Races with CPU hotplug. */
19224102adabSPaul E. McKenney 
19234102adabSPaul E. McKenney 	/*
19244102adabSPaul E. McKenney 	 * Set the quiescent-state-needed bits in all the rcu_node
19254102adabSPaul E. McKenney 	 * structures for all currently online CPUs in breadth-first order,
19264102adabSPaul E. McKenney 	 * starting from the root rcu_node structure, relying on the layout
19274102adabSPaul E. McKenney 	 * of the tree within the rsp->node[] array.  Note that other CPUs
19284102adabSPaul E. McKenney 	 * will access only the leaves of the hierarchy, thus seeing that no
19294102adabSPaul E. McKenney 	 * grace period is in progress, at least until the corresponding
1930590d1757SPaul E. McKenney 	 * leaf node has been initialized.
19314102adabSPaul E. McKenney 	 *
19324102adabSPaul E. McKenney 	 * The grace period cannot complete until the initialization
19334102adabSPaul E. McKenney 	 * process finishes, because this kthread handles both.
19344102adabSPaul E. McKenney 	 */
1935fea3f222SPaul E. McKenney 	rsp->gp_state = RCU_GP_INIT;
19364102adabSPaul E. McKenney 	rcu_for_each_node_breadth_first(rsp, rnp) {
193722212332SPaul E. McKenney 		rcu_gp_slow(gp_init_delay);
1938ec2c2976SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
1939da1df50dSPaul E. McKenney 		rdp = this_cpu_ptr(&rcu_data);
194057738942SPaul E. McKenney 		rcu_preempt_check_blocked_tasks(rsp, rnp);
19414102adabSPaul E. McKenney 		rnp->qsmask = rnp->qsmaskinit;
1942de30ad51SPaul E. McKenney 		WRITE_ONCE(rnp->gp_seq, rsp->gp_seq);
19434102adabSPaul E. McKenney 		if (rnp == rdp->mynode)
1944c7e48f7bSPaul E. McKenney 			(void)__note_gp_changes(rnp, rdp);
19454102adabSPaul E. McKenney 		rcu_preempt_boost_start_gp(rnp);
1946477351f7SPaul E. McKenney 		trace_rcu_grace_period_init(rsp->name, rnp->gp_seq,
19474102adabSPaul E. McKenney 					    rnp->level, rnp->grplo,
19484102adabSPaul E. McKenney 					    rnp->grphi, rnp->qsmask);
1949ec2c2976SPaul E. McKenney 		/* Quiescent states for tasks on any now-offline CPUs. */
1950ec2c2976SPaul E. McKenney 		mask = rnp->qsmask & ~rnp->qsmaskinitnext;
1951f2e2df59SPaul E. McKenney 		rnp->rcu_gp_init_mask = mask;
1952ec2c2976SPaul E. McKenney 		if ((mask || rnp->wait_blkd_tasks) && rcu_is_leaf_node(rnp))
1953b50912d0SPaul E. McKenney 			rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
1954ec2c2976SPaul E. McKenney 		else
195567c583a7SBoqun Feng 			raw_spin_unlock_irq_rcu_node(rnp);
1956cee43939SPaul E. McKenney 		cond_resched_tasks_rcu_qs();
19577d0ae808SPaul E. McKenney 		WRITE_ONCE(rsp->gp_activity, jiffies);
19584102adabSPaul E. McKenney 	}
19594102adabSPaul E. McKenney 
196045fed3e7SPaul E. McKenney 	return true;
19614102adabSPaul E. McKenney }
19624102adabSPaul E. McKenney 
19634102adabSPaul E. McKenney /*
1964b3dae109SPeter Zijlstra  * Helper function for swait_event_idle_exclusive() wakeup at force-quiescent-state
1965d5374226SLuis R. Rodriguez  * time.
1966b9a425cfSPaul E. McKenney  */
19670854a05cSPaul E. McKenney static bool rcu_gp_fqs_check_wake(int *gfp)
1968b9a425cfSPaul E. McKenney {
1969336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
1970b9a425cfSPaul E. McKenney 
1971b9a425cfSPaul E. McKenney 	/* Someone like call_rcu() requested a force-quiescent-state scan. */
19720854a05cSPaul E. McKenney 	*gfp = READ_ONCE(rcu_state.gp_flags);
1973b9a425cfSPaul E. McKenney 	if (*gfp & RCU_GP_FLAG_FQS)
1974b9a425cfSPaul E. McKenney 		return true;
1975b9a425cfSPaul E. McKenney 
1976b9a425cfSPaul E. McKenney 	/* The current grace period has completed. */
1977b9a425cfSPaul E. McKenney 	if (!READ_ONCE(rnp->qsmask) && !rcu_preempt_blocked_readers_cgp(rnp))
1978b9a425cfSPaul E. McKenney 		return true;
1979b9a425cfSPaul E. McKenney 
1980b9a425cfSPaul E. McKenney 	return false;
1981b9a425cfSPaul E. McKenney }
1982b9a425cfSPaul E. McKenney 
1983b9a425cfSPaul E. McKenney /*
19844102adabSPaul E. McKenney  * Do one round of quiescent-state forcing.
19854102adabSPaul E. McKenney  */
19860854a05cSPaul E. McKenney static void rcu_gp_fqs(bool first_time)
19874102adabSPaul E. McKenney {
1988336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
19890854a05cSPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
19904102adabSPaul E. McKenney 
19917d0ae808SPaul E. McKenney 	WRITE_ONCE(rsp->gp_activity, jiffies);
19924102adabSPaul E. McKenney 	rsp->n_force_qs++;
199377f81fe0SPetr Mladek 	if (first_time) {
19944102adabSPaul E. McKenney 		/* Collect dyntick-idle snapshots. */
1995e9ecb780SPaul E. McKenney 		force_qs_rnp(dyntick_save_progress_counter);
19964102adabSPaul E. McKenney 	} else {
19974102adabSPaul E. McKenney 		/* Handle dyntick-idle and offline CPUs. */
1998e9ecb780SPaul E. McKenney 		force_qs_rnp(rcu_implicit_dynticks_qs);
19994102adabSPaul E. McKenney 	}
20004102adabSPaul E. McKenney 	/* Clear flag to prevent immediate re-entry. */
20017d0ae808SPaul E. McKenney 	if (READ_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) {
20022a67e741SPeter Zijlstra 		raw_spin_lock_irq_rcu_node(rnp);
20037d0ae808SPaul E. McKenney 		WRITE_ONCE(rsp->gp_flags,
20047d0ae808SPaul E. McKenney 			   READ_ONCE(rsp->gp_flags) & ~RCU_GP_FLAG_FQS);
200567c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
20064102adabSPaul E. McKenney 	}
20074102adabSPaul E. McKenney }
20084102adabSPaul E. McKenney 
20094102adabSPaul E. McKenney /*
20104102adabSPaul E. McKenney  * Clean up after the old grace period.
20114102adabSPaul E. McKenney  */
20120854a05cSPaul E. McKenney static void rcu_gp_cleanup(void)
20134102adabSPaul E. McKenney {
20144102adabSPaul E. McKenney 	unsigned long gp_duration;
201548a7639cSPaul E. McKenney 	bool needgp = false;
2016de30ad51SPaul E. McKenney 	unsigned long new_gp_seq;
20174102adabSPaul E. McKenney 	struct rcu_data *rdp;
2018336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
20190854a05cSPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
2020abedf8e2SPaul Gortmaker 	struct swait_queue_head *sq;
20214102adabSPaul E. McKenney 
20227d0ae808SPaul E. McKenney 	WRITE_ONCE(rsp->gp_activity, jiffies);
20232a67e741SPeter Zijlstra 	raw_spin_lock_irq_rcu_node(rnp);
20244102adabSPaul E. McKenney 	gp_duration = jiffies - rsp->gp_start;
20254102adabSPaul E. McKenney 	if (gp_duration > rsp->gp_max)
20264102adabSPaul E. McKenney 		rsp->gp_max = gp_duration;
20274102adabSPaul E. McKenney 
20284102adabSPaul E. McKenney 	/*
20294102adabSPaul E. McKenney 	 * We know the grace period is complete, but to everyone else
20304102adabSPaul E. McKenney 	 * it appears to still be ongoing.  But it is also the case
20314102adabSPaul E. McKenney 	 * that to everyone else it looks like there is nothing that
20324102adabSPaul E. McKenney 	 * they can do to advance the grace period.  It is therefore
20334102adabSPaul E. McKenney 	 * safe for us to drop the lock in order to mark the grace
20344102adabSPaul E. McKenney 	 * period as completed in all of the rcu_node structures.
20354102adabSPaul E. McKenney 	 */
203667c583a7SBoqun Feng 	raw_spin_unlock_irq_rcu_node(rnp);
20374102adabSPaul E. McKenney 
20384102adabSPaul E. McKenney 	/*
2039ff3bb6f4SPaul E. McKenney 	 * Propagate new ->gp_seq value to rcu_node structures so that
2040ff3bb6f4SPaul E. McKenney 	 * other CPUs don't have to wait until the start of the next grace
2041ff3bb6f4SPaul E. McKenney 	 * period to process their callbacks.  This also avoids some nasty
2042ff3bb6f4SPaul E. McKenney 	 * RCU grace-period initialization races by forcing the end of
2043ff3bb6f4SPaul E. McKenney 	 * the current grace period to be completely recorded in all of
2044ff3bb6f4SPaul E. McKenney 	 * the rcu_node structures before the beginning of the next grace
2045ff3bb6f4SPaul E. McKenney 	 * period is recorded in any of the rcu_node structures.
20464102adabSPaul E. McKenney 	 */
2047de30ad51SPaul E. McKenney 	new_gp_seq = rsp->gp_seq;
2048de30ad51SPaul E. McKenney 	rcu_seq_end(&new_gp_seq);
20494102adabSPaul E. McKenney 	rcu_for_each_node_breadth_first(rsp, rnp) {
20502a67e741SPeter Zijlstra 		raw_spin_lock_irq_rcu_node(rnp);
20514bc8d555SPaul E. McKenney 		if (WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp)))
205257738942SPaul E. McKenney 			dump_blkd_tasks(rsp, rnp, 10);
20535c60d25fSPaul E. McKenney 		WARN_ON_ONCE(rnp->qsmask);
2054de30ad51SPaul E. McKenney 		WRITE_ONCE(rnp->gp_seq, new_gp_seq);
2055da1df50dSPaul E. McKenney 		rdp = this_cpu_ptr(&rcu_data);
20564102adabSPaul E. McKenney 		if (rnp == rdp->mynode)
2057c7e48f7bSPaul E. McKenney 			needgp = __note_gp_changes(rnp, rdp) || needgp;
205878e4bc34SPaul E. McKenney 		/* smp_mb() provided by prior unlock-lock pair. */
20593481f2eaSPaul E. McKenney 		needgp = rcu_future_gp_cleanup(rnp) || needgp;
2060065bb78cSDaniel Wagner 		sq = rcu_nocb_gp_get(rnp);
206167c583a7SBoqun Feng 		raw_spin_unlock_irq_rcu_node(rnp);
2062065bb78cSDaniel Wagner 		rcu_nocb_gp_cleanup(sq);
2063cee43939SPaul E. McKenney 		cond_resched_tasks_rcu_qs();
20647d0ae808SPaul E. McKenney 		WRITE_ONCE(rsp->gp_activity, jiffies);
206522212332SPaul E. McKenney 		rcu_gp_slow(gp_cleanup_delay);
20664102adabSPaul E. McKenney 	}
2067336a4f6cSPaul E. McKenney 	rnp = rcu_get_root();
2068de30ad51SPaul E. McKenney 	raw_spin_lock_irq_rcu_node(rnp); /* GP before rsp->gp_seq update. */
20694102adabSPaul E. McKenney 
2070765a3f4fSPaul E. McKenney 	/* Declare grace period done. */
2071de30ad51SPaul E. McKenney 	rcu_seq_end(&rsp->gp_seq);
2072477351f7SPaul E. McKenney 	trace_rcu_grace_period(rsp->name, rsp->gp_seq, TPS("end"));
207377f81fe0SPetr Mladek 	rsp->gp_state = RCU_GP_IDLE;
2074fb31340fSPaul E. McKenney 	/* Check for GP requests since above loop. */
2075da1df50dSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
20765b55072fSJoel Fernandes (Google) 	if (!needgp && ULONG_CMP_LT(rnp->gp_seq, rnp->gp_seq_needed)) {
2077abd13fddSPaul E. McKenney 		trace_rcu_this_gp(rnp, rdp, rnp->gp_seq_needed,
2078fb31340fSPaul E. McKenney 				  TPS("CleanupMore"));
2079fb31340fSPaul E. McKenney 		needgp = true;
2080fb31340fSPaul E. McKenney 	}
208148a7639cSPaul E. McKenney 	/* Advance CBs to reduce false positives below. */
208202f50142SPaul E. McKenney 	if (!rcu_accelerate_cbs(rnp, rdp) && needgp) {
20837d0ae808SPaul E. McKenney 		WRITE_ONCE(rsp->gp_flags, RCU_GP_FLAG_INIT);
208426d950a9SPaul E. McKenney 		rsp->gp_req_activity = jiffies;
2085477351f7SPaul E. McKenney 		trace_rcu_grace_period(rsp->name, READ_ONCE(rsp->gp_seq),
20864102adabSPaul E. McKenney 				       TPS("newreq"));
208718390aeaSPaul E. McKenney 	} else {
2088a824a287SPaul E. McKenney 		WRITE_ONCE(rsp->gp_flags, rsp->gp_flags & RCU_GP_FLAG_INIT);
208918390aeaSPaul E. McKenney 	}
209067c583a7SBoqun Feng 	raw_spin_unlock_irq_rcu_node(rnp);
20914102adabSPaul E. McKenney }
20924102adabSPaul E. McKenney 
20934102adabSPaul E. McKenney /*
20944102adabSPaul E. McKenney  * Body of kthread that handles grace periods.
20954102adabSPaul E. McKenney  */
20960854a05cSPaul E. McKenney static int __noreturn rcu_gp_kthread(void *unused)
20974102adabSPaul E. McKenney {
209877f81fe0SPetr Mladek 	bool first_gp_fqs;
20994102adabSPaul E. McKenney 	int gf;
21004102adabSPaul E. McKenney 	unsigned long j;
21014102adabSPaul E. McKenney 	int ret;
21020854a05cSPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
2103336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
21044102adabSPaul E. McKenney 
21055871968dSPaul E. McKenney 	rcu_bind_gp_kthread();
21064102adabSPaul E. McKenney 	for (;;) {
21074102adabSPaul E. McKenney 
21084102adabSPaul E. McKenney 		/* Handle grace-period start. */
21094102adabSPaul E. McKenney 		for (;;) {
21104102adabSPaul E. McKenney 			trace_rcu_grace_period(rsp->name,
2111477351f7SPaul E. McKenney 					       READ_ONCE(rsp->gp_seq),
21124102adabSPaul E. McKenney 					       TPS("reqwait"));
2113afea227fSPaul E. McKenney 			rsp->gp_state = RCU_GP_WAIT_GPS;
2114b3dae109SPeter Zijlstra 			swait_event_idle_exclusive(rsp->gp_wq, READ_ONCE(rsp->gp_flags) &
21154102adabSPaul E. McKenney 						     RCU_GP_FLAG_INIT);
2116319362c9SPaul E. McKenney 			rsp->gp_state = RCU_GP_DONE_GPS;
211778e4bc34SPaul E. McKenney 			/* Locking provides needed memory barrier. */
21180854a05cSPaul E. McKenney 			if (rcu_gp_init())
21194102adabSPaul E. McKenney 				break;
2120cee43939SPaul E. McKenney 			cond_resched_tasks_rcu_qs();
21217d0ae808SPaul E. McKenney 			WRITE_ONCE(rsp->gp_activity, jiffies);
212273a860cdSPaul E. McKenney 			WARN_ON(signal_pending(current));
21234102adabSPaul E. McKenney 			trace_rcu_grace_period(rsp->name,
2124477351f7SPaul E. McKenney 					       READ_ONCE(rsp->gp_seq),
21254102adabSPaul E. McKenney 					       TPS("reqwaitsig"));
21264102adabSPaul E. McKenney 		}
21274102adabSPaul E. McKenney 
21284102adabSPaul E. McKenney 		/* Handle quiescent-state forcing. */
212977f81fe0SPetr Mladek 		first_gp_fqs = true;
21304102adabSPaul E. McKenney 		j = jiffies_till_first_fqs;
21314102adabSPaul E. McKenney 		ret = 0;
21324102adabSPaul E. McKenney 		for (;;) {
21338c7c4829SPaul E. McKenney 			if (!ret) {
21344102adabSPaul E. McKenney 				rsp->jiffies_force_qs = jiffies + j;
21358c7c4829SPaul E. McKenney 				WRITE_ONCE(rsp->jiffies_kick_kthreads,
21368c7c4829SPaul E. McKenney 					   jiffies + 3 * j);
21378c7c4829SPaul E. McKenney 			}
21384102adabSPaul E. McKenney 			trace_rcu_grace_period(rsp->name,
2139477351f7SPaul E. McKenney 					       READ_ONCE(rsp->gp_seq),
21404102adabSPaul E. McKenney 					       TPS("fqswait"));
2141afea227fSPaul E. McKenney 			rsp->gp_state = RCU_GP_WAIT_FQS;
2142b3dae109SPeter Zijlstra 			ret = swait_event_idle_timeout_exclusive(rsp->gp_wq,
21430854a05cSPaul E. McKenney 					rcu_gp_fqs_check_wake(&gf), j);
214432bb1c79SPaul E. McKenney 			rsp->gp_state = RCU_GP_DOING_FQS;
214578e4bc34SPaul E. McKenney 			/* Locking provides needed memory barriers. */
21464102adabSPaul E. McKenney 			/* If grace period done, leave loop. */
21477d0ae808SPaul E. McKenney 			if (!READ_ONCE(rnp->qsmask) &&
21484102adabSPaul E. McKenney 			    !rcu_preempt_blocked_readers_cgp(rnp))
21494102adabSPaul E. McKenney 				break;
21504102adabSPaul E. McKenney 			/* If time for quiescent-state forcing, do it. */
21514102adabSPaul E. McKenney 			if (ULONG_CMP_GE(jiffies, rsp->jiffies_force_qs) ||
21524102adabSPaul E. McKenney 			    (gf & RCU_GP_FLAG_FQS)) {
21534102adabSPaul E. McKenney 				trace_rcu_grace_period(rsp->name,
2154477351f7SPaul E. McKenney 						       READ_ONCE(rsp->gp_seq),
21554102adabSPaul E. McKenney 						       TPS("fqsstart"));
21560854a05cSPaul E. McKenney 				rcu_gp_fqs(first_gp_fqs);
215777f81fe0SPetr Mladek 				first_gp_fqs = false;
21584102adabSPaul E. McKenney 				trace_rcu_grace_period(rsp->name,
2159477351f7SPaul E. McKenney 						       READ_ONCE(rsp->gp_seq),
21604102adabSPaul E. McKenney 						       TPS("fqsend"));
2161cee43939SPaul E. McKenney 				cond_resched_tasks_rcu_qs();
21627d0ae808SPaul E. McKenney 				WRITE_ONCE(rsp->gp_activity, jiffies);
2163fcfd0a23SPaul E. McKenney 				ret = 0; /* Force full wait till next FQS. */
2164fcfd0a23SPaul E. McKenney 				j = jiffies_till_next_fqs;
21654102adabSPaul E. McKenney 			} else {
21664102adabSPaul E. McKenney 				/* Deal with stray signal. */
2167cee43939SPaul E. McKenney 				cond_resched_tasks_rcu_qs();
21687d0ae808SPaul E. McKenney 				WRITE_ONCE(rsp->gp_activity, jiffies);
216973a860cdSPaul E. McKenney 				WARN_ON(signal_pending(current));
21704102adabSPaul E. McKenney 				trace_rcu_grace_period(rsp->name,
2171477351f7SPaul E. McKenney 						       READ_ONCE(rsp->gp_seq),
21724102adabSPaul E. McKenney 						       TPS("fqswaitsig"));
2173fcfd0a23SPaul E. McKenney 				ret = 1; /* Keep old FQS timing. */
2174fcfd0a23SPaul E. McKenney 				j = jiffies;
2175fcfd0a23SPaul E. McKenney 				if (time_after(jiffies, rsp->jiffies_force_qs))
21764102adabSPaul E. McKenney 					j = 1;
2177fcfd0a23SPaul E. McKenney 				else
2178fcfd0a23SPaul E. McKenney 					j = rsp->jiffies_force_qs - j;
21794102adabSPaul E. McKenney 			}
21804102adabSPaul E. McKenney 		}
21814102adabSPaul E. McKenney 
21824102adabSPaul E. McKenney 		/* Handle grace-period end. */
2183319362c9SPaul E. McKenney 		rsp->gp_state = RCU_GP_CLEANUP;
21840854a05cSPaul E. McKenney 		rcu_gp_cleanup();
2185319362c9SPaul E. McKenney 		rsp->gp_state = RCU_GP_CLEANED;
21864102adabSPaul E. McKenney 	}
21874102adabSPaul E. McKenney }
21884102adabSPaul E. McKenney 
21894102adabSPaul E. McKenney /*
21908994515cSPaul E. McKenney  * Report a full set of quiescent states to the specified rcu_state data
21918994515cSPaul E. McKenney  * structure.  Invoke rcu_gp_kthread_wake() to awaken the grace-period
21928994515cSPaul E. McKenney  * kthread if another grace period is required.  Whether we wake
21938994515cSPaul E. McKenney  * the grace-period kthread or it awakens itself for the next round
21948994515cSPaul E. McKenney  * of quiescent-state forcing, that kthread will clean up after the
21958994515cSPaul E. McKenney  * just-completed grace period.  Note that the caller must hold rnp->lock,
21968994515cSPaul E. McKenney  * which is released before return.
21974102adabSPaul E. McKenney  */
2198aff4e9edSPaul E. McKenney static void rcu_report_qs_rsp(unsigned long flags)
2199336a4f6cSPaul E. McKenney 	__releases(rcu_get_root()->lock)
22004102adabSPaul E. McKenney {
2201aff4e9edSPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
2202aff4e9edSPaul E. McKenney 
2203336a4f6cSPaul E. McKenney 	raw_lockdep_assert_held_rcu_node(rcu_get_root());
2204de8e8730SPaul E. McKenney 	WARN_ON_ONCE(!rcu_gp_in_progress());
2205cd73ca21SPaul E. McKenney 	WRITE_ONCE(rsp->gp_flags, READ_ONCE(rsp->gp_flags) | RCU_GP_FLAG_FQS);
2206336a4f6cSPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rcu_get_root(), flags);
2207532c00c9SPaul E. McKenney 	rcu_gp_kthread_wake();
22084102adabSPaul E. McKenney }
22094102adabSPaul E. McKenney 
22104102adabSPaul E. McKenney /*
22114102adabSPaul E. McKenney  * Similar to rcu_report_qs_rdp(), for which it is a helper function.
22124102adabSPaul E. McKenney  * Allows quiescent states for a group of CPUs to be reported at one go
22134102adabSPaul E. McKenney  * to the specified rcu_node structure, though all the CPUs in the group
2214654e9533SPaul E. McKenney  * must be represented by the same rcu_node structure (which need not be a
2215654e9533SPaul E. McKenney  * leaf rcu_node structure, though it often will be).  The gps parameter
2216654e9533SPaul E. McKenney  * is the grace-period snapshot, which means that the quiescent states
2217c9a24e2dSPaul E. McKenney  * are valid only if rnp->gp_seq is equal to gps.  That structure's lock
2218654e9533SPaul E. McKenney  * must be held upon entry, and it is released before return.
2219ec2c2976SPaul E. McKenney  *
2220ec2c2976SPaul E. McKenney  * As a special case, if mask is zero, the bit-already-cleared check is
2221ec2c2976SPaul E. McKenney  * disabled.  This allows propagating quiescent state due to resumed tasks
2222ec2c2976SPaul E. McKenney  * during grace-period initialization.
22234102adabSPaul E. McKenney  */
2224b50912d0SPaul E. McKenney static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp,
2225b50912d0SPaul E. McKenney 			      unsigned long gps, unsigned long flags)
22264102adabSPaul E. McKenney 	__releases(rnp->lock)
22274102adabSPaul E. McKenney {
2228654e9533SPaul E. McKenney 	unsigned long oldmask = 0;
22294102adabSPaul E. McKenney 	struct rcu_node *rnp_c;
2230b50912d0SPaul E. McKenney 	struct rcu_state __maybe_unused *rsp = &rcu_state;
22314102adabSPaul E. McKenney 
2232a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
2233c0b334c5SPaul E. McKenney 
22344102adabSPaul E. McKenney 	/* Walk up the rcu_node hierarchy. */
22354102adabSPaul E. McKenney 	for (;;) {
2236ec2c2976SPaul E. McKenney 		if ((!(rnp->qsmask & mask) && mask) || rnp->gp_seq != gps) {
22374102adabSPaul E. McKenney 
2238654e9533SPaul E. McKenney 			/*
2239654e9533SPaul E. McKenney 			 * Our bit has already been cleared, or the
2240654e9533SPaul E. McKenney 			 * relevant grace period is already over, so done.
2241654e9533SPaul E. McKenney 			 */
224267c583a7SBoqun Feng 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
22434102adabSPaul E. McKenney 			return;
22444102adabSPaul E. McKenney 		}
2245654e9533SPaul E. McKenney 		WARN_ON_ONCE(oldmask); /* Any child must be all zeroed! */
22465b4c11d5SPaul E. McKenney 		WARN_ON_ONCE(!rcu_is_leaf_node(rnp) &&
22472dee9404SPaul E. McKenney 			     rcu_preempt_blocked_readers_cgp(rnp));
22484102adabSPaul E. McKenney 		rnp->qsmask &= ~mask;
2249db023296SPaul E. McKenney 		trace_rcu_quiescent_state_report(rsp->name, rnp->gp_seq,
22504102adabSPaul E. McKenney 						 mask, rnp->qsmask, rnp->level,
22514102adabSPaul E. McKenney 						 rnp->grplo, rnp->grphi,
22524102adabSPaul E. McKenney 						 !!rnp->gp_tasks);
22534102adabSPaul E. McKenney 		if (rnp->qsmask != 0 || rcu_preempt_blocked_readers_cgp(rnp)) {
22544102adabSPaul E. McKenney 
22554102adabSPaul E. McKenney 			/* Other bits still set at this level, so done. */
225667c583a7SBoqun Feng 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
22574102adabSPaul E. McKenney 			return;
22584102adabSPaul E. McKenney 		}
2259d43a5d32SPaul E. McKenney 		rnp->completedqs = rnp->gp_seq;
22604102adabSPaul E. McKenney 		mask = rnp->grpmask;
22614102adabSPaul E. McKenney 		if (rnp->parent == NULL) {
22624102adabSPaul E. McKenney 
22634102adabSPaul E. McKenney 			/* No more levels.  Exit loop holding root lock. */
22644102adabSPaul E. McKenney 
22654102adabSPaul E. McKenney 			break;
22664102adabSPaul E. McKenney 		}
226767c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
22684102adabSPaul E. McKenney 		rnp_c = rnp;
22694102adabSPaul E. McKenney 		rnp = rnp->parent;
22702a67e741SPeter Zijlstra 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
2271654e9533SPaul E. McKenney 		oldmask = rnp_c->qsmask;
22724102adabSPaul E. McKenney 	}
22734102adabSPaul E. McKenney 
22744102adabSPaul E. McKenney 	/*
22754102adabSPaul E. McKenney 	 * Get here if we are the last CPU to pass through a quiescent
22764102adabSPaul E. McKenney 	 * state for this grace period.  Invoke rcu_report_qs_rsp()
22774102adabSPaul E. McKenney 	 * to clean up and start the next grace period if one is needed.
22784102adabSPaul E. McKenney 	 */
2279aff4e9edSPaul E. McKenney 	rcu_report_qs_rsp(flags); /* releases rnp->lock. */
22804102adabSPaul E. McKenney }
22814102adabSPaul E. McKenney 
22824102adabSPaul E. McKenney /*
2283cc99a310SPaul E. McKenney  * Record a quiescent state for all tasks that were previously queued
2284cc99a310SPaul E. McKenney  * on the specified rcu_node structure and that were blocking the current
2285cc99a310SPaul E. McKenney  * RCU grace period.  The caller must hold the specified rnp->lock with
2286cc99a310SPaul E. McKenney  * irqs disabled, and this lock is released upon return, but irqs remain
2287cc99a310SPaul E. McKenney  * disabled.
2288cc99a310SPaul E. McKenney  */
228917a8212bSPaul E. McKenney static void __maybe_unused
2290139ad4daSPaul E. McKenney rcu_report_unblock_qs_rnp(struct rcu_node *rnp, unsigned long flags)
2291cc99a310SPaul E. McKenney 	__releases(rnp->lock)
2292cc99a310SPaul E. McKenney {
2293654e9533SPaul E. McKenney 	unsigned long gps;
2294cc99a310SPaul E. McKenney 	unsigned long mask;
2295cc99a310SPaul E. McKenney 	struct rcu_node *rnp_p;
2296cc99a310SPaul E. McKenney 
2297a32e01eeSMatthew Wilcox 	raw_lockdep_assert_held_rcu_node(rnp);
229845975c7dSPaul E. McKenney 	if (WARN_ON_ONCE(!IS_ENABLED(CONFIG_PREEMPT)) ||
2299c74859d1SPaul E. McKenney 	    WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp)) ||
2300c74859d1SPaul E. McKenney 	    rnp->qsmask != 0) {
230167c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
2302cc99a310SPaul E. McKenney 		return;  /* Still need more quiescent states! */
2303cc99a310SPaul E. McKenney 	}
2304cc99a310SPaul E. McKenney 
230577cfc7bfSPaul E. McKenney 	rnp->completedqs = rnp->gp_seq;
2306cc99a310SPaul E. McKenney 	rnp_p = rnp->parent;
2307cc99a310SPaul E. McKenney 	if (rnp_p == NULL) {
2308cc99a310SPaul E. McKenney 		/*
2309a77da14cSPaul E. McKenney 		 * Only one rcu_node structure in the tree, so don't
2310a77da14cSPaul E. McKenney 		 * try to report up to its nonexistent parent!
2311cc99a310SPaul E. McKenney 		 */
2312aff4e9edSPaul E. McKenney 		rcu_report_qs_rsp(flags);
2313cc99a310SPaul E. McKenney 		return;
2314cc99a310SPaul E. McKenney 	}
2315cc99a310SPaul E. McKenney 
2316c9a24e2dSPaul E. McKenney 	/* Report up the rest of the hierarchy, tracking current ->gp_seq. */
2317c9a24e2dSPaul E. McKenney 	gps = rnp->gp_seq;
2318cc99a310SPaul E. McKenney 	mask = rnp->grpmask;
231967c583a7SBoqun Feng 	raw_spin_unlock_rcu_node(rnp);	/* irqs remain disabled. */
23202a67e741SPeter Zijlstra 	raw_spin_lock_rcu_node(rnp_p);	/* irqs already disabled. */
2321b50912d0SPaul E. McKenney 	rcu_report_qs_rnp(mask, rnp_p, gps, flags);
2322cc99a310SPaul E. McKenney }
2323cc99a310SPaul E. McKenney 
2324cc99a310SPaul E. McKenney /*
23254102adabSPaul E. McKenney  * Record a quiescent state for the specified CPU to that CPU's rcu_data
23264b455dc3SPaul E. McKenney  * structure.  This must be called from the specified CPU.
23274102adabSPaul E. McKenney  */
23284102adabSPaul E. McKenney static void
232933085c46SPaul E. McKenney rcu_report_qs_rdp(int cpu, struct rcu_data *rdp)
23304102adabSPaul E. McKenney {
23314102adabSPaul E. McKenney 	unsigned long flags;
23324102adabSPaul E. McKenney 	unsigned long mask;
233348a7639cSPaul E. McKenney 	bool needwake;
23344102adabSPaul E. McKenney 	struct rcu_node *rnp;
23354102adabSPaul E. McKenney 
23364102adabSPaul E. McKenney 	rnp = rdp->mynode;
23372a67e741SPeter Zijlstra 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
2338c9a24e2dSPaul E. McKenney 	if (rdp->cpu_no_qs.b.norm || rdp->gp_seq != rnp->gp_seq ||
2339c9a24e2dSPaul E. McKenney 	    rdp->gpwrap) {
23404102adabSPaul E. McKenney 
23414102adabSPaul E. McKenney 		/*
23424102adabSPaul E. McKenney 		 * The grace period in which this quiescent state was
23434102adabSPaul E. McKenney 		 * recorded has ended, so don't report it upwards.
23444102adabSPaul E. McKenney 		 * We will instead need a new quiescent state that lies
23454102adabSPaul E. McKenney 		 * within the current grace period.
23464102adabSPaul E. McKenney 		 */
23475b74c458SPaul E. McKenney 		rdp->cpu_no_qs.b.norm = true;	/* need qs for new gp. */
23489577df9aSPaul E. McKenney 		rdp->rcu_qs_ctr_snap = __this_cpu_read(rcu_dynticks.rcu_qs_ctr);
234967c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
23504102adabSPaul E. McKenney 		return;
23514102adabSPaul E. McKenney 	}
23524102adabSPaul E. McKenney 	mask = rdp->grpmask;
23534102adabSPaul E. McKenney 	if ((rnp->qsmask & mask) == 0) {
235467c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
23554102adabSPaul E. McKenney 	} else {
2356bb53e416SPaul E. McKenney 		rdp->core_needs_qs = false;
23574102adabSPaul E. McKenney 
23584102adabSPaul E. McKenney 		/*
23594102adabSPaul E. McKenney 		 * This GP can't end until cpu checks in, so all of our
23604102adabSPaul E. McKenney 		 * callbacks can be processed during the next GP.
23614102adabSPaul E. McKenney 		 */
236202f50142SPaul E. McKenney 		needwake = rcu_accelerate_cbs(rnp, rdp);
23634102adabSPaul E. McKenney 
2364b50912d0SPaul E. McKenney 		rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
2365654e9533SPaul E. McKenney 		/* ^^^ Released rnp->lock */
236648a7639cSPaul E. McKenney 		if (needwake)
2367532c00c9SPaul E. McKenney 			rcu_gp_kthread_wake();
23684102adabSPaul E. McKenney 	}
23694102adabSPaul E. McKenney }
23704102adabSPaul E. McKenney 
23714102adabSPaul E. McKenney /*
23724102adabSPaul E. McKenney  * Check to see if there is a new grace period of which this CPU
23734102adabSPaul E. McKenney  * is not yet aware, and if so, set up local rcu_data state for it.
23744102adabSPaul E. McKenney  * Otherwise, see if this CPU has just passed through its first
23754102adabSPaul E. McKenney  * quiescent state for this grace period, and record that fact if so.
23764102adabSPaul E. McKenney  */
23774102adabSPaul E. McKenney static void
23788087d3e3SPaul E. McKenney rcu_check_quiescent_state(struct rcu_data *rdp)
23794102adabSPaul E. McKenney {
23804102adabSPaul E. McKenney 	/* Check for grace-period ends and beginnings. */
238115cabdffSPaul E. McKenney 	note_gp_changes(rdp);
23824102adabSPaul E. McKenney 
23834102adabSPaul E. McKenney 	/*
23844102adabSPaul E. McKenney 	 * Does this CPU still need to do its part for current grace period?
23854102adabSPaul E. McKenney 	 * If no, return and let the other CPUs do their part as well.
23864102adabSPaul E. McKenney 	 */
238797c668b8SPaul E. McKenney 	if (!rdp->core_needs_qs)
23884102adabSPaul E. McKenney 		return;
23894102adabSPaul E. McKenney 
23904102adabSPaul E. McKenney 	/*
23914102adabSPaul E. McKenney 	 * Was there a quiescent state since the beginning of the grace
23924102adabSPaul E. McKenney 	 * period? If no, then exit and wait for the next call.
23934102adabSPaul E. McKenney 	 */
23943a19b46aSPaul E. McKenney 	if (rdp->cpu_no_qs.b.norm)
23954102adabSPaul E. McKenney 		return;
23964102adabSPaul E. McKenney 
23974102adabSPaul E. McKenney 	/*
23984102adabSPaul E. McKenney 	 * Tell RCU we are done (but rcu_report_qs_rdp() will be the
23994102adabSPaul E. McKenney 	 * judge of that).
24004102adabSPaul E. McKenney 	 */
240133085c46SPaul E. McKenney 	rcu_report_qs_rdp(rdp->cpu, rdp);
24024102adabSPaul E. McKenney }
24034102adabSPaul E. McKenney 
24044102adabSPaul E. McKenney /*
2405780cd590SPaul E. McKenney  * Near the end of the offline process.  Trace the fact that this CPU
2406780cd590SPaul E. McKenney  * is going offline.
24074102adabSPaul E. McKenney  */
2408780cd590SPaul E. McKenney int rcutree_dying_cpu(unsigned int cpu)
24094102adabSPaul E. McKenney {
2410477351f7SPaul E. McKenney 	RCU_TRACE(bool blkd;)
2411da1df50dSPaul E. McKenney 	RCU_TRACE(struct rcu_data *rdp = this_cpu_ptr(&rcu_data);)
241288a4976dSPaul E. McKenney 	RCU_TRACE(struct rcu_node *rnp = rdp->mynode;)
24134102adabSPaul E. McKenney 
2414ea46351cSPaul E. McKenney 	if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
2415780cd590SPaul E. McKenney 		return 0;
2416ea46351cSPaul E. McKenney 
2417477351f7SPaul E. McKenney 	RCU_TRACE(blkd = !!(rnp->qsmask & rdp->grpmask);)
2418780cd590SPaul E. McKenney 	trace_rcu_grace_period(rcu_state.name, rnp->gp_seq,
2419477351f7SPaul E. McKenney 			       blkd ? TPS("cpuofl") : TPS("cpuofl-bgp"));
2420780cd590SPaul E. McKenney 	return 0;
24214102adabSPaul E. McKenney }
24224102adabSPaul E. McKenney 
24234102adabSPaul E. McKenney /*
24248af3a5e7SPaul E. McKenney  * All CPUs for the specified rcu_node structure have gone offline,
24258af3a5e7SPaul E. McKenney  * and all tasks that were preempted within an RCU read-side critical
24268af3a5e7SPaul E. McKenney  * section while running on one of those CPUs have since exited their RCU
24278af3a5e7SPaul E. McKenney  * read-side critical section.  Some other CPU is reporting this fact with
24288af3a5e7SPaul E. McKenney  * the specified rcu_node structure's ->lock held and interrupts disabled.
24298af3a5e7SPaul E. McKenney  * This function therefore goes up the tree of rcu_node structures,
24308af3a5e7SPaul E. McKenney  * clearing the corresponding bits in the ->qsmaskinit fields.  Note that
24318af3a5e7SPaul E. McKenney  * the leaf rcu_node structure's ->qsmaskinit field has already been
2432c50cbe53SPaul E. McKenney  * updated.
24338af3a5e7SPaul E. McKenney  *
24348af3a5e7SPaul E. McKenney  * This function does check that the specified rcu_node structure has
24358af3a5e7SPaul E. McKenney  * all CPUs offline and no blocked tasks, so it is OK to invoke it
24368af3a5e7SPaul E. McKenney  * prematurely.  That said, invoking it after the fact will cost you
24378af3a5e7SPaul E. McKenney  * a needless lock acquisition.  So once it has done its work, don't
24388af3a5e7SPaul E. McKenney  * invoke it again.
24398af3a5e7SPaul E. McKenney  */
24408af3a5e7SPaul E. McKenney static void rcu_cleanup_dead_rnp(struct rcu_node *rnp_leaf)
24418af3a5e7SPaul E. McKenney {
24428af3a5e7SPaul E. McKenney 	long mask;
24438af3a5e7SPaul E. McKenney 	struct rcu_node *rnp = rnp_leaf;
24448af3a5e7SPaul E. McKenney 
2445962aff03SPaul E. McKenney 	raw_lockdep_assert_held_rcu_node(rnp_leaf);
2446ea46351cSPaul E. McKenney 	if (!IS_ENABLED(CONFIG_HOTPLUG_CPU) ||
2447962aff03SPaul E. McKenney 	    WARN_ON_ONCE(rnp_leaf->qsmaskinit) ||
2448962aff03SPaul E. McKenney 	    WARN_ON_ONCE(rcu_preempt_has_tasks(rnp_leaf)))
24498af3a5e7SPaul E. McKenney 		return;
24508af3a5e7SPaul E. McKenney 	for (;;) {
24518af3a5e7SPaul E. McKenney 		mask = rnp->grpmask;
24528af3a5e7SPaul E. McKenney 		rnp = rnp->parent;
24538af3a5e7SPaul E. McKenney 		if (!rnp)
24548af3a5e7SPaul E. McKenney 			break;
24552a67e741SPeter Zijlstra 		raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
24568af3a5e7SPaul E. McKenney 		rnp->qsmaskinit &= ~mask;
2457962aff03SPaul E. McKenney 		/* Between grace periods, so better already be zero! */
2458962aff03SPaul E. McKenney 		WARN_ON_ONCE(rnp->qsmask);
24598af3a5e7SPaul E. McKenney 		if (rnp->qsmaskinit) {
246067c583a7SBoqun Feng 			raw_spin_unlock_rcu_node(rnp);
246167c583a7SBoqun Feng 			/* irqs remain disabled. */
24628af3a5e7SPaul E. McKenney 			return;
24638af3a5e7SPaul E. McKenney 		}
246467c583a7SBoqun Feng 		raw_spin_unlock_rcu_node(rnp); /* irqs remain disabled. */
24658af3a5e7SPaul E. McKenney 	}
24668af3a5e7SPaul E. McKenney }
24678af3a5e7SPaul E. McKenney 
24688af3a5e7SPaul E. McKenney /*
24694102adabSPaul E. McKenney  * The CPU has been completely removed, and some other CPU is reporting
2470a58163d8SPaul E. McKenney  * this fact from process context.  Do the remainder of the cleanup.
2471a58163d8SPaul E. McKenney  * There can only be one CPU hotplug operation at a time, so no need for
2472a58163d8SPaul E. McKenney  * explicit locking.
24734102adabSPaul E. McKenney  */
2474780cd590SPaul E. McKenney int rcutree_dead_cpu(unsigned int cpu)
24754102adabSPaul E. McKenney {
2476da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
24774102adabSPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;  /* Outgoing CPU's rdp & rnp. */
24784102adabSPaul E. McKenney 
2479ea46351cSPaul E. McKenney 	if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
2480780cd590SPaul E. McKenney 		return 0;
2481ea46351cSPaul E. McKenney 
24824102adabSPaul E. McKenney 	/* Adjust any no-longer-needed kthreads. */
24834102adabSPaul E. McKenney 	rcu_boost_kthread_setaffinity(rnp, -1);
2484780cd590SPaul E. McKenney 	/* Do any needed no-CB deferred wakeups from this CPU. */
2485780cd590SPaul E. McKenney 	do_nocb_deferred_wakeup(per_cpu_ptr(&rcu_data, cpu));
2486780cd590SPaul E. McKenney 	return 0;
24874102adabSPaul E. McKenney }
24884102adabSPaul E. McKenney 
24894102adabSPaul E. McKenney /*
24904102adabSPaul E. McKenney  * Invoke any RCU callbacks that have made it to the end of their grace
24914102adabSPaul E. McKenney  * period.  Thottle as specified by rdp->blimit.
24924102adabSPaul E. McKenney  */
24935bb5d09cSPaul E. McKenney static void rcu_do_batch(struct rcu_data *rdp)
24944102adabSPaul E. McKenney {
24954102adabSPaul E. McKenney 	unsigned long flags;
249615fecf89SPaul E. McKenney 	struct rcu_head *rhp;
249715fecf89SPaul E. McKenney 	struct rcu_cblist rcl = RCU_CBLIST_INITIALIZER(rcl);
249815fecf89SPaul E. McKenney 	long bl, count;
24995bb5d09cSPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
25004102adabSPaul E. McKenney 
25014102adabSPaul E. McKenney 	/* If no callbacks are ready, just return. */
250215fecf89SPaul E. McKenney 	if (!rcu_segcblist_ready_cbs(&rdp->cblist)) {
250315fecf89SPaul E. McKenney 		trace_rcu_batch_start(rsp->name,
250415fecf89SPaul E. McKenney 				      rcu_segcblist_n_lazy_cbs(&rdp->cblist),
250515fecf89SPaul E. McKenney 				      rcu_segcblist_n_cbs(&rdp->cblist), 0);
250615fecf89SPaul E. McKenney 		trace_rcu_batch_end(rsp->name, 0,
250715fecf89SPaul E. McKenney 				    !rcu_segcblist_empty(&rdp->cblist),
25084102adabSPaul E. McKenney 				    need_resched(), is_idle_task(current),
25094102adabSPaul E. McKenney 				    rcu_is_callbacks_kthread());
25104102adabSPaul E. McKenney 		return;
25114102adabSPaul E. McKenney 	}
25124102adabSPaul E. McKenney 
25134102adabSPaul E. McKenney 	/*
25144102adabSPaul E. McKenney 	 * Extract the list of ready callbacks, disabling to prevent
251515fecf89SPaul E. McKenney 	 * races with call_rcu() from interrupt handlers.  Leave the
251615fecf89SPaul E. McKenney 	 * callback counts, as rcu_barrier() needs to be conservative.
25174102adabSPaul E. McKenney 	 */
25184102adabSPaul E. McKenney 	local_irq_save(flags);
25194102adabSPaul E. McKenney 	WARN_ON_ONCE(cpu_is_offline(smp_processor_id()));
25204102adabSPaul E. McKenney 	bl = rdp->blimit;
252115fecf89SPaul E. McKenney 	trace_rcu_batch_start(rsp->name, rcu_segcblist_n_lazy_cbs(&rdp->cblist),
252215fecf89SPaul E. McKenney 			      rcu_segcblist_n_cbs(&rdp->cblist), bl);
252315fecf89SPaul E. McKenney 	rcu_segcblist_extract_done_cbs(&rdp->cblist, &rcl);
25244102adabSPaul E. McKenney 	local_irq_restore(flags);
25254102adabSPaul E. McKenney 
25264102adabSPaul E. McKenney 	/* Invoke callbacks. */
252715fecf89SPaul E. McKenney 	rhp = rcu_cblist_dequeue(&rcl);
252815fecf89SPaul E. McKenney 	for (; rhp; rhp = rcu_cblist_dequeue(&rcl)) {
252915fecf89SPaul E. McKenney 		debug_rcu_head_unqueue(rhp);
253015fecf89SPaul E. McKenney 		if (__rcu_reclaim(rsp->name, rhp))
253115fecf89SPaul E. McKenney 			rcu_cblist_dequeued_lazy(&rcl);
253215fecf89SPaul E. McKenney 		/*
253315fecf89SPaul E. McKenney 		 * Stop only if limit reached and CPU has something to do.
253415fecf89SPaul E. McKenney 		 * Note: The rcl structure counts down from zero.
253515fecf89SPaul E. McKenney 		 */
25364b27f20bSPaul E. McKenney 		if (-rcl.len >= bl &&
25374102adabSPaul E. McKenney 		    (need_resched() ||
25384102adabSPaul E. McKenney 		     (!is_idle_task(current) && !rcu_is_callbacks_kthread())))
25394102adabSPaul E. McKenney 			break;
25404102adabSPaul E. McKenney 	}
25414102adabSPaul E. McKenney 
25424102adabSPaul E. McKenney 	local_irq_save(flags);
25434b27f20bSPaul E. McKenney 	count = -rcl.len;
25448ef0f37eSPaul E. McKenney 	trace_rcu_batch_end(rsp->name, count, !!rcl.head, need_resched(),
25458ef0f37eSPaul E. McKenney 			    is_idle_task(current), rcu_is_callbacks_kthread());
25464102adabSPaul E. McKenney 
254715fecf89SPaul E. McKenney 	/* Update counts and requeue any remaining callbacks. */
254815fecf89SPaul E. McKenney 	rcu_segcblist_insert_done_cbs(&rdp->cblist, &rcl);
25494102adabSPaul E. McKenney 	smp_mb(); /* List handling before counting for rcu_barrier(). */
255015fecf89SPaul E. McKenney 	rcu_segcblist_insert_count(&rdp->cblist, &rcl);
25514102adabSPaul E. McKenney 
25524102adabSPaul E. McKenney 	/* Reinstate batch limit if we have worked down the excess. */
255315fecf89SPaul E. McKenney 	count = rcu_segcblist_n_cbs(&rdp->cblist);
255415fecf89SPaul E. McKenney 	if (rdp->blimit == LONG_MAX && count <= qlowmark)
25554102adabSPaul E. McKenney 		rdp->blimit = blimit;
25564102adabSPaul E. McKenney 
25574102adabSPaul E. McKenney 	/* Reset ->qlen_last_fqs_check trigger if enough CBs have drained. */
255815fecf89SPaul E. McKenney 	if (count == 0 && rdp->qlen_last_fqs_check != 0) {
25594102adabSPaul E. McKenney 		rdp->qlen_last_fqs_check = 0;
25604102adabSPaul E. McKenney 		rdp->n_force_qs_snap = rsp->n_force_qs;
256115fecf89SPaul E. McKenney 	} else if (count < rdp->qlen_last_fqs_check - qhimark)
256215fecf89SPaul E. McKenney 		rdp->qlen_last_fqs_check = count;
2563efd88b02SPaul E. McKenney 
2564efd88b02SPaul E. McKenney 	/*
2565efd88b02SPaul E. McKenney 	 * The following usually indicates a double call_rcu().  To track
2566efd88b02SPaul E. McKenney 	 * this down, try building with CONFIG_DEBUG_OBJECTS_RCU_HEAD=y.
2567efd88b02SPaul E. McKenney 	 */
256815fecf89SPaul E. McKenney 	WARN_ON_ONCE(rcu_segcblist_empty(&rdp->cblist) != (count == 0));
25694102adabSPaul E. McKenney 
25704102adabSPaul E. McKenney 	local_irq_restore(flags);
25714102adabSPaul E. McKenney 
25724102adabSPaul E. McKenney 	/* Re-invoke RCU core processing if there are callbacks remaining. */
257315fecf89SPaul E. McKenney 	if (rcu_segcblist_ready_cbs(&rdp->cblist))
25744102adabSPaul E. McKenney 		invoke_rcu_core();
25754102adabSPaul E. McKenney }
25764102adabSPaul E. McKenney 
25774102adabSPaul E. McKenney /*
25784102adabSPaul E. McKenney  * Check to see if this CPU is in a non-context-switch quiescent state
25794102adabSPaul E. McKenney  * (user mode or idle loop for rcu, non-softirq execution for rcu_bh).
25804102adabSPaul E. McKenney  * Also schedule RCU core processing.
25814102adabSPaul E. McKenney  *
25824102adabSPaul E. McKenney  * This function must be called from hardirq context.  It is normally
25835403d367SPaul E. McKenney  * invoked from the scheduling-clock interrupt.
25844102adabSPaul E. McKenney  */
2585c3377c2dSPaul E. McKenney void rcu_check_callbacks(int user)
25864102adabSPaul E. McKenney {
25874102adabSPaul E. McKenney 	trace_rcu_utilization(TPS("Start scheduler-tick"));
25884102adabSPaul E. McKenney 	increment_cpu_stall_ticks();
258945975c7dSPaul E. McKenney 	rcu_flavor_check_callbacks(user);
2590e3950ecdSPaul E. McKenney 	if (rcu_pending())
25914102adabSPaul E. McKenney 		invoke_rcu_core();
259207f27570SByungchul Park 
25934102adabSPaul E. McKenney 	trace_rcu_utilization(TPS("End scheduler-tick"));
25944102adabSPaul E. McKenney }
25954102adabSPaul E. McKenney 
25964102adabSPaul E. McKenney /*
25974102adabSPaul E. McKenney  * Scan the leaf rcu_node structures, processing dyntick state for any that
25984102adabSPaul E. McKenney  * have not yet encountered a quiescent state, using the function specified.
25994102adabSPaul E. McKenney  * Also initiate boosting for any threads blocked on the root rcu_node.
26004102adabSPaul E. McKenney  *
26014102adabSPaul E. McKenney  * The caller must have suppressed start of new grace periods.
26024102adabSPaul E. McKenney  */
2603e9ecb780SPaul E. McKenney static void force_qs_rnp(int (*f)(struct rcu_data *rsp))
26044102adabSPaul E. McKenney {
26054102adabSPaul E. McKenney 	int cpu;
26064102adabSPaul E. McKenney 	unsigned long flags;
26074102adabSPaul E. McKenney 	unsigned long mask;
26084102adabSPaul E. McKenney 	struct rcu_node *rnp;
2609e9ecb780SPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
26104102adabSPaul E. McKenney 
26114102adabSPaul E. McKenney 	rcu_for_each_leaf_node(rsp, rnp) {
2612cee43939SPaul E. McKenney 		cond_resched_tasks_rcu_qs();
26134102adabSPaul E. McKenney 		mask = 0;
26142a67e741SPeter Zijlstra 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
26154102adabSPaul E. McKenney 		if (rnp->qsmask == 0) {
261645975c7dSPaul E. McKenney 			if (!IS_ENABLED(CONFIG_PREEMPT) ||
2617a77da14cSPaul E. McKenney 			    rcu_preempt_blocked_readers_cgp(rnp)) {
2618a77da14cSPaul E. McKenney 				/*
2619a77da14cSPaul E. McKenney 				 * No point in scanning bits because they
2620a77da14cSPaul E. McKenney 				 * are all zero.  But we might need to
2621a77da14cSPaul E. McKenney 				 * priority-boost blocked readers.
2622a77da14cSPaul E. McKenney 				 */
2623a77da14cSPaul E. McKenney 				rcu_initiate_boost(rnp, flags);
2624a77da14cSPaul E. McKenney 				/* rcu_initiate_boost() releases rnp->lock */
26254102adabSPaul E. McKenney 				continue;
26264102adabSPaul E. McKenney 			}
262792816435SPaul E. McKenney 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
262892816435SPaul E. McKenney 			continue;
2629a77da14cSPaul E. McKenney 		}
2630bc75e999SMark Rutland 		for_each_leaf_node_possible_cpu(rnp, cpu) {
2631bc75e999SMark Rutland 			unsigned long bit = leaf_node_cpu_bit(rnp, cpu);
26324102adabSPaul E. McKenney 			if ((rnp->qsmask & bit) != 0) {
2633da1df50dSPaul E. McKenney 				if (f(per_cpu_ptr(&rcu_data, cpu)))
26344102adabSPaul E. McKenney 					mask |= bit;
26354102adabSPaul E. McKenney 			}
26364102adabSPaul E. McKenney 		}
26374102adabSPaul E. McKenney 		if (mask != 0) {
2638c9a24e2dSPaul E. McKenney 			/* Idle/offline CPUs, report (releases rnp->lock). */
2639b50912d0SPaul E. McKenney 			rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
26400aa04b05SPaul E. McKenney 		} else {
26410aa04b05SPaul E. McKenney 			/* Nothing to do here, so just drop the lock. */
264267c583a7SBoqun Feng 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
26434102adabSPaul E. McKenney 		}
26444102adabSPaul E. McKenney 	}
26450aa04b05SPaul E. McKenney }
26464102adabSPaul E. McKenney 
26474102adabSPaul E. McKenney /*
26484102adabSPaul E. McKenney  * Force quiescent states on reluctant CPUs, and also detect which
26494102adabSPaul E. McKenney  * CPUs are in dyntick-idle mode.
26504102adabSPaul E. McKenney  */
2651e9ecb780SPaul E. McKenney static void force_quiescent_state(void)
26524102adabSPaul E. McKenney {
26534102adabSPaul E. McKenney 	unsigned long flags;
26544102adabSPaul E. McKenney 	bool ret;
26554102adabSPaul E. McKenney 	struct rcu_node *rnp;
26564102adabSPaul E. McKenney 	struct rcu_node *rnp_old = NULL;
2657e9ecb780SPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
26584102adabSPaul E. McKenney 
26594102adabSPaul E. McKenney 	/* Funnel through hierarchy to reduce memory contention. */
2660da1df50dSPaul E. McKenney 	rnp = __this_cpu_read(rcu_data.mynode);
26614102adabSPaul E. McKenney 	for (; rnp != NULL; rnp = rnp->parent) {
26627d0ae808SPaul E. McKenney 		ret = (READ_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) ||
26634102adabSPaul E. McKenney 		      !raw_spin_trylock(&rnp->fqslock);
26644102adabSPaul E. McKenney 		if (rnp_old != NULL)
26654102adabSPaul E. McKenney 			raw_spin_unlock(&rnp_old->fqslock);
2666d62df573SPaul E. McKenney 		if (ret)
26674102adabSPaul E. McKenney 			return;
26684102adabSPaul E. McKenney 		rnp_old = rnp;
26694102adabSPaul E. McKenney 	}
2670336a4f6cSPaul E. McKenney 	/* rnp_old == rcu_get_root(), rnp == NULL. */
26714102adabSPaul E. McKenney 
26724102adabSPaul E. McKenney 	/* Reached the root of the rcu_node tree, acquire lock. */
26732a67e741SPeter Zijlstra 	raw_spin_lock_irqsave_rcu_node(rnp_old, flags);
26744102adabSPaul E. McKenney 	raw_spin_unlock(&rnp_old->fqslock);
26757d0ae808SPaul E. McKenney 	if (READ_ONCE(rsp->gp_flags) & RCU_GP_FLAG_FQS) {
267667c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp_old, flags);
26774102adabSPaul E. McKenney 		return;  /* Someone beat us to it. */
26784102adabSPaul E. McKenney 	}
26797d0ae808SPaul E. McKenney 	WRITE_ONCE(rsp->gp_flags, READ_ONCE(rsp->gp_flags) | RCU_GP_FLAG_FQS);
268067c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp_old, flags);
2681532c00c9SPaul E. McKenney 	rcu_gp_kthread_wake();
26824102adabSPaul E. McKenney }
26834102adabSPaul E. McKenney 
26844102adabSPaul E. McKenney /*
268526d950a9SPaul E. McKenney  * This function checks for grace-period requests that fail to motivate
268626d950a9SPaul E. McKenney  * RCU to come out of its idle mode.
268726d950a9SPaul E. McKenney  */
268826d950a9SPaul E. McKenney static void
2689b96f9dc4SPaul E. McKenney rcu_check_gp_start_stall(struct rcu_node *rnp, struct rcu_data *rdp)
269026d950a9SPaul E. McKenney {
2691b06ae25aSPaul E. McKenney 	const unsigned long gpssdelay = rcu_jiffies_till_stall_check() * HZ;
269226d950a9SPaul E. McKenney 	unsigned long flags;
269326d950a9SPaul E. McKenney 	unsigned long j;
2694336a4f6cSPaul E. McKenney 	struct rcu_node *rnp_root = rcu_get_root();
2695b96f9dc4SPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
269626d950a9SPaul E. McKenney 	static atomic_t warned = ATOMIC_INIT(0);
269726d950a9SPaul E. McKenney 
2698de8e8730SPaul E. McKenney 	if (!IS_ENABLED(CONFIG_PROVE_RCU) || rcu_gp_in_progress() ||
26997a1d0f23SPaul E. McKenney 	    ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed))
270026d950a9SPaul E. McKenney 		return;
270126d950a9SPaul E. McKenney 	j = jiffies; /* Expensive access, and in common case don't get here. */
2702b06ae25aSPaul E. McKenney 	if (time_before(j, READ_ONCE(rsp->gp_req_activity) + gpssdelay) ||
2703b06ae25aSPaul E. McKenney 	    time_before(j, READ_ONCE(rsp->gp_activity) + gpssdelay) ||
270426d950a9SPaul E. McKenney 	    atomic_read(&warned))
270526d950a9SPaul E. McKenney 		return;
270626d950a9SPaul E. McKenney 
270726d950a9SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
270826d950a9SPaul E. McKenney 	j = jiffies;
2709de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress() ||
27107a1d0f23SPaul E. McKenney 	    ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed) ||
2711b06ae25aSPaul E. McKenney 	    time_before(j, READ_ONCE(rsp->gp_req_activity) + gpssdelay) ||
2712b06ae25aSPaul E. McKenney 	    time_before(j, READ_ONCE(rsp->gp_activity) + gpssdelay) ||
271326d950a9SPaul E. McKenney 	    atomic_read(&warned)) {
271426d950a9SPaul E. McKenney 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
271526d950a9SPaul E. McKenney 		return;
271626d950a9SPaul E. McKenney 	}
271726d950a9SPaul E. McKenney 	/* Hold onto the leaf lock to make others see warned==1. */
271826d950a9SPaul E. McKenney 
271926d950a9SPaul E. McKenney 	if (rnp_root != rnp)
272026d950a9SPaul E. McKenney 		raw_spin_lock_rcu_node(rnp_root); /* irqs already disabled. */
272126d950a9SPaul E. McKenney 	j = jiffies;
2722de8e8730SPaul E. McKenney 	if (rcu_gp_in_progress() ||
27237a1d0f23SPaul E. McKenney 	    ULONG_CMP_GE(rnp_root->gp_seq, rnp_root->gp_seq_needed) ||
2724b06ae25aSPaul E. McKenney 	    time_before(j, rsp->gp_req_activity + gpssdelay) ||
2725b06ae25aSPaul E. McKenney 	    time_before(j, rsp->gp_activity + gpssdelay) ||
272626d950a9SPaul E. McKenney 	    atomic_xchg(&warned, 1)) {
272726d950a9SPaul E. McKenney 		raw_spin_unlock_rcu_node(rnp_root); /* irqs remain disabled. */
272826d950a9SPaul E. McKenney 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
272926d950a9SPaul E. McKenney 		return;
273026d950a9SPaul E. McKenney 	}
2731b06ae25aSPaul E. McKenney 	pr_alert("%s: g%ld->%ld gar:%lu ga:%lu f%#x gs:%d %s->state:%#lx\n",
27327a1d0f23SPaul E. McKenney 		 __func__, (long)READ_ONCE(rsp->gp_seq),
27337a1d0f23SPaul E. McKenney 		 (long)READ_ONCE(rnp_root->gp_seq_needed),
273426d950a9SPaul E. McKenney 		 j - rsp->gp_req_activity, j - rsp->gp_activity,
2735b06ae25aSPaul E. McKenney 		 rsp->gp_flags, rsp->gp_state, rsp->name,
273626d950a9SPaul E. McKenney 		 rsp->gp_kthread ? rsp->gp_kthread->state : 0x1ffffL);
273726d950a9SPaul E. McKenney 	WARN_ON(1);
273826d950a9SPaul E. McKenney 	if (rnp_root != rnp)
273926d950a9SPaul E. McKenney 		raw_spin_unlock_rcu_node(rnp_root);
274026d950a9SPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
274126d950a9SPaul E. McKenney }
274226d950a9SPaul E. McKenney 
274326d950a9SPaul E. McKenney /*
2744b049fdf8SPaul E. McKenney  * This does the RCU core processing work for the specified rcu_data
2745b049fdf8SPaul E. McKenney  * structures.  This may be called only from the CPU to whom the rdp
2746b049fdf8SPaul E. McKenney  * belongs.
27474102adabSPaul E. McKenney  */
2748b049fdf8SPaul E. McKenney static __latent_entropy void rcu_process_callbacks(struct softirq_action *unused)
27494102adabSPaul E. McKenney {
27504102adabSPaul E. McKenney 	unsigned long flags;
2751da1df50dSPaul E. McKenney 	struct rcu_data *rdp = raw_cpu_ptr(&rcu_data);
275226d950a9SPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;
27534102adabSPaul E. McKenney 
2754b049fdf8SPaul E. McKenney 	if (cpu_is_offline(smp_processor_id()))
2755b049fdf8SPaul E. McKenney 		return;
2756b049fdf8SPaul E. McKenney 	trace_rcu_utilization(TPS("Start RCU core"));
275750dc7defSNicholas Mc Guire 	WARN_ON_ONCE(!rdp->beenonline);
27584102adabSPaul E. McKenney 
27593e310098SPaul E. McKenney 	/* Report any deferred quiescent states if preemption enabled. */
27603e310098SPaul E. McKenney 	if (!(preempt_count() & PREEMPT_MASK))
27613e310098SPaul E. McKenney 		rcu_preempt_deferred_qs(current);
27623e310098SPaul E. McKenney 	else if (rcu_preempt_need_deferred_qs(current))
27633e310098SPaul E. McKenney 		resched_cpu(rdp->cpu); /* Provoke future context switch. */
27643e310098SPaul E. McKenney 
27654102adabSPaul E. McKenney 	/* Update RCU state based on any recent quiescent states. */
27668087d3e3SPaul E. McKenney 	rcu_check_quiescent_state(rdp);
27674102adabSPaul E. McKenney 
2768bd7af846SPaul E. McKenney 	/* No grace period and unregistered callbacks? */
2769de8e8730SPaul E. McKenney 	if (!rcu_gp_in_progress() &&
2770bd7af846SPaul E. McKenney 	    rcu_segcblist_is_enabled(&rdp->cblist)) {
27714102adabSPaul E. McKenney 		local_irq_save(flags);
2772e44e73caSPaul E. McKenney 		if (!rcu_segcblist_restempty(&rdp->cblist, RCU_NEXT_READY_TAIL))
2773c6e09b97SPaul E. McKenney 			rcu_accelerate_cbs_unlocked(rnp, rdp);
2774bd7af846SPaul E. McKenney 		local_irq_restore(flags);
27754102adabSPaul E. McKenney 	}
27764102adabSPaul E. McKenney 
2777b96f9dc4SPaul E. McKenney 	rcu_check_gp_start_stall(rnp, rdp);
277826d950a9SPaul E. McKenney 
27794102adabSPaul E. McKenney 	/* If there are callbacks ready, invoke them. */
278015fecf89SPaul E. McKenney 	if (rcu_segcblist_ready_cbs(&rdp->cblist))
2781aff4e9edSPaul E. McKenney 		invoke_rcu_callbacks(rdp);
278296d3fd0dSPaul E. McKenney 
278396d3fd0dSPaul E. McKenney 	/* Do any needed deferred wakeups of rcuo kthreads. */
278496d3fd0dSPaul E. McKenney 	do_nocb_deferred_wakeup(rdp);
27854102adabSPaul E. McKenney 	trace_rcu_utilization(TPS("End RCU core"));
27864102adabSPaul E. McKenney }
27874102adabSPaul E. McKenney 
27884102adabSPaul E. McKenney /*
27894102adabSPaul E. McKenney  * Schedule RCU callback invocation.  If the specified type of RCU
27904102adabSPaul E. McKenney  * does not support RCU priority boosting, just do a direct call,
27914102adabSPaul E. McKenney  * otherwise wake up the per-CPU kernel kthread.  Note that because we
2792924df8a0SPaul E. McKenney  * are running on the current CPU with softirqs disabled, the
27934102adabSPaul E. McKenney  * rcu_cpu_kthread_task cannot disappear out from under us.
27944102adabSPaul E. McKenney  */
2795aff4e9edSPaul E. McKenney static void invoke_rcu_callbacks(struct rcu_data *rdp)
27964102adabSPaul E. McKenney {
2797aff4e9edSPaul E. McKenney 	struct rcu_state *rsp = &rcu_state;
2798aff4e9edSPaul E. McKenney 
27997d0ae808SPaul E. McKenney 	if (unlikely(!READ_ONCE(rcu_scheduler_fully_active)))
28004102adabSPaul E. McKenney 		return;
28014102adabSPaul E. McKenney 	if (likely(!rsp->boost)) {
28025bb5d09cSPaul E. McKenney 		rcu_do_batch(rdp);
28034102adabSPaul E. McKenney 		return;
28044102adabSPaul E. McKenney 	}
28054102adabSPaul E. McKenney 	invoke_rcu_callbacks_kthread();
28064102adabSPaul E. McKenney }
28074102adabSPaul E. McKenney 
28084102adabSPaul E. McKenney static void invoke_rcu_core(void)
28094102adabSPaul E. McKenney {
28104102adabSPaul E. McKenney 	if (cpu_online(smp_processor_id()))
28114102adabSPaul E. McKenney 		raise_softirq(RCU_SOFTIRQ);
28124102adabSPaul E. McKenney }
28134102adabSPaul E. McKenney 
28144102adabSPaul E. McKenney /*
28154102adabSPaul E. McKenney  * Handle any core-RCU processing required by a call_rcu() invocation.
28164102adabSPaul E. McKenney  */
2817*5c7d8967SPaul E. McKenney static void __call_rcu_core(struct rcu_data *rdp, struct rcu_head *head,
2818*5c7d8967SPaul E. McKenney 			    unsigned long flags)
28194102adabSPaul E. McKenney {
28204102adabSPaul E. McKenney 	/*
28214102adabSPaul E. McKenney 	 * If called from an extended quiescent state, invoke the RCU
28224102adabSPaul E. McKenney 	 * core in order to force a re-evaluation of RCU's idleness.
28234102adabSPaul E. McKenney 	 */
28249910affaSYao Dongdong 	if (!rcu_is_watching())
28254102adabSPaul E. McKenney 		invoke_rcu_core();
28264102adabSPaul E. McKenney 
28274102adabSPaul E. McKenney 	/* If interrupts were disabled or CPU offline, don't invoke RCU core. */
28284102adabSPaul E. McKenney 	if (irqs_disabled_flags(flags) || cpu_is_offline(smp_processor_id()))
28294102adabSPaul E. McKenney 		return;
28304102adabSPaul E. McKenney 
28314102adabSPaul E. McKenney 	/*
28324102adabSPaul E. McKenney 	 * Force the grace period if too many callbacks or too long waiting.
28334102adabSPaul E. McKenney 	 * Enforce hysteresis, and don't invoke force_quiescent_state()
28344102adabSPaul E. McKenney 	 * if some other CPU has recently done so.  Also, don't bother
28354102adabSPaul E. McKenney 	 * invoking force_quiescent_state() if the newly enqueued callback
28364102adabSPaul E. McKenney 	 * is the only one waiting for a grace period to complete.
28374102adabSPaul E. McKenney 	 */
283815fecf89SPaul E. McKenney 	if (unlikely(rcu_segcblist_n_cbs(&rdp->cblist) >
283915fecf89SPaul E. McKenney 		     rdp->qlen_last_fqs_check + qhimark)) {
28404102adabSPaul E. McKenney 
28414102adabSPaul E. McKenney 		/* Are we ignoring a completed grace period? */
284215cabdffSPaul E. McKenney 		note_gp_changes(rdp);
28434102adabSPaul E. McKenney 
28444102adabSPaul E. McKenney 		/* Start a new grace period if one not already started. */
2845de8e8730SPaul E. McKenney 		if (!rcu_gp_in_progress()) {
2846c6e09b97SPaul E. McKenney 			rcu_accelerate_cbs_unlocked(rdp->mynode, rdp);
28474102adabSPaul E. McKenney 		} else {
28484102adabSPaul E. McKenney 			/* Give the grace period a kick. */
28494102adabSPaul E. McKenney 			rdp->blimit = LONG_MAX;
2850*5c7d8967SPaul E. McKenney 			if (rcu_state.n_force_qs == rdp->n_force_qs_snap &&
285115fecf89SPaul E. McKenney 			    rcu_segcblist_first_pend_cb(&rdp->cblist) != head)
2852e9ecb780SPaul E. McKenney 				force_quiescent_state();
2853*5c7d8967SPaul E. McKenney 			rdp->n_force_qs_snap = rcu_state.n_force_qs;
285415fecf89SPaul E. McKenney 			rdp->qlen_last_fqs_check = rcu_segcblist_n_cbs(&rdp->cblist);
28554102adabSPaul E. McKenney 		}
28564102adabSPaul E. McKenney 	}
28574102adabSPaul E. McKenney }
28584102adabSPaul E. McKenney 
28594102adabSPaul E. McKenney /*
28604102adabSPaul E. McKenney  * RCU callback function to leak a callback.
28614102adabSPaul E. McKenney  */
28624102adabSPaul E. McKenney static void rcu_leak_callback(struct rcu_head *rhp)
28634102adabSPaul E. McKenney {
28644102adabSPaul E. McKenney }
28654102adabSPaul E. McKenney 
28664102adabSPaul E. McKenney /*
28674102adabSPaul E. McKenney  * Helper function for call_rcu() and friends.  The cpu argument will
28684102adabSPaul E. McKenney  * normally be -1, indicating "currently running CPU".  It may specify
28694102adabSPaul E. McKenney  * a CPU only if that CPU is a no-CBs CPU.  Currently, only _rcu_barrier()
28704102adabSPaul E. McKenney  * is expected to specify a CPU.
28714102adabSPaul E. McKenney  */
28724102adabSPaul E. McKenney static void
2873*5c7d8967SPaul E. McKenney __call_rcu(struct rcu_head *head, rcu_callback_t func, int cpu, bool lazy)
28744102adabSPaul E. McKenney {
28754102adabSPaul E. McKenney 	unsigned long flags;
28764102adabSPaul E. McKenney 	struct rcu_data *rdp;
2877*5c7d8967SPaul E. McKenney 	struct rcu_state __maybe_unused *rsp = &rcu_state;
28784102adabSPaul E. McKenney 
2879b8f2ed53SPaul E. McKenney 	/* Misaligned rcu_head! */
2880b8f2ed53SPaul E. McKenney 	WARN_ON_ONCE((unsigned long)head & (sizeof(void *) - 1));
2881b8f2ed53SPaul E. McKenney 
28824102adabSPaul E. McKenney 	if (debug_rcu_head_queue(head)) {
2883fa3c6647SPaul E. McKenney 		/*
2884fa3c6647SPaul E. McKenney 		 * Probable double call_rcu(), so leak the callback.
2885fa3c6647SPaul E. McKenney 		 * Use rcu:rcu_callback trace event to find the previous
2886fa3c6647SPaul E. McKenney 		 * time callback was passed to __call_rcu().
2887fa3c6647SPaul E. McKenney 		 */
2888fa3c6647SPaul E. McKenney 		WARN_ONCE(1, "__call_rcu(): Double-freed CB %p->%pF()!!!\n",
2889fa3c6647SPaul E. McKenney 			  head, head->func);
28907d0ae808SPaul E. McKenney 		WRITE_ONCE(head->func, rcu_leak_callback);
28914102adabSPaul E. McKenney 		return;
28924102adabSPaul E. McKenney 	}
28934102adabSPaul E. McKenney 	head->func = func;
28944102adabSPaul E. McKenney 	head->next = NULL;
28954102adabSPaul E. McKenney 	local_irq_save(flags);
2896da1df50dSPaul E. McKenney 	rdp = this_cpu_ptr(&rcu_data);
28974102adabSPaul E. McKenney 
28984102adabSPaul E. McKenney 	/* Add the callback to our list. */
289915fecf89SPaul E. McKenney 	if (unlikely(!rcu_segcblist_is_enabled(&rdp->cblist)) || cpu != -1) {
29004102adabSPaul E. McKenney 		int offline;
29014102adabSPaul E. McKenney 
29024102adabSPaul E. McKenney 		if (cpu != -1)
2903da1df50dSPaul E. McKenney 			rdp = per_cpu_ptr(&rcu_data, cpu);
2904143da9c2SPaul E. McKenney 		if (likely(rdp->mynode)) {
2905143da9c2SPaul E. McKenney 			/* Post-boot, so this should be for a no-CBs CPU. */
290696d3fd0dSPaul E. McKenney 			offline = !__call_rcu_nocb(rdp, head, lazy, flags);
29074102adabSPaul E. McKenney 			WARN_ON_ONCE(offline);
2908143da9c2SPaul E. McKenney 			/* Offline CPU, _call_rcu() illegal, leak callback.  */
29094102adabSPaul E. McKenney 			local_irq_restore(flags);
29104102adabSPaul E. McKenney 			return;
29114102adabSPaul E. McKenney 		}
2912143da9c2SPaul E. McKenney 		/*
2913143da9c2SPaul E. McKenney 		 * Very early boot, before rcu_init().  Initialize if needed
2914143da9c2SPaul E. McKenney 		 * and then drop through to queue the callback.
2915143da9c2SPaul E. McKenney 		 */
2916143da9c2SPaul E. McKenney 		BUG_ON(cpu != -1);
291734404ca8SPaul E. McKenney 		WARN_ON_ONCE(!rcu_is_watching());
291815fecf89SPaul E. McKenney 		if (rcu_segcblist_empty(&rdp->cblist))
291915fecf89SPaul E. McKenney 			rcu_segcblist_init(&rdp->cblist);
2920143da9c2SPaul E. McKenney 	}
292115fecf89SPaul E. McKenney 	rcu_segcblist_enqueue(&rdp->cblist, head, lazy);
292215fecf89SPaul E. McKenney 	if (!lazy)
29234102adabSPaul E. McKenney 		rcu_idle_count_callbacks_posted();
29244102adabSPaul E. McKenney 
29254102adabSPaul E. McKenney 	if (__is_kfree_rcu_offset((unsigned long)func))
29264102adabSPaul E. McKenney 		trace_rcu_kfree_callback(rsp->name, head, (unsigned long)func,
292715fecf89SPaul E. McKenney 					 rcu_segcblist_n_lazy_cbs(&rdp->cblist),
292815fecf89SPaul E. McKenney 					 rcu_segcblist_n_cbs(&rdp->cblist));
29294102adabSPaul E. McKenney 	else
293015fecf89SPaul E. McKenney 		trace_rcu_callback(rsp->name, head,
293115fecf89SPaul E. McKenney 				   rcu_segcblist_n_lazy_cbs(&rdp->cblist),
293215fecf89SPaul E. McKenney 				   rcu_segcblist_n_cbs(&rdp->cblist));
29334102adabSPaul E. McKenney 
29344102adabSPaul E. McKenney 	/* Go handle any RCU core processing required. */
2935*5c7d8967SPaul E. McKenney 	__call_rcu_core(rdp, head, flags);
29364102adabSPaul E. McKenney 	local_irq_restore(flags);
29374102adabSPaul E. McKenney }
29384102adabSPaul E. McKenney 
2939a68a2bb2SPaul E. McKenney /**
294045975c7dSPaul E. McKenney  * call_rcu() - Queue an RCU callback for invocation after a grace period.
2941a68a2bb2SPaul E. McKenney  * @head: structure to be used for queueing the RCU updates.
2942a68a2bb2SPaul E. McKenney  * @func: actual callback function to be invoked after the grace period
2943a68a2bb2SPaul E. McKenney  *
2944a68a2bb2SPaul E. McKenney  * The callback function will be invoked some time after a full grace
294545975c7dSPaul E. McKenney  * period elapses, in other words after all pre-existing RCU read-side
294645975c7dSPaul E. McKenney  * critical sections have completed.  However, the callback function
294745975c7dSPaul E. McKenney  * might well execute concurrently with RCU read-side critical sections
294845975c7dSPaul E. McKenney  * that started after call_rcu() was invoked.  RCU read-side critical
294945975c7dSPaul E. McKenney  * sections are delimited by rcu_read_lock() and rcu_read_unlock(), and
295045975c7dSPaul E. McKenney  * may be nested.  In addition, regions of code across which interrupts,
295145975c7dSPaul E. McKenney  * preemption, or softirqs have been disabled also serve as RCU read-side
295245975c7dSPaul E. McKenney  * critical sections.  This includes hardware interrupt handlers, softirq
295345975c7dSPaul E. McKenney  * handlers, and NMI handlers.
295427fdb35fSPaul E. McKenney  *
295545975c7dSPaul E. McKenney  * Note that all CPUs must agree that the grace period extended beyond
295645975c7dSPaul E. McKenney  * all pre-existing RCU read-side critical section.  On systems with more
295745975c7dSPaul E. McKenney  * than one CPU, this means that when "func()" is invoked, each CPU is
295845975c7dSPaul E. McKenney  * guaranteed to have executed a full memory barrier since the end of its
295945975c7dSPaul E. McKenney  * last RCU read-side critical section whose beginning preceded the call
296045975c7dSPaul E. McKenney  * to call_rcu().  It also means that each CPU executing an RCU read-side
296145975c7dSPaul E. McKenney  * critical section that continues beyond the start of "func()" must have
296245975c7dSPaul E. McKenney  * executed a memory barrier after the call_rcu() but before the beginning
296345975c7dSPaul E. McKenney  * of that RCU read-side critical section.  Note that these guarantees
296445975c7dSPaul E. McKenney  * include CPUs that are offline, idle, or executing in user mode, as
296545975c7dSPaul E. McKenney  * well as CPUs that are executing in the kernel.
2966a68a2bb2SPaul E. McKenney  *
296745975c7dSPaul E. McKenney  * Furthermore, if CPU A invoked call_rcu() and CPU B invoked the
296845975c7dSPaul E. McKenney  * resulting RCU callback function "func()", then both CPU A and CPU B are
296945975c7dSPaul E. McKenney  * guaranteed to execute a full memory barrier during the time interval
297045975c7dSPaul E. McKenney  * between the call to call_rcu() and the invocation of "func()" -- even
297145975c7dSPaul E. McKenney  * if CPU A and CPU B are the same CPU (but again only if the system has
297245975c7dSPaul E. McKenney  * more than one CPU).
297345975c7dSPaul E. McKenney  */
297445975c7dSPaul E. McKenney void call_rcu(struct rcu_head *head, rcu_callback_t func)
297545975c7dSPaul E. McKenney {
2976*5c7d8967SPaul E. McKenney 	__call_rcu(head, func, -1, 0);
297745975c7dSPaul E. McKenney }
297845975c7dSPaul E. McKenney EXPORT_SYMBOL_GPL(call_rcu);
297945975c7dSPaul E. McKenney 
298045975c7dSPaul E. McKenney /**
298145975c7dSPaul E. McKenney  * call_rcu_sched() - Queue an RCU for invocation after sched grace period.
298245975c7dSPaul E. McKenney  * @head: structure to be used for queueing the RCU updates.
298345975c7dSPaul E. McKenney  * @func: actual callback function to be invoked after the grace period
2984a68a2bb2SPaul E. McKenney  *
298545975c7dSPaul E. McKenney  * This is transitional.
29864102adabSPaul E. McKenney  */
2987b6a4ae76SBoqun Feng void call_rcu_sched(struct rcu_head *head, rcu_callback_t func)
29884102adabSPaul E. McKenney {
298945975c7dSPaul E. McKenney 	call_rcu(head, func);
29904102adabSPaul E. McKenney }
29914102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(call_rcu_sched);
29924102adabSPaul E. McKenney 
29934102adabSPaul E. McKenney /*
2994495aa969SAndreea-Cristina Bernat  * Queue an RCU callback for lazy invocation after a grace period.
2995495aa969SAndreea-Cristina Bernat  * This will likely be later named something like "call_rcu_lazy()",
2996495aa969SAndreea-Cristina Bernat  * but this change will require some way of tagging the lazy RCU
2997495aa969SAndreea-Cristina Bernat  * callbacks in the list of pending callbacks. Until then, this
2998495aa969SAndreea-Cristina Bernat  * function may only be called from __kfree_rcu().
2999495aa969SAndreea-Cristina Bernat  */
3000495aa969SAndreea-Cristina Bernat void kfree_call_rcu(struct rcu_head *head,
3001b6a4ae76SBoqun Feng 		    rcu_callback_t func)
3002495aa969SAndreea-Cristina Bernat {
3003*5c7d8967SPaul E. McKenney 	__call_rcu(head, func, -1, 1);
3004495aa969SAndreea-Cristina Bernat }
3005495aa969SAndreea-Cristina Bernat EXPORT_SYMBOL_GPL(kfree_call_rcu);
3006495aa969SAndreea-Cristina Bernat 
30074102adabSPaul E. McKenney /**
30084102adabSPaul E. McKenney  * synchronize_sched - wait until an rcu-sched grace period has elapsed.
30094102adabSPaul E. McKenney  *
301045975c7dSPaul E. McKenney  * This is transitional.
30114102adabSPaul E. McKenney  */
30124102adabSPaul E. McKenney void synchronize_sched(void)
30134102adabSPaul E. McKenney {
301445975c7dSPaul E. McKenney 	synchronize_rcu();
30154102adabSPaul E. McKenney }
30164102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(synchronize_sched);
30174102adabSPaul E. McKenney 
30184102adabSPaul E. McKenney /**
3019765a3f4fSPaul E. McKenney  * get_state_synchronize_rcu - Snapshot current RCU state
3020765a3f4fSPaul E. McKenney  *
3021765a3f4fSPaul E. McKenney  * Returns a cookie that is used by a later call to cond_synchronize_rcu()
3022765a3f4fSPaul E. McKenney  * to determine whether or not a full grace period has elapsed in the
3023765a3f4fSPaul E. McKenney  * meantime.
3024765a3f4fSPaul E. McKenney  */
3025765a3f4fSPaul E. McKenney unsigned long get_state_synchronize_rcu(void)
3026765a3f4fSPaul E. McKenney {
3027765a3f4fSPaul E. McKenney 	/*
3028765a3f4fSPaul E. McKenney 	 * Any prior manipulation of RCU-protected data must happen
3029e4be81a2SPaul E. McKenney 	 * before the load from ->gp_seq.
3030765a3f4fSPaul E. McKenney 	 */
3031765a3f4fSPaul E. McKenney 	smp_mb();  /* ^^^ */
303216fc9c60SPaul E. McKenney 	return rcu_seq_snap(&rcu_state.gp_seq);
3033765a3f4fSPaul E. McKenney }
3034765a3f4fSPaul E. McKenney EXPORT_SYMBOL_GPL(get_state_synchronize_rcu);
3035765a3f4fSPaul E. McKenney 
3036765a3f4fSPaul E. McKenney /**
3037765a3f4fSPaul E. McKenney  * cond_synchronize_rcu - Conditionally wait for an RCU grace period
3038765a3f4fSPaul E. McKenney  *
3039765a3f4fSPaul E. McKenney  * @oldstate: return value from earlier call to get_state_synchronize_rcu()
3040765a3f4fSPaul E. McKenney  *
3041765a3f4fSPaul E. McKenney  * If a full RCU grace period has elapsed since the earlier call to
3042765a3f4fSPaul E. McKenney  * get_state_synchronize_rcu(), just return.  Otherwise, invoke
3043765a3f4fSPaul E. McKenney  * synchronize_rcu() to wait for a full grace period.
3044765a3f4fSPaul E. McKenney  *
3045765a3f4fSPaul E. McKenney  * Yes, this function does not take counter wrap into account.  But
3046765a3f4fSPaul E. McKenney  * counter wrap is harmless.  If the counter wraps, we have waited for
3047765a3f4fSPaul E. McKenney  * more than 2 billion grace periods (and way more on a 64-bit system!),
3048765a3f4fSPaul E. McKenney  * so waiting for one additional grace period should be just fine.
3049765a3f4fSPaul E. McKenney  */
3050765a3f4fSPaul E. McKenney void cond_synchronize_rcu(unsigned long oldstate)
3051765a3f4fSPaul E. McKenney {
305216fc9c60SPaul E. McKenney 	if (!rcu_seq_done(&rcu_state.gp_seq, oldstate))
3053765a3f4fSPaul E. McKenney 		synchronize_rcu();
3054e4be81a2SPaul E. McKenney 	else
3055e4be81a2SPaul E. McKenney 		smp_mb(); /* Ensure GP ends before subsequent accesses. */
3056765a3f4fSPaul E. McKenney }
3057765a3f4fSPaul E. McKenney EXPORT_SYMBOL_GPL(cond_synchronize_rcu);
3058765a3f4fSPaul E. McKenney 
305924560056SPaul E. McKenney /**
306024560056SPaul E. McKenney  * get_state_synchronize_sched - Snapshot current RCU-sched state
306124560056SPaul E. McKenney  *
306245975c7dSPaul E. McKenney  * This is transitional, and only used by rcutorture.
306324560056SPaul E. McKenney  */
306424560056SPaul E. McKenney unsigned long get_state_synchronize_sched(void)
306524560056SPaul E. McKenney {
306645975c7dSPaul E. McKenney 	return get_state_synchronize_rcu();
306724560056SPaul E. McKenney }
306824560056SPaul E. McKenney EXPORT_SYMBOL_GPL(get_state_synchronize_sched);
306924560056SPaul E. McKenney 
307024560056SPaul E. McKenney /**
307124560056SPaul E. McKenney  * cond_synchronize_sched - Conditionally wait for an RCU-sched grace period
307224560056SPaul E. McKenney  * @oldstate: return value from earlier call to get_state_synchronize_sched()
307324560056SPaul E. McKenney  *
307445975c7dSPaul E. McKenney  * This is transitional and only used by rcutorture.
307524560056SPaul E. McKenney  */
307624560056SPaul E. McKenney void cond_synchronize_sched(unsigned long oldstate)
307724560056SPaul E. McKenney {
307845975c7dSPaul E. McKenney 	cond_synchronize_rcu(oldstate);
307924560056SPaul E. McKenney }
308024560056SPaul E. McKenney EXPORT_SYMBOL_GPL(cond_synchronize_sched);
308124560056SPaul E. McKenney 
30824102adabSPaul E. McKenney /*
30834102adabSPaul E. McKenney  * Check to see if there is any immediate RCU-related work to be done
30844102adabSPaul E. McKenney  * by the current CPU, for the specified type of RCU, returning 1 if so.
30854102adabSPaul E. McKenney  * The checks are in order of increasing expense: checks that can be
30864102adabSPaul E. McKenney  * carried out against CPU-local state are performed first.  However,
30874102adabSPaul E. McKenney  * we must check for CPU stalls first, else we might not get a chance.
30884102adabSPaul E. McKenney  */
30894102adabSPaul E. McKenney static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp)
30904102adabSPaul E. McKenney {
30914102adabSPaul E. McKenney 	struct rcu_node *rnp = rdp->mynode;
30924102adabSPaul E. McKenney 
30934102adabSPaul E. McKenney 	/* Check for CPU stalls, if enabled. */
3094ea12ff2bSPaul E. McKenney 	check_cpu_stall(rdp);
30954102adabSPaul E. McKenney 
3096a096932fSPaul E. McKenney 	/* Is this CPU a NO_HZ_FULL CPU that should ignore RCU? */
3097a096932fSPaul E. McKenney 	if (rcu_nohz_full_cpu(rsp))
3098a096932fSPaul E. McKenney 		return 0;
3099a096932fSPaul E. McKenney 
31004102adabSPaul E. McKenney 	/* Is the RCU core waiting for a quiescent state from this CPU? */
310101c495f7SPaul E. McKenney 	if (rdp->core_needs_qs && !rdp->cpu_no_qs.b.norm)
31024102adabSPaul E. McKenney 		return 1;
31034102adabSPaul E. McKenney 
31044102adabSPaul E. McKenney 	/* Does this CPU have callbacks ready to invoke? */
310501c495f7SPaul E. McKenney 	if (rcu_segcblist_ready_cbs(&rdp->cblist))
31064102adabSPaul E. McKenney 		return 1;
31074102adabSPaul E. McKenney 
31084102adabSPaul E. McKenney 	/* Has RCU gone idle with this CPU needing another grace period? */
3109de8e8730SPaul E. McKenney 	if (!rcu_gp_in_progress() &&
3110c1935209SPaul E. McKenney 	    rcu_segcblist_is_enabled(&rdp->cblist) &&
3111c1935209SPaul E. McKenney 	    !rcu_segcblist_restempty(&rdp->cblist, RCU_NEXT_READY_TAIL))
31124102adabSPaul E. McKenney 		return 1;
31134102adabSPaul E. McKenney 
311467e14c1eSPaul E. McKenney 	/* Have RCU grace period completed or started?  */
311567e14c1eSPaul E. McKenney 	if (rcu_seq_current(&rnp->gp_seq) != rdp->gp_seq ||
311601c495f7SPaul E. McKenney 	    unlikely(READ_ONCE(rdp->gpwrap))) /* outside lock */
31174102adabSPaul E. McKenney 		return 1;
31184102adabSPaul E. McKenney 
311996d3fd0dSPaul E. McKenney 	/* Does this CPU need a deferred NOCB wakeup? */
312001c495f7SPaul E. McKenney 	if (rcu_nocb_need_deferred_wakeup(rdp))
312196d3fd0dSPaul E. McKenney 		return 1;
312296d3fd0dSPaul E. McKenney 
31234102adabSPaul E. McKenney 	/* nothing to do */
31244102adabSPaul E. McKenney 	return 0;
31254102adabSPaul E. McKenney }
31264102adabSPaul E. McKenney 
31274102adabSPaul E. McKenney /*
31284102adabSPaul E. McKenney  * Check to see if there is any immediate RCU-related work to be done
31294102adabSPaul E. McKenney  * by the current CPU, returning 1 if so.  This function is part of the
31304102adabSPaul E. McKenney  * RCU implementation; it is -not- an exported member of the RCU API.
31314102adabSPaul E. McKenney  */
3132e3950ecdSPaul E. McKenney static int rcu_pending(void)
31334102adabSPaul E. McKenney {
31344102adabSPaul E. McKenney 	struct rcu_state *rsp;
31354102adabSPaul E. McKenney 
31364102adabSPaul E. McKenney 	for_each_rcu_flavor(rsp)
3137da1df50dSPaul E. McKenney 		if (__rcu_pending(rsp, this_cpu_ptr(&rcu_data)))
31384102adabSPaul E. McKenney 			return 1;
31394102adabSPaul E. McKenney 	return 0;
31404102adabSPaul E. McKenney }
31414102adabSPaul E. McKenney 
31424102adabSPaul E. McKenney /*
31434102adabSPaul E. McKenney  * Return true if the specified CPU has any callback.  If all_lazy is
31444102adabSPaul E. McKenney  * non-NULL, store an indication of whether all callbacks are lazy.
31454102adabSPaul E. McKenney  * (If there are no callbacks, all of them are deemed to be lazy.)
31464102adabSPaul E. McKenney  */
314751fbb910SPaul E. McKenney static bool rcu_cpu_has_callbacks(bool *all_lazy)
31484102adabSPaul E. McKenney {
31494102adabSPaul E. McKenney 	bool al = true;
31504102adabSPaul E. McKenney 	bool hc = false;
31514102adabSPaul E. McKenney 	struct rcu_data *rdp;
31524102adabSPaul E. McKenney 	struct rcu_state *rsp;
31534102adabSPaul E. McKenney 
31544102adabSPaul E. McKenney 	for_each_rcu_flavor(rsp) {
3155da1df50dSPaul E. McKenney 		rdp = this_cpu_ptr(&rcu_data);
315615fecf89SPaul E. McKenney 		if (rcu_segcblist_empty(&rdp->cblist))
31574102adabSPaul E. McKenney 			continue;
31584102adabSPaul E. McKenney 		hc = true;
315915fecf89SPaul E. McKenney 		if (rcu_segcblist_n_nonlazy_cbs(&rdp->cblist) || !all_lazy) {
31604102adabSPaul E. McKenney 			al = false;
31614102adabSPaul E. McKenney 			break;
31624102adabSPaul E. McKenney 		}
31634102adabSPaul E. McKenney 	}
31644102adabSPaul E. McKenney 	if (all_lazy)
31654102adabSPaul E. McKenney 		*all_lazy = al;
31664102adabSPaul E. McKenney 	return hc;
31674102adabSPaul E. McKenney }
31684102adabSPaul E. McKenney 
31694102adabSPaul E. McKenney /*
31704102adabSPaul E. McKenney  * Helper function for _rcu_barrier() tracing.  If tracing is disabled,
31714102adabSPaul E. McKenney  * the compiler is expected to optimize this away.
31724102adabSPaul E. McKenney  */
31734102adabSPaul E. McKenney static void _rcu_barrier_trace(struct rcu_state *rsp, const char *s,
31744102adabSPaul E. McKenney 			       int cpu, unsigned long done)
31754102adabSPaul E. McKenney {
31764102adabSPaul E. McKenney 	trace_rcu_barrier(rsp->name, s, cpu,
31774102adabSPaul E. McKenney 			  atomic_read(&rsp->barrier_cpu_count), done);
31784102adabSPaul E. McKenney }
31794102adabSPaul E. McKenney 
31804102adabSPaul E. McKenney /*
31814102adabSPaul E. McKenney  * RCU callback function for _rcu_barrier().  If we are last, wake
31824102adabSPaul E. McKenney  * up the task executing _rcu_barrier().
31834102adabSPaul E. McKenney  */
31844102adabSPaul E. McKenney static void rcu_barrier_callback(struct rcu_head *rhp)
31854102adabSPaul E. McKenney {
31864102adabSPaul E. McKenney 	struct rcu_data *rdp = container_of(rhp, struct rcu_data, barrier_head);
31874102adabSPaul E. McKenney 	struct rcu_state *rsp = rdp->rsp;
31884102adabSPaul E. McKenney 
31894102adabSPaul E. McKenney 	if (atomic_dec_and_test(&rsp->barrier_cpu_count)) {
3190d8db2e86SPaul E. McKenney 		_rcu_barrier_trace(rsp, TPS("LastCB"), -1,
3191d8db2e86SPaul E. McKenney 				   rsp->barrier_sequence);
31924102adabSPaul E. McKenney 		complete(&rsp->barrier_completion);
31934102adabSPaul E. McKenney 	} else {
3194d8db2e86SPaul E. McKenney 		_rcu_barrier_trace(rsp, TPS("CB"), -1, rsp->barrier_sequence);
31954102adabSPaul E. McKenney 	}
31964102adabSPaul E. McKenney }
31974102adabSPaul E. McKenney 
31984102adabSPaul E. McKenney /*
31994102adabSPaul E. McKenney  * Called with preemption disabled, and from cross-cpu IRQ context.
32004102adabSPaul E. McKenney  */
32014102adabSPaul E. McKenney static void rcu_barrier_func(void *type)
32024102adabSPaul E. McKenney {
32034102adabSPaul E. McKenney 	struct rcu_state *rsp = type;
3204da1df50dSPaul E. McKenney 	struct rcu_data *rdp = raw_cpu_ptr(&rcu_data);
32054102adabSPaul E. McKenney 
3206d8db2e86SPaul E. McKenney 	_rcu_barrier_trace(rsp, TPS("IRQ"), -1, rsp->barrier_sequence);
3207f92c734fSPaul E. McKenney 	rdp->barrier_head.func = rcu_barrier_callback;
3208f92c734fSPaul E. McKenney 	debug_rcu_head_queue(&rdp->barrier_head);
3209f92c734fSPaul E. McKenney 	if (rcu_segcblist_entrain(&rdp->cblist, &rdp->barrier_head, 0)) {
32104102adabSPaul E. McKenney 		atomic_inc(&rsp->barrier_cpu_count);
3211f92c734fSPaul E. McKenney 	} else {
3212f92c734fSPaul E. McKenney 		debug_rcu_head_unqueue(&rdp->barrier_head);
3213d8db2e86SPaul E. McKenney 		_rcu_barrier_trace(rsp, TPS("IRQNQ"), -1,
3214d8db2e86SPaul E. McKenney 				   rsp->barrier_sequence);
3215f92c734fSPaul E. McKenney 	}
32164102adabSPaul E. McKenney }
32174102adabSPaul E. McKenney 
32184102adabSPaul E. McKenney /*
32194102adabSPaul E. McKenney  * Orchestrate the specified type of RCU barrier, waiting for all
32204102adabSPaul E. McKenney  * RCU callbacks of the specified type to complete.
32214102adabSPaul E. McKenney  */
32224102adabSPaul E. McKenney static void _rcu_barrier(struct rcu_state *rsp)
32234102adabSPaul E. McKenney {
32244102adabSPaul E. McKenney 	int cpu;
32254102adabSPaul E. McKenney 	struct rcu_data *rdp;
32264f525a52SPaul E. McKenney 	unsigned long s = rcu_seq_snap(&rsp->barrier_sequence);
32274102adabSPaul E. McKenney 
3228d8db2e86SPaul E. McKenney 	_rcu_barrier_trace(rsp, TPS("Begin"), -1, s);
32294102adabSPaul E. McKenney 
32304102adabSPaul E. McKenney 	/* Take mutex to serialize concurrent rcu_barrier() requests. */
32314102adabSPaul E. McKenney 	mutex_lock(&rsp->barrier_mutex);
32324102adabSPaul E. McKenney 
32334f525a52SPaul E. McKenney 	/* Did someone else do our work for us? */
32344f525a52SPaul E. McKenney 	if (rcu_seq_done(&rsp->barrier_sequence, s)) {
3235d8db2e86SPaul E. McKenney 		_rcu_barrier_trace(rsp, TPS("EarlyExit"), -1,
3236d8db2e86SPaul E. McKenney 				   rsp->barrier_sequence);
32374102adabSPaul E. McKenney 		smp_mb(); /* caller's subsequent code after above check. */
32384102adabSPaul E. McKenney 		mutex_unlock(&rsp->barrier_mutex);
32394102adabSPaul E. McKenney 		return;
32404102adabSPaul E. McKenney 	}
32414102adabSPaul E. McKenney 
32424f525a52SPaul E. McKenney 	/* Mark the start of the barrier operation. */
32434f525a52SPaul E. McKenney 	rcu_seq_start(&rsp->barrier_sequence);
3244d8db2e86SPaul E. McKenney 	_rcu_barrier_trace(rsp, TPS("Inc1"), -1, rsp->barrier_sequence);
32454102adabSPaul E. McKenney 
32464102adabSPaul E. McKenney 	/*
32474102adabSPaul E. McKenney 	 * Initialize the count to one rather than to zero in order to
32484102adabSPaul E. McKenney 	 * avoid a too-soon return to zero in case of a short grace period
32494102adabSPaul E. McKenney 	 * (or preemption of this task).  Exclude CPU-hotplug operations
32504102adabSPaul E. McKenney 	 * to ensure that no offline CPU has callbacks queued.
32514102adabSPaul E. McKenney 	 */
32524102adabSPaul E. McKenney 	init_completion(&rsp->barrier_completion);
32534102adabSPaul E. McKenney 	atomic_set(&rsp->barrier_cpu_count, 1);
32544102adabSPaul E. McKenney 	get_online_cpus();
32554102adabSPaul E. McKenney 
32564102adabSPaul E. McKenney 	/*
32574102adabSPaul E. McKenney 	 * Force each CPU with callbacks to register a new callback.
32584102adabSPaul E. McKenney 	 * When that callback is invoked, we will know that all of the
32594102adabSPaul E. McKenney 	 * corresponding CPU's preceding callbacks have been invoked.
32604102adabSPaul E. McKenney 	 */
32614102adabSPaul E. McKenney 	for_each_possible_cpu(cpu) {
32624102adabSPaul E. McKenney 		if (!cpu_online(cpu) && !rcu_is_nocb_cpu(cpu))
32634102adabSPaul E. McKenney 			continue;
3264da1df50dSPaul E. McKenney 		rdp = per_cpu_ptr(&rcu_data, cpu);
32654102adabSPaul E. McKenney 		if (rcu_is_nocb_cpu(cpu)) {
3266d7e29933SPaul E. McKenney 			if (!rcu_nocb_cpu_needs_barrier(rsp, cpu)) {
3267d8db2e86SPaul E. McKenney 				_rcu_barrier_trace(rsp, TPS("OfflineNoCB"), cpu,
32684f525a52SPaul E. McKenney 						   rsp->barrier_sequence);
3269d7e29933SPaul E. McKenney 			} else {
3270d8db2e86SPaul E. McKenney 				_rcu_barrier_trace(rsp, TPS("OnlineNoCB"), cpu,
32714f525a52SPaul E. McKenney 						   rsp->barrier_sequence);
327241050a00SPaul E. McKenney 				smp_mb__before_atomic();
32734102adabSPaul E. McKenney 				atomic_inc(&rsp->barrier_cpu_count);
3274d7e29933SPaul E. McKenney 				__call_rcu(&rdp->barrier_head,
3275*5c7d8967SPaul E. McKenney 					   rcu_barrier_callback, cpu, 0);
3276d7e29933SPaul E. McKenney 			}
327715fecf89SPaul E. McKenney 		} else if (rcu_segcblist_n_cbs(&rdp->cblist)) {
3278d8db2e86SPaul E. McKenney 			_rcu_barrier_trace(rsp, TPS("OnlineQ"), cpu,
32794f525a52SPaul E. McKenney 					   rsp->barrier_sequence);
32804102adabSPaul E. McKenney 			smp_call_function_single(cpu, rcu_barrier_func, rsp, 1);
32814102adabSPaul E. McKenney 		} else {
3282d8db2e86SPaul E. McKenney 			_rcu_barrier_trace(rsp, TPS("OnlineNQ"), cpu,
32834f525a52SPaul E. McKenney 					   rsp->barrier_sequence);
32844102adabSPaul E. McKenney 		}
32854102adabSPaul E. McKenney 	}
32864102adabSPaul E. McKenney 	put_online_cpus();
32874102adabSPaul E. McKenney 
32884102adabSPaul E. McKenney 	/*
32894102adabSPaul E. McKenney 	 * Now that we have an rcu_barrier_callback() callback on each
32904102adabSPaul E. McKenney 	 * CPU, and thus each counted, remove the initial count.
32914102adabSPaul E. McKenney 	 */
32924102adabSPaul E. McKenney 	if (atomic_dec_and_test(&rsp->barrier_cpu_count))
32934102adabSPaul E. McKenney 		complete(&rsp->barrier_completion);
32944102adabSPaul E. McKenney 
32954102adabSPaul E. McKenney 	/* Wait for all rcu_barrier_callback() callbacks to be invoked. */
32964102adabSPaul E. McKenney 	wait_for_completion(&rsp->barrier_completion);
32974102adabSPaul E. McKenney 
32984f525a52SPaul E. McKenney 	/* Mark the end of the barrier operation. */
3299d8db2e86SPaul E. McKenney 	_rcu_barrier_trace(rsp, TPS("Inc2"), -1, rsp->barrier_sequence);
33004f525a52SPaul E. McKenney 	rcu_seq_end(&rsp->barrier_sequence);
33014f525a52SPaul E. McKenney 
33024102adabSPaul E. McKenney 	/* Other rcu_barrier() invocations can now safely proceed. */
33034102adabSPaul E. McKenney 	mutex_unlock(&rsp->barrier_mutex);
33044102adabSPaul E. McKenney }
33054102adabSPaul E. McKenney 
33064102adabSPaul E. McKenney /**
33074102adabSPaul E. McKenney  * rcu_barrier_bh - Wait until all in-flight call_rcu_bh() callbacks complete.
33084102adabSPaul E. McKenney  */
33094102adabSPaul E. McKenney void rcu_barrier_bh(void)
33104102adabSPaul E. McKenney {
331116fc9c60SPaul E. McKenney 	_rcu_barrier(&rcu_state);
33124102adabSPaul E. McKenney }
33134102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_barrier_bh);
33144102adabSPaul E. McKenney 
33154102adabSPaul E. McKenney /**
331645975c7dSPaul E. McKenney  * rcu_barrier - Wait until all in-flight call_rcu() callbacks complete.
331745975c7dSPaul E. McKenney  *
331845975c7dSPaul E. McKenney  * Note that this primitive does not necessarily wait for an RCU grace period
331945975c7dSPaul E. McKenney  * to complete.  For example, if there are no RCU callbacks queued anywhere
332045975c7dSPaul E. McKenney  * in the system, then rcu_barrier() is within its rights to return
332145975c7dSPaul E. McKenney  * immediately, without waiting for anything, much less an RCU grace period.
332245975c7dSPaul E. McKenney  */
332345975c7dSPaul E. McKenney void rcu_barrier(void)
332445975c7dSPaul E. McKenney {
332516fc9c60SPaul E. McKenney 	_rcu_barrier(&rcu_state);
332645975c7dSPaul E. McKenney }
332745975c7dSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_barrier);
332845975c7dSPaul E. McKenney 
332945975c7dSPaul E. McKenney /**
33304102adabSPaul E. McKenney  * rcu_barrier_sched - Wait for in-flight call_rcu_sched() callbacks.
333145975c7dSPaul E. McKenney  *
333245975c7dSPaul E. McKenney  * This is transitional.
33334102adabSPaul E. McKenney  */
33344102adabSPaul E. McKenney void rcu_barrier_sched(void)
33354102adabSPaul E. McKenney {
333645975c7dSPaul E. McKenney 	rcu_barrier();
33374102adabSPaul E. McKenney }
33384102adabSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_barrier_sched);
33394102adabSPaul E. McKenney 
33404102adabSPaul E. McKenney /*
33410aa04b05SPaul E. McKenney  * Propagate ->qsinitmask bits up the rcu_node tree to account for the
33420aa04b05SPaul E. McKenney  * first CPU in a given leaf rcu_node structure coming online.  The caller
33430aa04b05SPaul E. McKenney  * must hold the corresponding leaf rcu_node ->lock with interrrupts
33440aa04b05SPaul E. McKenney  * disabled.
33450aa04b05SPaul E. McKenney  */
33460aa04b05SPaul E. McKenney static void rcu_init_new_rnp(struct rcu_node *rnp_leaf)
33470aa04b05SPaul E. McKenney {
33480aa04b05SPaul E. McKenney 	long mask;
33498d672fa6SPaul E. McKenney 	long oldmask;
33500aa04b05SPaul E. McKenney 	struct rcu_node *rnp = rnp_leaf;
33510aa04b05SPaul E. McKenney 
33528d672fa6SPaul E. McKenney 	raw_lockdep_assert_held_rcu_node(rnp_leaf);
3353962aff03SPaul E. McKenney 	WARN_ON_ONCE(rnp->wait_blkd_tasks);
33540aa04b05SPaul E. McKenney 	for (;;) {
33550aa04b05SPaul E. McKenney 		mask = rnp->grpmask;
33560aa04b05SPaul E. McKenney 		rnp = rnp->parent;
33570aa04b05SPaul E. McKenney 		if (rnp == NULL)
33580aa04b05SPaul E. McKenney 			return;
33596cf10081SPaul E. McKenney 		raw_spin_lock_rcu_node(rnp); /* Interrupts already disabled. */
33608d672fa6SPaul E. McKenney 		oldmask = rnp->qsmaskinit;
33610aa04b05SPaul E. McKenney 		rnp->qsmaskinit |= mask;
336267c583a7SBoqun Feng 		raw_spin_unlock_rcu_node(rnp); /* Interrupts remain disabled. */
33638d672fa6SPaul E. McKenney 		if (oldmask)
33648d672fa6SPaul E. McKenney 			return;
33650aa04b05SPaul E. McKenney 	}
33660aa04b05SPaul E. McKenney }
33670aa04b05SPaul E. McKenney 
33680aa04b05SPaul E. McKenney /*
33694102adabSPaul E. McKenney  * Do boot-time initialization of a CPU's per-CPU RCU data.
33704102adabSPaul E. McKenney  */
33714102adabSPaul E. McKenney static void __init
33724102adabSPaul E. McKenney rcu_boot_init_percpu_data(int cpu, struct rcu_state *rsp)
33734102adabSPaul E. McKenney {
3374da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
33754102adabSPaul E. McKenney 
33764102adabSPaul E. McKenney 	/* Set up local state, ensuring consistent view of global state. */
3377bc75e999SMark Rutland 	rdp->grpmask = leaf_node_cpu_bit(rdp->mynode, cpu);
33784102adabSPaul E. McKenney 	rdp->dynticks = &per_cpu(rcu_dynticks, cpu);
337951a1fd30SPaul E. McKenney 	WARN_ON_ONCE(rdp->dynticks->dynticks_nesting != 1);
338002a5c550SPaul E. McKenney 	WARN_ON_ONCE(rcu_dynticks_in_eqs(rcu_dynticks_snap(rdp->dynticks)));
338157738942SPaul E. McKenney 	rdp->rcu_ofl_gp_seq = rsp->gp_seq;
338257738942SPaul E. McKenney 	rdp->rcu_ofl_gp_flags = RCU_GP_CLEANED;
338357738942SPaul E. McKenney 	rdp->rcu_onl_gp_seq = rsp->gp_seq;
338457738942SPaul E. McKenney 	rdp->rcu_onl_gp_flags = RCU_GP_CLEANED;
33854102adabSPaul E. McKenney 	rdp->cpu = cpu;
33864102adabSPaul E. McKenney 	rdp->rsp = rsp;
33874102adabSPaul E. McKenney 	rcu_boot_init_nocb_percpu_data(rdp);
33884102adabSPaul E. McKenney }
33894102adabSPaul E. McKenney 
33904102adabSPaul E. McKenney /*
33914102adabSPaul E. McKenney  * Initialize a CPU's per-CPU RCU data.  Note that only one online or
3392ff3bb6f4SPaul E. McKenney  * offline event can be happening at a given time.  Note also that we can
3393ff3bb6f4SPaul E. McKenney  * accept some slop in the rsp->gp_seq access due to the fact that this
3394ff3bb6f4SPaul E. McKenney  * CPU cannot possibly have any RCU callbacks in flight yet.
33954102adabSPaul E. McKenney  */
33964102adabSPaul E. McKenney static void
33979b67122aSIulia Manda rcu_init_percpu_data(int cpu, struct rcu_state *rsp)
33984102adabSPaul E. McKenney {
33994102adabSPaul E. McKenney 	unsigned long flags;
3400da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
3401336a4f6cSPaul E. McKenney 	struct rcu_node *rnp = rcu_get_root();
34024102adabSPaul E. McKenney 
34034102adabSPaul E. McKenney 	/* Set up local state, ensuring consistent view of global state. */
34046cf10081SPaul E. McKenney 	raw_spin_lock_irqsave_rcu_node(rnp, flags);
34054102adabSPaul E. McKenney 	rdp->qlen_last_fqs_check = 0;
34064102adabSPaul E. McKenney 	rdp->n_force_qs_snap = rsp->n_force_qs;
34074102adabSPaul E. McKenney 	rdp->blimit = blimit;
340815fecf89SPaul E. McKenney 	if (rcu_segcblist_empty(&rdp->cblist) && /* No early-boot CBs? */
340915fecf89SPaul E. McKenney 	    !init_nocb_callback_list(rdp))
341015fecf89SPaul E. McKenney 		rcu_segcblist_init(&rdp->cblist);  /* Re-enable callbacks. */
34112342172fSPaul E. McKenney 	rdp->dynticks->dynticks_nesting = 1;	/* CPU not up, no tearing. */
34122625d469SPaul E. McKenney 	rcu_dynticks_eqs_online();
341367c583a7SBoqun Feng 	raw_spin_unlock_rcu_node(rnp);		/* irqs remain disabled. */
34144102adabSPaul E. McKenney 
34150aa04b05SPaul E. McKenney 	/*
34160aa04b05SPaul E. McKenney 	 * Add CPU to leaf rcu_node pending-online bitmask.  Any needed
34170aa04b05SPaul E. McKenney 	 * propagation up the rcu_node tree will happen at the beginning
34180aa04b05SPaul E. McKenney 	 * of the next grace period.
34190aa04b05SPaul E. McKenney 	 */
34204102adabSPaul E. McKenney 	rnp = rdp->mynode;
34212a67e741SPeter Zijlstra 	raw_spin_lock_rcu_node(rnp);		/* irqs already disabled. */
3422b9585e94SPaul E. McKenney 	rdp->beenonline = true;	 /* We have now been online. */
3423de30ad51SPaul E. McKenney 	rdp->gp_seq = rnp->gp_seq;
34247a1d0f23SPaul E. McKenney 	rdp->gp_seq_needed = rnp->gp_seq;
34255b74c458SPaul E. McKenney 	rdp->cpu_no_qs.b.norm = true;
34269577df9aSPaul E. McKenney 	rdp->rcu_qs_ctr_snap = per_cpu(rcu_dynticks.rcu_qs_ctr, cpu);
342797c668b8SPaul E. McKenney 	rdp->core_needs_qs = false;
34289b9500daSPaul E. McKenney 	rdp->rcu_iw_pending = false;
34298aa670cdSPaul E. McKenney 	rdp->rcu_iw_gp_seq = rnp->gp_seq - 1;
3430477351f7SPaul E. McKenney 	trace_rcu_grace_period(rsp->name, rdp->gp_seq, TPS("cpuonl"));
343167c583a7SBoqun Feng 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
34324102adabSPaul E. McKenney }
34334102adabSPaul E. McKenney 
3434deb34f36SPaul E. McKenney /*
3435deb34f36SPaul E. McKenney  * Invoked early in the CPU-online process, when pretty much all
3436deb34f36SPaul E. McKenney  * services are available.  The incoming CPU is not present.
3437deb34f36SPaul E. McKenney  */
34384df83742SThomas Gleixner int rcutree_prepare_cpu(unsigned int cpu)
34394102adabSPaul E. McKenney {
34404102adabSPaul E. McKenney 	struct rcu_state *rsp;
34414102adabSPaul E. McKenney 
34424102adabSPaul E. McKenney 	for_each_rcu_flavor(rsp)
34439b67122aSIulia Manda 		rcu_init_percpu_data(cpu, rsp);
34444df83742SThomas Gleixner 
34454df83742SThomas Gleixner 	rcu_prepare_kthreads(cpu);
34464df83742SThomas Gleixner 	rcu_spawn_all_nocb_kthreads(cpu);
34474df83742SThomas Gleixner 
34484df83742SThomas Gleixner 	return 0;
34494df83742SThomas Gleixner }
34504df83742SThomas Gleixner 
3451deb34f36SPaul E. McKenney /*
3452deb34f36SPaul E. McKenney  * Update RCU priority boot kthread affinity for CPU-hotplug changes.
3453deb34f36SPaul E. McKenney  */
34544df83742SThomas Gleixner static void rcutree_affinity_setting(unsigned int cpu, int outgoing)
34554df83742SThomas Gleixner {
3456da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
34574df83742SThomas Gleixner 
34584df83742SThomas Gleixner 	rcu_boost_kthread_setaffinity(rdp->mynode, outgoing);
34594df83742SThomas Gleixner }
34604df83742SThomas Gleixner 
3461deb34f36SPaul E. McKenney /*
3462deb34f36SPaul E. McKenney  * Near the end of the CPU-online process.  Pretty much all services
3463deb34f36SPaul E. McKenney  * enabled, and the CPU is now very much alive.
3464deb34f36SPaul E. McKenney  */
34654df83742SThomas Gleixner int rcutree_online_cpu(unsigned int cpu)
34664df83742SThomas Gleixner {
34679b9500daSPaul E. McKenney 	unsigned long flags;
34689b9500daSPaul E. McKenney 	struct rcu_data *rdp;
34699b9500daSPaul E. McKenney 	struct rcu_node *rnp;
34709b9500daSPaul E. McKenney 	struct rcu_state *rsp;
34719b9500daSPaul E. McKenney 
34729b9500daSPaul E. McKenney 	for_each_rcu_flavor(rsp) {
3473da1df50dSPaul E. McKenney 		rdp = per_cpu_ptr(&rcu_data, cpu);
34749b9500daSPaul E. McKenney 		rnp = rdp->mynode;
34759b9500daSPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
34769b9500daSPaul E. McKenney 		rnp->ffmask |= rdp->grpmask;
34779b9500daSPaul E. McKenney 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
34789b9500daSPaul E. McKenney 	}
3479da915ad5SPaul E. McKenney 	if (IS_ENABLED(CONFIG_TREE_SRCU))
3480da915ad5SPaul E. McKenney 		srcu_online_cpu(cpu);
34819b9500daSPaul E. McKenney 	if (rcu_scheduler_active == RCU_SCHEDULER_INACTIVE)
34829b9500daSPaul E. McKenney 		return 0; /* Too early in boot for scheduler work. */
34839b9500daSPaul E. McKenney 	sync_sched_exp_online_cleanup(cpu);
34849b9500daSPaul E. McKenney 	rcutree_affinity_setting(cpu, -1);
34854df83742SThomas Gleixner 	return 0;
34864df83742SThomas Gleixner }
34874df83742SThomas Gleixner 
3488deb34f36SPaul E. McKenney /*
3489deb34f36SPaul E. McKenney  * Near the beginning of the process.  The CPU is still very much alive
3490deb34f36SPaul E. McKenney  * with pretty much all services enabled.
3491deb34f36SPaul E. McKenney  */
34924df83742SThomas Gleixner int rcutree_offline_cpu(unsigned int cpu)
34934df83742SThomas Gleixner {
34949b9500daSPaul E. McKenney 	unsigned long flags;
34959b9500daSPaul E. McKenney 	struct rcu_data *rdp;
34969b9500daSPaul E. McKenney 	struct rcu_node *rnp;
34979b9500daSPaul E. McKenney 	struct rcu_state *rsp;
34989b9500daSPaul E. McKenney 
34999b9500daSPaul E. McKenney 	for_each_rcu_flavor(rsp) {
3500da1df50dSPaul E. McKenney 		rdp = per_cpu_ptr(&rcu_data, cpu);
35019b9500daSPaul E. McKenney 		rnp = rdp->mynode;
35029b9500daSPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
35039b9500daSPaul E. McKenney 		rnp->ffmask &= ~rdp->grpmask;
35049b9500daSPaul E. McKenney 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
35059b9500daSPaul E. McKenney 	}
35069b9500daSPaul E. McKenney 
35074df83742SThomas Gleixner 	rcutree_affinity_setting(cpu, cpu);
3508da915ad5SPaul E. McKenney 	if (IS_ENABLED(CONFIG_TREE_SRCU))
3509da915ad5SPaul E. McKenney 		srcu_offline_cpu(cpu);
35104df83742SThomas Gleixner 	return 0;
35114df83742SThomas Gleixner }
35124df83742SThomas Gleixner 
3513f64c6013SPeter Zijlstra static DEFINE_PER_CPU(int, rcu_cpu_started);
3514f64c6013SPeter Zijlstra 
35157ec99de3SPaul E. McKenney /*
35167ec99de3SPaul E. McKenney  * Mark the specified CPU as being online so that subsequent grace periods
35177ec99de3SPaul E. McKenney  * (both expedited and normal) will wait on it.  Note that this means that
35187ec99de3SPaul E. McKenney  * incoming CPUs are not allowed to use RCU read-side critical sections
35197ec99de3SPaul E. McKenney  * until this function is called.  Failing to observe this restriction
35207ec99de3SPaul E. McKenney  * will result in lockdep splats.
3521deb34f36SPaul E. McKenney  *
3522deb34f36SPaul E. McKenney  * Note that this function is special in that it is invoked directly
3523deb34f36SPaul E. McKenney  * from the incoming CPU rather than from the cpuhp_step mechanism.
3524deb34f36SPaul E. McKenney  * This is because this function must be invoked at a precise location.
35257ec99de3SPaul E. McKenney  */
35267ec99de3SPaul E. McKenney void rcu_cpu_starting(unsigned int cpu)
35277ec99de3SPaul E. McKenney {
35287ec99de3SPaul E. McKenney 	unsigned long flags;
35297ec99de3SPaul E. McKenney 	unsigned long mask;
3530313517fcSPaul E. McKenney 	int nbits;
3531313517fcSPaul E. McKenney 	unsigned long oldmask;
35327ec99de3SPaul E. McKenney 	struct rcu_data *rdp;
35337ec99de3SPaul E. McKenney 	struct rcu_node *rnp;
35347ec99de3SPaul E. McKenney 	struct rcu_state *rsp;
35357ec99de3SPaul E. McKenney 
3536f64c6013SPeter Zijlstra 	if (per_cpu(rcu_cpu_started, cpu))
3537f64c6013SPeter Zijlstra 		return;
3538f64c6013SPeter Zijlstra 
3539f64c6013SPeter Zijlstra 	per_cpu(rcu_cpu_started, cpu) = 1;
3540f64c6013SPeter Zijlstra 
35417ec99de3SPaul E. McKenney 	for_each_rcu_flavor(rsp) {
3542da1df50dSPaul E. McKenney 		rdp = per_cpu_ptr(&rcu_data, cpu);
35437ec99de3SPaul E. McKenney 		rnp = rdp->mynode;
35447ec99de3SPaul E. McKenney 		mask = rdp->grpmask;
35457ec99de3SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
35467ec99de3SPaul E. McKenney 		rnp->qsmaskinitnext |= mask;
3547313517fcSPaul E. McKenney 		oldmask = rnp->expmaskinitnext;
35487ec99de3SPaul E. McKenney 		rnp->expmaskinitnext |= mask;
3549313517fcSPaul E. McKenney 		oldmask ^= rnp->expmaskinitnext;
3550313517fcSPaul E. McKenney 		nbits = bitmap_weight(&oldmask, BITS_PER_LONG);
3551313517fcSPaul E. McKenney 		/* Allow lockless access for expedited grace periods. */
3552313517fcSPaul E. McKenney 		smp_store_release(&rsp->ncpus, rsp->ncpus + nbits); /* ^^^ */
3553e05121baSPaul E. McKenney 		rcu_gpnum_ovf(rnp, rdp); /* Offline-induced counter wrap? */
355457738942SPaul E. McKenney 		rdp->rcu_onl_gp_seq = READ_ONCE(rsp->gp_seq);
355557738942SPaul E. McKenney 		rdp->rcu_onl_gp_flags = READ_ONCE(rsp->gp_flags);
355699990da1SPaul E. McKenney 		if (rnp->qsmask & mask) { /* RCU waiting on incoming CPU? */
355799990da1SPaul E. McKenney 			/* Report QS -after- changing ->qsmaskinitnext! */
3558b50912d0SPaul E. McKenney 			rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
355999990da1SPaul E. McKenney 		} else {
35607ec99de3SPaul E. McKenney 			raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
35617ec99de3SPaul E. McKenney 		}
356299990da1SPaul E. McKenney 	}
3563313517fcSPaul E. McKenney 	smp_mb(); /* Ensure RCU read-side usage follows above initialization. */
35647ec99de3SPaul E. McKenney }
35657ec99de3SPaul E. McKenney 
356627d50c7eSThomas Gleixner #ifdef CONFIG_HOTPLUG_CPU
356727d50c7eSThomas Gleixner /*
356827d50c7eSThomas Gleixner  * The CPU is exiting the idle loop into the arch_cpu_idle_dead()
3569c50cbe53SPaul E. McKenney  * function.  We now remove it from the rcu_node tree's ->qsmaskinitnext
357027d50c7eSThomas Gleixner  * bit masks.
357127d50c7eSThomas Gleixner  */
357227d50c7eSThomas Gleixner static void rcu_cleanup_dying_idle_cpu(int cpu, struct rcu_state *rsp)
357327d50c7eSThomas Gleixner {
357427d50c7eSThomas Gleixner 	unsigned long flags;
357527d50c7eSThomas Gleixner 	unsigned long mask;
3576da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
357727d50c7eSThomas Gleixner 	struct rcu_node *rnp = rdp->mynode;  /* Outgoing CPU's rdp & rnp. */
357827d50c7eSThomas Gleixner 
357927d50c7eSThomas Gleixner 	/* Remove outgoing CPU from mask in the leaf rcu_node structure. */
358027d50c7eSThomas Gleixner 	mask = rdp->grpmask;
35811e64b15aSPaul E. McKenney 	spin_lock(&rsp->ofl_lock);
358227d50c7eSThomas Gleixner 	raw_spin_lock_irqsave_rcu_node(rnp, flags); /* Enforce GP memory-order guarantee. */
358357738942SPaul E. McKenney 	rdp->rcu_ofl_gp_seq = READ_ONCE(rsp->gp_seq);
358457738942SPaul E. McKenney 	rdp->rcu_ofl_gp_flags = READ_ONCE(rsp->gp_flags);
3585fece2776SPaul E. McKenney 	if (rnp->qsmask & mask) { /* RCU waiting on outgoing CPU? */
3586fece2776SPaul E. McKenney 		/* Report quiescent state -before- changing ->qsmaskinitnext! */
3587b50912d0SPaul E. McKenney 		rcu_report_qs_rnp(mask, rnp, rnp->gp_seq, flags);
3588fece2776SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
3589fece2776SPaul E. McKenney 	}
359027d50c7eSThomas Gleixner 	rnp->qsmaskinitnext &= ~mask;
3591710d60cbSLinus Torvalds 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
35921e64b15aSPaul E. McKenney 	spin_unlock(&rsp->ofl_lock);
359327d50c7eSThomas Gleixner }
359427d50c7eSThomas Gleixner 
3595deb34f36SPaul E. McKenney /*
3596deb34f36SPaul E. McKenney  * The outgoing function has no further need of RCU, so remove it from
3597deb34f36SPaul E. McKenney  * the list of CPUs that RCU must track.
3598deb34f36SPaul E. McKenney  *
3599deb34f36SPaul E. McKenney  * Note that this function is special in that it is invoked directly
3600deb34f36SPaul E. McKenney  * from the outgoing CPU rather than from the cpuhp_step mechanism.
3601deb34f36SPaul E. McKenney  * This is because this function must be invoked at a precise location.
3602deb34f36SPaul E. McKenney  */
360327d50c7eSThomas Gleixner void rcu_report_dead(unsigned int cpu)
360427d50c7eSThomas Gleixner {
360527d50c7eSThomas Gleixner 	struct rcu_state *rsp;
360627d50c7eSThomas Gleixner 
360727d50c7eSThomas Gleixner 	/* QS for any half-done expedited RCU-sched GP. */
360827d50c7eSThomas Gleixner 	preempt_disable();
3609da1df50dSPaul E. McKenney 	rcu_report_exp_rdp(&rcu_state, this_cpu_ptr(&rcu_data));
361027d50c7eSThomas Gleixner 	preempt_enable();
36113e310098SPaul E. McKenney 	rcu_preempt_deferred_qs(current);
361227d50c7eSThomas Gleixner 	for_each_rcu_flavor(rsp)
361327d50c7eSThomas Gleixner 		rcu_cleanup_dying_idle_cpu(cpu, rsp);
3614f64c6013SPeter Zijlstra 
3615f64c6013SPeter Zijlstra 	per_cpu(rcu_cpu_started, cpu) = 0;
361627d50c7eSThomas Gleixner }
3617a58163d8SPaul E. McKenney 
3618f2dbe4a5SPaul E. McKenney /* Migrate the dead CPU's callbacks to the current CPU. */
3619a58163d8SPaul E. McKenney static void rcu_migrate_callbacks(int cpu, struct rcu_state *rsp)
3620a58163d8SPaul E. McKenney {
3621a58163d8SPaul E. McKenney 	unsigned long flags;
3622b1a2d79fSPaul E. McKenney 	struct rcu_data *my_rdp;
3623da1df50dSPaul E. McKenney 	struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
3624336a4f6cSPaul E. McKenney 	struct rcu_node *rnp_root = rcu_get_root();
3625ec4eacceSPaul E. McKenney 	bool needwake;
3626a58163d8SPaul E. McKenney 
362795335c03SPaul E. McKenney 	if (rcu_is_nocb_cpu(cpu) || rcu_segcblist_empty(&rdp->cblist))
362895335c03SPaul E. McKenney 		return;  /* No callbacks to migrate. */
362995335c03SPaul E. McKenney 
3630b1a2d79fSPaul E. McKenney 	local_irq_save(flags);
3631da1df50dSPaul E. McKenney 	my_rdp = this_cpu_ptr(&rcu_data);
3632b1a2d79fSPaul E. McKenney 	if (rcu_nocb_adopt_orphan_cbs(my_rdp, rdp, flags)) {
3633b1a2d79fSPaul E. McKenney 		local_irq_restore(flags);
3634b1a2d79fSPaul E. McKenney 		return;
3635b1a2d79fSPaul E. McKenney 	}
36369fa46fb8SPaul E. McKenney 	raw_spin_lock_rcu_node(rnp_root); /* irqs already disabled. */
3637ec4eacceSPaul E. McKenney 	/* Leverage recent GPs and set GP for new callbacks. */
3638834f56bfSPaul E. McKenney 	needwake = rcu_advance_cbs(rnp_root, rdp) ||
3639834f56bfSPaul E. McKenney 		   rcu_advance_cbs(rnp_root, my_rdp);
3640f2dbe4a5SPaul E. McKenney 	rcu_segcblist_merge(&my_rdp->cblist, &rdp->cblist);
364109efeeeeSPaul E. McKenney 	WARN_ON_ONCE(rcu_segcblist_empty(&my_rdp->cblist) !=
364209efeeeeSPaul E. McKenney 		     !rcu_segcblist_n_cbs(&my_rdp->cblist));
3643537b85c8SPaul E. McKenney 	raw_spin_unlock_irqrestore_rcu_node(rnp_root, flags);
3644ec4eacceSPaul E. McKenney 	if (needwake)
3645532c00c9SPaul E. McKenney 		rcu_gp_kthread_wake();
3646a58163d8SPaul E. McKenney 	WARN_ONCE(rcu_segcblist_n_cbs(&rdp->cblist) != 0 ||
3647a58163d8SPaul E. McKenney 		  !rcu_segcblist_empty(&rdp->cblist),
3648a58163d8SPaul E. McKenney 		  "rcu_cleanup_dead_cpu: Callbacks on offline CPU %d: qlen=%lu, 1stCB=%p\n",
3649a58163d8SPaul E. McKenney 		  cpu, rcu_segcblist_n_cbs(&rdp->cblist),
3650a58163d8SPaul E. McKenney 		  rcu_segcblist_first_cb(&rdp->cblist));
3651a58163d8SPaul E. McKenney }
3652a58163d8SPaul E. McKenney 
3653a58163d8SPaul E. McKenney /*
3654a58163d8SPaul E. McKenney  * The outgoing CPU has just passed through the dying-idle state,
3655a58163d8SPaul E. McKenney  * and we are being invoked from the CPU that was IPIed to continue the
3656a58163d8SPaul E. McKenney  * offline operation.  We need to migrate the outgoing CPU's callbacks.
3657a58163d8SPaul E. McKenney  */
3658a58163d8SPaul E. McKenney void rcutree_migrate_callbacks(int cpu)
3659a58163d8SPaul E. McKenney {
3660a58163d8SPaul E. McKenney 	struct rcu_state *rsp;
3661a58163d8SPaul E. McKenney 
3662a58163d8SPaul E. McKenney 	for_each_rcu_flavor(rsp)
3663a58163d8SPaul E. McKenney 		rcu_migrate_callbacks(cpu, rsp);
3664a58163d8SPaul E. McKenney }
366527d50c7eSThomas Gleixner #endif
366627d50c7eSThomas Gleixner 
3667deb34f36SPaul E. McKenney /*
3668deb34f36SPaul E. McKenney  * On non-huge systems, use expedited RCU grace periods to make suspend
3669deb34f36SPaul E. McKenney  * and hibernation run faster.
3670deb34f36SPaul E. McKenney  */
36714102adabSPaul E. McKenney static int rcu_pm_notify(struct notifier_block *self,
36724102adabSPaul E. McKenney 			 unsigned long action, void *hcpu)
36734102adabSPaul E. McKenney {
36744102adabSPaul E. McKenney 	switch (action) {
36754102adabSPaul E. McKenney 	case PM_HIBERNATION_PREPARE:
36764102adabSPaul E. McKenney 	case PM_SUSPEND_PREPARE:
36774102adabSPaul E. McKenney 		if (nr_cpu_ids <= 256) /* Expediting bad for large systems. */
36785afff48bSPaul E. McKenney 			rcu_expedite_gp();
36794102adabSPaul E. McKenney 		break;
36804102adabSPaul E. McKenney 	case PM_POST_HIBERNATION:
36814102adabSPaul E. McKenney 	case PM_POST_SUSPEND:
36825afff48bSPaul E. McKenney 		if (nr_cpu_ids <= 256) /* Expediting bad for large systems. */
36835afff48bSPaul E. McKenney 			rcu_unexpedite_gp();
36844102adabSPaul E. McKenney 		break;
36854102adabSPaul E. McKenney 	default:
36864102adabSPaul E. McKenney 		break;
36874102adabSPaul E. McKenney 	}
36884102adabSPaul E. McKenney 	return NOTIFY_OK;
36894102adabSPaul E. McKenney }
36904102adabSPaul E. McKenney 
36914102adabSPaul E. McKenney /*
36929386c0b7SPaul E. McKenney  * Spawn the kthreads that handle each RCU flavor's grace periods.
36934102adabSPaul E. McKenney  */
36944102adabSPaul E. McKenney static int __init rcu_spawn_gp_kthread(void)
36954102adabSPaul E. McKenney {
36964102adabSPaul E. McKenney 	unsigned long flags;
3697a94844b2SPaul E. McKenney 	int kthread_prio_in = kthread_prio;
36984102adabSPaul E. McKenney 	struct rcu_node *rnp;
36994102adabSPaul E. McKenney 	struct rcu_state *rsp;
3700a94844b2SPaul E. McKenney 	struct sched_param sp;
37014102adabSPaul E. McKenney 	struct task_struct *t;
37024102adabSPaul E. McKenney 
3703a94844b2SPaul E. McKenney 	/* Force priority into range. */
3704c7cd161eSJoel Fernandes (Google) 	if (IS_ENABLED(CONFIG_RCU_BOOST) && kthread_prio < 2
3705c7cd161eSJoel Fernandes (Google) 	    && IS_BUILTIN(CONFIG_RCU_TORTURE_TEST))
3706c7cd161eSJoel Fernandes (Google) 		kthread_prio = 2;
3707c7cd161eSJoel Fernandes (Google) 	else if (IS_ENABLED(CONFIG_RCU_BOOST) && kthread_prio < 1)
3708a94844b2SPaul E. McKenney 		kthread_prio = 1;
3709a94844b2SPaul E. McKenney 	else if (kthread_prio < 0)
3710a94844b2SPaul E. McKenney 		kthread_prio = 0;
3711a94844b2SPaul E. McKenney 	else if (kthread_prio > 99)
3712a94844b2SPaul E. McKenney 		kthread_prio = 99;
3713c7cd161eSJoel Fernandes (Google) 
3714a94844b2SPaul E. McKenney 	if (kthread_prio != kthread_prio_in)
3715a94844b2SPaul E. McKenney 		pr_alert("rcu_spawn_gp_kthread(): Limited prio to %d from %d\n",
3716a94844b2SPaul E. McKenney 			 kthread_prio, kthread_prio_in);
3717a94844b2SPaul E. McKenney 
37189386c0b7SPaul E. McKenney 	rcu_scheduler_fully_active = 1;
37194102adabSPaul E. McKenney 	for_each_rcu_flavor(rsp) {
37200854a05cSPaul E. McKenney 		t = kthread_create(rcu_gp_kthread, NULL, "%s", rsp->name);
37214102adabSPaul E. McKenney 		BUG_ON(IS_ERR(t));
3722336a4f6cSPaul E. McKenney 		rnp = rcu_get_root();
37236cf10081SPaul E. McKenney 		raw_spin_lock_irqsave_rcu_node(rnp, flags);
37244102adabSPaul E. McKenney 		rsp->gp_kthread = t;
3725a94844b2SPaul E. McKenney 		if (kthread_prio) {
3726a94844b2SPaul E. McKenney 			sp.sched_priority = kthread_prio;
3727a94844b2SPaul E. McKenney 			sched_setscheduler_nocheck(t, SCHED_FIFO, &sp);
3728a94844b2SPaul E. McKenney 		}
372967c583a7SBoqun Feng 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
3730e11f1335SPeter Zijlstra 		wake_up_process(t);
37314102adabSPaul E. McKenney 	}
373235ce7f29SPaul E. McKenney 	rcu_spawn_nocb_kthreads();
37339386c0b7SPaul E. McKenney 	rcu_spawn_boost_kthreads();
37344102adabSPaul E. McKenney 	return 0;
37354102adabSPaul E. McKenney }
37364102adabSPaul E. McKenney early_initcall(rcu_spawn_gp_kthread);
37374102adabSPaul E. McKenney 
37384102adabSPaul E. McKenney /*
373952d7e48bSPaul E. McKenney  * This function is invoked towards the end of the scheduler's
374052d7e48bSPaul E. McKenney  * initialization process.  Before this is called, the idle task might
374152d7e48bSPaul E. McKenney  * contain synchronous grace-period primitives (during which time, this idle
374252d7e48bSPaul E. McKenney  * task is booting the system, and such primitives are no-ops).  After this
374352d7e48bSPaul E. McKenney  * function is called, any synchronous grace-period primitives are run as
374452d7e48bSPaul E. McKenney  * expedited, with the requesting task driving the grace period forward.
3745900b1028SPaul E. McKenney  * A later core_initcall() rcu_set_runtime_mode() will switch to full
374652d7e48bSPaul E. McKenney  * runtime RCU functionality.
37474102adabSPaul E. McKenney  */
37484102adabSPaul E. McKenney void rcu_scheduler_starting(void)
37494102adabSPaul E. McKenney {
37504102adabSPaul E. McKenney 	WARN_ON(num_online_cpus() != 1);
37514102adabSPaul E. McKenney 	WARN_ON(nr_context_switches() > 0);
375252d7e48bSPaul E. McKenney 	rcu_test_sync_prims();
375352d7e48bSPaul E. McKenney 	rcu_scheduler_active = RCU_SCHEDULER_INIT;
375452d7e48bSPaul E. McKenney 	rcu_test_sync_prims();
37554102adabSPaul E. McKenney }
37564102adabSPaul E. McKenney 
37574102adabSPaul E. McKenney /*
37584102adabSPaul E. McKenney  * Helper function for rcu_init() that initializes one rcu_state structure.
37594102adabSPaul E. McKenney  */
3760a87f203eSPaul E. McKenney static void __init rcu_init_one(struct rcu_state *rsp)
37614102adabSPaul E. McKenney {
3762cb007102SAlexander Gordeev 	static const char * const buf[] = RCU_NODE_NAME_INIT;
3763cb007102SAlexander Gordeev 	static const char * const fqs[] = RCU_FQS_NAME_INIT;
37643dc5dbe9SPaul E. McKenney 	static struct lock_class_key rcu_node_class[RCU_NUM_LVLS];
37653dc5dbe9SPaul E. McKenney 	static struct lock_class_key rcu_fqs_class[RCU_NUM_LVLS];
3766199977bfSAlexander Gordeev 
3767199977bfSAlexander Gordeev 	int levelspread[RCU_NUM_LVLS];		/* kids/node in each level. */
37684102adabSPaul E. McKenney 	int cpustride = 1;
37694102adabSPaul E. McKenney 	int i;
37704102adabSPaul E. McKenney 	int j;
37714102adabSPaul E. McKenney 	struct rcu_node *rnp;
37724102adabSPaul E. McKenney 
377305b84aecSAlexander Gordeev 	BUILD_BUG_ON(RCU_NUM_LVLS > ARRAY_SIZE(buf));  /* Fix buf[] init! */
37744102adabSPaul E. McKenney 
37753eaaaf6cSPaul E. McKenney 	/* Silence gcc 4.8 false positive about array index out of range. */
37763eaaaf6cSPaul E. McKenney 	if (rcu_num_lvls <= 0 || rcu_num_lvls > RCU_NUM_LVLS)
37773eaaaf6cSPaul E. McKenney 		panic("rcu_init_one: rcu_num_lvls out of range");
37784102adabSPaul E. McKenney 
37794102adabSPaul E. McKenney 	/* Initialize the level-tracking arrays. */
37804102adabSPaul E. McKenney 
37814102adabSPaul E. McKenney 	for (i = 1; i < rcu_num_lvls; i++)
378241f5c631SPaul E. McKenney 		rsp->level[i] = rsp->level[i - 1] + num_rcu_lvl[i - 1];
378341f5c631SPaul E. McKenney 	rcu_init_levelspread(levelspread, num_rcu_lvl);
37844102adabSPaul E. McKenney 
37854102adabSPaul E. McKenney 	/* Initialize the elements themselves, starting from the leaves. */
37864102adabSPaul E. McKenney 
37874102adabSPaul E. McKenney 	for (i = rcu_num_lvls - 1; i >= 0; i--) {
3788199977bfSAlexander Gordeev 		cpustride *= levelspread[i];
37894102adabSPaul E. McKenney 		rnp = rsp->level[i];
379041f5c631SPaul E. McKenney 		for (j = 0; j < num_rcu_lvl[i]; j++, rnp++) {
379167c583a7SBoqun Feng 			raw_spin_lock_init(&ACCESS_PRIVATE(rnp, lock));
379267c583a7SBoqun Feng 			lockdep_set_class_and_name(&ACCESS_PRIVATE(rnp, lock),
37934102adabSPaul E. McKenney 						   &rcu_node_class[i], buf[i]);
37944102adabSPaul E. McKenney 			raw_spin_lock_init(&rnp->fqslock);
37954102adabSPaul E. McKenney 			lockdep_set_class_and_name(&rnp->fqslock,
37964102adabSPaul E. McKenney 						   &rcu_fqs_class[i], fqs[i]);
3797de30ad51SPaul E. McKenney 			rnp->gp_seq = rsp->gp_seq;
37987a1d0f23SPaul E. McKenney 			rnp->gp_seq_needed = rsp->gp_seq;
3799d43a5d32SPaul E. McKenney 			rnp->completedqs = rsp->gp_seq;
38004102adabSPaul E. McKenney 			rnp->qsmask = 0;
38014102adabSPaul E. McKenney 			rnp->qsmaskinit = 0;
38024102adabSPaul E. McKenney 			rnp->grplo = j * cpustride;
38034102adabSPaul E. McKenney 			rnp->grphi = (j + 1) * cpustride - 1;
3804595f3900SHimangi Saraogi 			if (rnp->grphi >= nr_cpu_ids)
3805595f3900SHimangi Saraogi 				rnp->grphi = nr_cpu_ids - 1;
38064102adabSPaul E. McKenney 			if (i == 0) {
38074102adabSPaul E. McKenney 				rnp->grpnum = 0;
38084102adabSPaul E. McKenney 				rnp->grpmask = 0;
38094102adabSPaul E. McKenney 				rnp->parent = NULL;
38104102adabSPaul E. McKenney 			} else {
3811199977bfSAlexander Gordeev 				rnp->grpnum = j % levelspread[i - 1];
38124102adabSPaul E. McKenney 				rnp->grpmask = 1UL << rnp->grpnum;
38134102adabSPaul E. McKenney 				rnp->parent = rsp->level[i - 1] +
3814199977bfSAlexander Gordeev 					      j / levelspread[i - 1];
38154102adabSPaul E. McKenney 			}
38164102adabSPaul E. McKenney 			rnp->level = i;
38174102adabSPaul E. McKenney 			INIT_LIST_HEAD(&rnp->blkd_tasks);
38184102adabSPaul E. McKenney 			rcu_init_one_nocb(rnp);
3819f6a12f34SPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[0]);
3820f6a12f34SPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[1]);
38213b5f668eSPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[2]);
38223b5f668eSPaul E. McKenney 			init_waitqueue_head(&rnp->exp_wq[3]);
3823f6a12f34SPaul E. McKenney 			spin_lock_init(&rnp->exp_lock);
38244102adabSPaul E. McKenney 		}
38254102adabSPaul E. McKenney 	}
38264102adabSPaul E. McKenney 
3827abedf8e2SPaul Gortmaker 	init_swait_queue_head(&rsp->gp_wq);
3828abedf8e2SPaul Gortmaker 	init_swait_queue_head(&rsp->expedited_wq);
38295b4c11d5SPaul E. McKenney 	rnp = rcu_first_leaf_node(rsp);
38304102adabSPaul E. McKenney 	for_each_possible_cpu(i) {
38314102adabSPaul E. McKenney 		while (i > rnp->grphi)
38324102adabSPaul E. McKenney 			rnp++;
3833da1df50dSPaul E. McKenney 		per_cpu_ptr(&rcu_data, i)->mynode = rnp;
38344102adabSPaul E. McKenney 		rcu_boot_init_percpu_data(i, rsp);
38354102adabSPaul E. McKenney 	}
38364102adabSPaul E. McKenney 	list_add(&rsp->flavors, &rcu_struct_flavors);
38374102adabSPaul E. McKenney }
38384102adabSPaul E. McKenney 
38394102adabSPaul E. McKenney /*
38404102adabSPaul E. McKenney  * Compute the rcu_node tree geometry from kernel parameters.  This cannot
38414102adabSPaul E. McKenney  * replace the definitions in tree.h because those are needed to size
38424102adabSPaul E. McKenney  * the ->node array in the rcu_state structure.
38434102adabSPaul E. McKenney  */
38444102adabSPaul E. McKenney static void __init rcu_init_geometry(void)
38454102adabSPaul E. McKenney {
38464102adabSPaul E. McKenney 	ulong d;
38474102adabSPaul E. McKenney 	int i;
384805b84aecSAlexander Gordeev 	int rcu_capacity[RCU_NUM_LVLS];
38494102adabSPaul E. McKenney 
38504102adabSPaul E. McKenney 	/*
38514102adabSPaul E. McKenney 	 * Initialize any unspecified boot parameters.
38524102adabSPaul E. McKenney 	 * The default values of jiffies_till_first_fqs and
38534102adabSPaul E. McKenney 	 * jiffies_till_next_fqs are set to the RCU_JIFFIES_TILL_FORCE_QS
38544102adabSPaul E. McKenney 	 * value, which is a function of HZ, then adding one for each
38554102adabSPaul E. McKenney 	 * RCU_JIFFIES_FQS_DIV CPUs that might be on the system.
38564102adabSPaul E. McKenney 	 */
38574102adabSPaul E. McKenney 	d = RCU_JIFFIES_TILL_FORCE_QS + nr_cpu_ids / RCU_JIFFIES_FQS_DIV;
38584102adabSPaul E. McKenney 	if (jiffies_till_first_fqs == ULONG_MAX)
38594102adabSPaul E. McKenney 		jiffies_till_first_fqs = d;
38604102adabSPaul E. McKenney 	if (jiffies_till_next_fqs == ULONG_MAX)
38614102adabSPaul E. McKenney 		jiffies_till_next_fqs = d;
38624102adabSPaul E. McKenney 
38634102adabSPaul E. McKenney 	/* If the compile-time values are accurate, just leave. */
386447d631afSPaul E. McKenney 	if (rcu_fanout_leaf == RCU_FANOUT_LEAF &&
38654102adabSPaul E. McKenney 	    nr_cpu_ids == NR_CPUS)
38664102adabSPaul E. McKenney 		return;
3867a7538352SJoe Perches 	pr_info("Adjusting geometry for rcu_fanout_leaf=%d, nr_cpu_ids=%u\n",
386839479098SPaul E. McKenney 		rcu_fanout_leaf, nr_cpu_ids);
38694102adabSPaul E. McKenney 
38704102adabSPaul E. McKenney 	/*
3871ee968ac6SPaul E. McKenney 	 * The boot-time rcu_fanout_leaf parameter must be at least two
3872ee968ac6SPaul E. McKenney 	 * and cannot exceed the number of bits in the rcu_node masks.
3873ee968ac6SPaul E. McKenney 	 * Complain and fall back to the compile-time values if this
3874ee968ac6SPaul E. McKenney 	 * limit is exceeded.
38754102adabSPaul E. McKenney 	 */
3876ee968ac6SPaul E. McKenney 	if (rcu_fanout_leaf < 2 ||
387775cf15a4SAlexander Gordeev 	    rcu_fanout_leaf > sizeof(unsigned long) * 8) {
387813bd6494SPaul E. McKenney 		rcu_fanout_leaf = RCU_FANOUT_LEAF;
38794102adabSPaul E. McKenney 		WARN_ON(1);
38804102adabSPaul E. McKenney 		return;
38814102adabSPaul E. McKenney 	}
38824102adabSPaul E. McKenney 
388375cf15a4SAlexander Gordeev 	/*
38844102adabSPaul E. McKenney 	 * Compute number of nodes that can be handled an rcu_node tree
38859618138bSAlexander Gordeev 	 * with the given number of levels.
38864102adabSPaul E. McKenney 	 */
38879618138bSAlexander Gordeev 	rcu_capacity[0] = rcu_fanout_leaf;
388805b84aecSAlexander Gordeev 	for (i = 1; i < RCU_NUM_LVLS; i++)
38894102adabSPaul E. McKenney 		rcu_capacity[i] = rcu_capacity[i - 1] * RCU_FANOUT;
38904102adabSPaul E. McKenney 
38914102adabSPaul E. McKenney 	/*
389275cf15a4SAlexander Gordeev 	 * The tree must be able to accommodate the configured number of CPUs.
3893ee968ac6SPaul E. McKenney 	 * If this limit is exceeded, fall back to the compile-time values.
38944102adabSPaul E. McKenney 	 */
3895ee968ac6SPaul E. McKenney 	if (nr_cpu_ids > rcu_capacity[RCU_NUM_LVLS - 1]) {
3896ee968ac6SPaul E. McKenney 		rcu_fanout_leaf = RCU_FANOUT_LEAF;
3897ee968ac6SPaul E. McKenney 		WARN_ON(1);
3898ee968ac6SPaul E. McKenney 		return;
3899ee968ac6SPaul E. McKenney 	}
39004102adabSPaul E. McKenney 
3901679f9858SAlexander Gordeev 	/* Calculate the number of levels in the tree. */
39029618138bSAlexander Gordeev 	for (i = 0; nr_cpu_ids > rcu_capacity[i]; i++) {
3903372b0ec2SAlexander Gordeev 	}
39049618138bSAlexander Gordeev 	rcu_num_lvls = i + 1;
3905679f9858SAlexander Gordeev 
39064102adabSPaul E. McKenney 	/* Calculate the number of rcu_nodes at each level of the tree. */
3907679f9858SAlexander Gordeev 	for (i = 0; i < rcu_num_lvls; i++) {
39089618138bSAlexander Gordeev 		int cap = rcu_capacity[(rcu_num_lvls - 1) - i];
3909679f9858SAlexander Gordeev 		num_rcu_lvl[i] = DIV_ROUND_UP(nr_cpu_ids, cap);
39104102adabSPaul E. McKenney 	}
39114102adabSPaul E. McKenney 
39124102adabSPaul E. McKenney 	/* Calculate the total number of rcu_node structures. */
39134102adabSPaul E. McKenney 	rcu_num_nodes = 0;
3914679f9858SAlexander Gordeev 	for (i = 0; i < rcu_num_lvls; i++)
39154102adabSPaul E. McKenney 		rcu_num_nodes += num_rcu_lvl[i];
39164102adabSPaul E. McKenney }
39174102adabSPaul E. McKenney 
3918a3dc2948SPaul E. McKenney /*
3919a3dc2948SPaul E. McKenney  * Dump out the structure of the rcu_node combining tree associated
3920a3dc2948SPaul E. McKenney  * with the rcu_state structure referenced by rsp.
3921a3dc2948SPaul E. McKenney  */
3922a3dc2948SPaul E. McKenney static void __init rcu_dump_rcu_node_tree(struct rcu_state *rsp)
3923a3dc2948SPaul E. McKenney {
3924a3dc2948SPaul E. McKenney 	int level = 0;
3925a3dc2948SPaul E. McKenney 	struct rcu_node *rnp;
3926a3dc2948SPaul E. McKenney 
3927a3dc2948SPaul E. McKenney 	pr_info("rcu_node tree layout dump\n");
3928a3dc2948SPaul E. McKenney 	pr_info(" ");
3929a3dc2948SPaul E. McKenney 	rcu_for_each_node_breadth_first(rsp, rnp) {
3930a3dc2948SPaul E. McKenney 		if (rnp->level != level) {
3931a3dc2948SPaul E. McKenney 			pr_cont("\n");
3932a3dc2948SPaul E. McKenney 			pr_info(" ");
3933a3dc2948SPaul E. McKenney 			level = rnp->level;
3934a3dc2948SPaul E. McKenney 		}
3935a3dc2948SPaul E. McKenney 		pr_cont("%d:%d ^%d  ", rnp->grplo, rnp->grphi, rnp->grpnum);
3936a3dc2948SPaul E. McKenney 	}
3937a3dc2948SPaul E. McKenney 	pr_cont("\n");
3938a3dc2948SPaul E. McKenney }
3939a3dc2948SPaul E. McKenney 
3940ad7c946bSPaul E. McKenney struct workqueue_struct *rcu_gp_wq;
394125f3d7efSPaul E. McKenney struct workqueue_struct *rcu_par_gp_wq;
3942ad7c946bSPaul E. McKenney 
39434102adabSPaul E. McKenney void __init rcu_init(void)
39444102adabSPaul E. McKenney {
39454102adabSPaul E. McKenney 	int cpu;
39464102adabSPaul E. McKenney 
394747627678SPaul E. McKenney 	rcu_early_boot_tests();
394847627678SPaul E. McKenney 
39494102adabSPaul E. McKenney 	rcu_bootup_announce();
39504102adabSPaul E. McKenney 	rcu_init_geometry();
395145975c7dSPaul E. McKenney 	rcu_init_one(&rcu_state);
3952a3dc2948SPaul E. McKenney 	if (dump_tree)
395345975c7dSPaul E. McKenney 		rcu_dump_rcu_node_tree(&rcu_state);
39544102adabSPaul E. McKenney 	open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
39554102adabSPaul E. McKenney 
39564102adabSPaul E. McKenney 	/*
39574102adabSPaul E. McKenney 	 * We don't need protection against CPU-hotplug here because
39584102adabSPaul E. McKenney 	 * this is called early in boot, before either interrupts
39594102adabSPaul E. McKenney 	 * or the scheduler are operational.
39604102adabSPaul E. McKenney 	 */
39614102adabSPaul E. McKenney 	pm_notifier(rcu_pm_notify, 0);
39627ec99de3SPaul E. McKenney 	for_each_online_cpu(cpu) {
39634df83742SThomas Gleixner 		rcutree_prepare_cpu(cpu);
39647ec99de3SPaul E. McKenney 		rcu_cpu_starting(cpu);
39659b9500daSPaul E. McKenney 		rcutree_online_cpu(cpu);
39667ec99de3SPaul E. McKenney 	}
3967ad7c946bSPaul E. McKenney 
3968ad7c946bSPaul E. McKenney 	/* Create workqueue for expedited GPs and for Tree SRCU. */
3969ad7c946bSPaul E. McKenney 	rcu_gp_wq = alloc_workqueue("rcu_gp", WQ_MEM_RECLAIM, 0);
3970ad7c946bSPaul E. McKenney 	WARN_ON(!rcu_gp_wq);
397125f3d7efSPaul E. McKenney 	rcu_par_gp_wq = alloc_workqueue("rcu_par_gp", WQ_MEM_RECLAIM, 0);
397225f3d7efSPaul E. McKenney 	WARN_ON(!rcu_par_gp_wq);
39734102adabSPaul E. McKenney }
39744102adabSPaul E. McKenney 
39753549c2bcSPaul E. McKenney #include "tree_exp.h"
39764102adabSPaul E. McKenney #include "tree_plugin.h"
3977