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