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