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