122e40925SPaul E. McKenney /* SPDX-License-Identifier: GPL-2.0+ */
24102adabSPaul E. McKenney /*
34102adabSPaul E. McKenney * Read-Copy Update mechanism for mutual exclusion (tree-based version)
44102adabSPaul E. McKenney * Internal non-public definitions that provide either classic
54102adabSPaul E. McKenney * or preemptible semantics.
64102adabSPaul E. McKenney *
74102adabSPaul E. McKenney * Copyright Red Hat, 2009
84102adabSPaul E. McKenney * Copyright IBM Corporation, 2009
94102adabSPaul E. McKenney *
104102adabSPaul E. McKenney * Author: Ingo Molnar <[email protected]>
1122e40925SPaul E. McKenney * Paul E. McKenney <[email protected]>
124102adabSPaul E. McKenney */
134102adabSPaul E. McKenney
14abaa93d9SPaul E. McKenney #include "../locking/rtmutex_common.h"
154102adabSPaul E. McKenney
rcu_rdp_is_offloaded(struct rcu_data * rdp)163820b513SFrederic Weisbecker static bool rcu_rdp_is_offloaded(struct rcu_data *rdp)
173820b513SFrederic Weisbecker {
183820b513SFrederic Weisbecker /*
1917ea3718SZhouyi Zhou * In order to read the offloaded state of an rdp in a safe
203820b513SFrederic Weisbecker * and stable way and prevent from its value to be changed
213820b513SFrederic Weisbecker * under us, we must either hold the barrier mutex, the cpu
223820b513SFrederic Weisbecker * hotplug lock (read or write) or the nocb lock. Local
233820b513SFrederic Weisbecker * non-preemptible reads are also safe. NOCB kthreads and
243820b513SFrederic Weisbecker * timers have their own means of synchronization against the
253820b513SFrederic Weisbecker * offloaded state updaters.
263820b513SFrederic Weisbecker */
277aeba709SFrederic Weisbecker RCU_NOCB_LOCKDEP_WARN(
283820b513SFrederic Weisbecker !(lockdep_is_held(&rcu_state.barrier_mutex) ||
293820b513SFrederic Weisbecker (IS_ENABLED(CONFIG_HOTPLUG_CPU) && lockdep_is_cpus_held()) ||
307aeba709SFrederic Weisbecker lockdep_is_held(&rdp->nocb_lock) ||
317121dd91SFrederic Weisbecker lockdep_is_held(&rcu_state.nocb_mutex) ||
32483d5bf2SFrederic Weisbecker (!(IS_ENABLED(CONFIG_PREEMPT_COUNT) && preemptible()) &&
33483d5bf2SFrederic Weisbecker rdp == this_cpu_ptr(&rcu_data)) ||
34d76e0926SFrederic Weisbecker rcu_current_is_nocb_kthread(rdp)),
353820b513SFrederic Weisbecker "Unsafe read of RCU_NOCB offloaded state"
363820b513SFrederic Weisbecker );
373820b513SFrederic Weisbecker
383820b513SFrederic Weisbecker return rcu_segcblist_is_offloaded(&rdp->cblist);
393820b513SFrederic Weisbecker }
403820b513SFrederic Weisbecker
414102adabSPaul E. McKenney /*
424102adabSPaul E. McKenney * Check the RCU kernel configuration parameters and print informative
43699d4035SPaul E. McKenney * messages about anything out of the ordinary.
444102adabSPaul E. McKenney */
rcu_bootup_announce_oddness(void)454102adabSPaul E. McKenney static void __init rcu_bootup_announce_oddness(void)
464102adabSPaul E. McKenney {
47ab6f5bd6SPaul E. McKenney if (IS_ENABLED(CONFIG_RCU_TRACE))
48ae91aa0aSPaul E. McKenney pr_info("\tRCU event tracing is enabled.\n");
4905c5df31SPaul E. McKenney if ((IS_ENABLED(CONFIG_64BIT) && RCU_FANOUT != 64) ||
5005c5df31SPaul E. McKenney (!IS_ENABLED(CONFIG_64BIT) && RCU_FANOUT != 32))
51a7538352SJoe Perches pr_info("\tCONFIG_RCU_FANOUT set to non-default value of %d.\n",
5205c5df31SPaul E. McKenney RCU_FANOUT);
537fa27001SPaul E. McKenney if (rcu_fanout_exact)
544102adabSPaul E. McKenney pr_info("\tHierarchical RCU autobalancing is disabled.\n");
55c4a09ff7SPaul E. McKenney if (IS_ENABLED(CONFIG_PROVE_RCU))
564102adabSPaul E. McKenney pr_info("\tRCU lockdep checking is enabled.\n");
578cbd0e38SPaul E. McKenney if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD))
5817ea3718SZhouyi Zhou pr_info("\tRCU strict (and thus non-scalable) grace periods are enabled.\n");
5942621697SAlexander Gordeev if (RCU_NUM_LVLS >= 4)
6042621697SAlexander Gordeev pr_info("\tFour(or more)-level hierarchy is enabled.\n");
6147d631afSPaul E. McKenney if (RCU_FANOUT_LEAF != 16)
62a3bd2c09SPaul E. McKenney pr_info("\tBuild-time adjustment of leaf fanout to %d.\n",
6347d631afSPaul E. McKenney RCU_FANOUT_LEAF);
6447d631afSPaul E. McKenney if (rcu_fanout_leaf != RCU_FANOUT_LEAF)
65a7538352SJoe Perches pr_info("\tBoot-time adjustment of leaf fanout to %d.\n",
66a7538352SJoe Perches rcu_fanout_leaf);
674102adabSPaul E. McKenney if (nr_cpu_ids != NR_CPUS)
689b130ad5SAlexey Dobriyan pr_info("\tRCU restricting CPUs from NR_CPUS=%d to nr_cpu_ids=%u.\n", NR_CPUS, nr_cpu_ids);
6917c7798bSPaul E. McKenney #ifdef CONFIG_RCU_BOOST
70a7538352SJoe Perches pr_info("\tRCU priority boosting: priority %d delay %d ms.\n",
71a7538352SJoe Perches kthread_prio, CONFIG_RCU_BOOST_DELAY);
7217c7798bSPaul E. McKenney #endif
7317c7798bSPaul E. McKenney if (blimit != DEFAULT_RCU_BLIMIT)
7417c7798bSPaul E. McKenney pr_info("\tBoot-time adjustment of callback invocation limit to %ld.\n", blimit);
7517c7798bSPaul E. McKenney if (qhimark != DEFAULT_RCU_QHIMARK)
7617c7798bSPaul E. McKenney pr_info("\tBoot-time adjustment of callback high-water mark to %ld.\n", qhimark);
7717c7798bSPaul E. McKenney if (qlowmark != DEFAULT_RCU_QLOMARK)
7817c7798bSPaul E. McKenney pr_info("\tBoot-time adjustment of callback low-water mark to %ld.\n", qlowmark);
79b2b00ddfSPaul E. McKenney if (qovld != DEFAULT_RCU_QOVLD)
80aa96a93bSColin Ian King pr_info("\tBoot-time adjustment of callback overload level to %ld.\n", qovld);
8117c7798bSPaul E. McKenney if (jiffies_till_first_fqs != ULONG_MAX)
8217c7798bSPaul E. McKenney pr_info("\tBoot-time adjustment of first FQS scan delay to %ld jiffies.\n", jiffies_till_first_fqs);
8317c7798bSPaul E. McKenney if (jiffies_till_next_fqs != ULONG_MAX)
8417c7798bSPaul E. McKenney pr_info("\tBoot-time adjustment of subsequent FQS scan delay to %ld jiffies.\n", jiffies_till_next_fqs);
85c06aed0eSPaul E. McKenney if (jiffies_till_sched_qs != ULONG_MAX)
86c06aed0eSPaul E. McKenney pr_info("\tBoot-time adjustment of scheduler-enlistment delay to %ld jiffies.\n", jiffies_till_sched_qs);
8717c7798bSPaul E. McKenney if (rcu_kick_kthreads)
8817c7798bSPaul E. McKenney pr_info("\tKick kthreads if too-long grace period.\n");
8917c7798bSPaul E. McKenney if (IS_ENABLED(CONFIG_DEBUG_OBJECTS_RCU_HEAD))
9017ea3718SZhouyi Zhou pr_info("\tRCU callback double-/use-after-free debug is enabled.\n");
9190040c9eSPaul E. McKenney if (gp_preinit_delay)
9217c7798bSPaul E. McKenney pr_info("\tRCU debug GP pre-init slowdown %d jiffies.\n", gp_preinit_delay);
9390040c9eSPaul E. McKenney if (gp_init_delay)
9417c7798bSPaul E. McKenney pr_info("\tRCU debug GP init slowdown %d jiffies.\n", gp_init_delay);
9590040c9eSPaul E. McKenney if (gp_cleanup_delay)
9617ea3718SZhouyi Zhou pr_info("\tRCU debug GP cleanup slowdown %d jiffies.\n", gp_cleanup_delay);
9768d124b0SPaul E. McKenney if (nohz_full_patience_delay < 0) {
9868d124b0SPaul E. McKenney pr_info("\tRCU NOCB CPU patience negative (%d), resetting to zero.\n", nohz_full_patience_delay);
9968d124b0SPaul E. McKenney nohz_full_patience_delay = 0;
10068d124b0SPaul E. McKenney } else if (nohz_full_patience_delay > 5 * MSEC_PER_SEC) {
10168d124b0SPaul E. McKenney pr_info("\tRCU NOCB CPU patience too large (%d), resetting to %ld.\n", nohz_full_patience_delay, 5 * MSEC_PER_SEC);
10268d124b0SPaul E. McKenney nohz_full_patience_delay = 5 * MSEC_PER_SEC;
10368d124b0SPaul E. McKenney } else if (nohz_full_patience_delay) {
10468d124b0SPaul E. McKenney pr_info("\tRCU NOCB CPU patience set to %d milliseconds.\n", nohz_full_patience_delay);
10568d124b0SPaul E. McKenney }
10668d124b0SPaul E. McKenney nohz_full_patience_delay_jiffies = msecs_to_jiffies(nohz_full_patience_delay);
10748d07c04SSebastian Andrzej Siewior if (!use_softirq)
10848d07c04SSebastian Andrzej Siewior pr_info("\tRCU_SOFTIRQ processing moved to rcuc kthreads.\n");
10917c7798bSPaul E. McKenney if (IS_ENABLED(CONFIG_RCU_EQS_DEBUG))
11017c7798bSPaul E. McKenney pr_info("\tRCU debug extended QS entry/exit.\n");
11159d80fd8SPaul E. McKenney rcupdate_announce_bootup_oddness();
1124102adabSPaul E. McKenney }
1134102adabSPaul E. McKenney
11428f6569aSPranith Kumar #ifdef CONFIG_PREEMPT_RCU
1154102adabSPaul E. McKenney
11663d4c8c9SPaul E. McKenney static void rcu_report_exp_rnp(struct rcu_node *rnp, bool wake);
1173949fa9bSPaul E. McKenney static void rcu_read_unlock_special(struct task_struct *t);
1184102adabSPaul E. McKenney
1194102adabSPaul E. McKenney /*
1204102adabSPaul E. McKenney * Tell them what RCU they are running.
1214102adabSPaul E. McKenney */
rcu_bootup_announce(void)1224102adabSPaul E. McKenney static void __init rcu_bootup_announce(void)
1234102adabSPaul E. McKenney {
1244102adabSPaul E. McKenney pr_info("Preemptible hierarchical RCU implementation.\n");
1254102adabSPaul E. McKenney rcu_bootup_announce_oddness();
1264102adabSPaul E. McKenney }
1274102adabSPaul E. McKenney
1288203d6d0SPaul E. McKenney /* Flags for rcu_preempt_ctxt_queue() decision table. */
1298203d6d0SPaul E. McKenney #define RCU_GP_TASKS 0x8
1308203d6d0SPaul E. McKenney #define RCU_EXP_TASKS 0x4
1318203d6d0SPaul E. McKenney #define RCU_GP_BLKD 0x2
1328203d6d0SPaul E. McKenney #define RCU_EXP_BLKD 0x1
1338203d6d0SPaul E. McKenney
1348203d6d0SPaul E. McKenney /*
1358203d6d0SPaul E. McKenney * Queues a task preempted within an RCU-preempt read-side critical
1368203d6d0SPaul E. McKenney * section into the appropriate location within the ->blkd_tasks list,
1378203d6d0SPaul E. McKenney * depending on the states of any ongoing normal and expedited grace
1388203d6d0SPaul E. McKenney * periods. The ->gp_tasks pointer indicates which element the normal
1398203d6d0SPaul E. McKenney * grace period is waiting on (NULL if none), and the ->exp_tasks pointer
1408203d6d0SPaul E. McKenney * indicates which element the expedited grace period is waiting on (again,
1418203d6d0SPaul E. McKenney * NULL if none). If a grace period is waiting on a given element in the
1428203d6d0SPaul E. McKenney * ->blkd_tasks list, it also waits on all subsequent elements. Thus,
1438203d6d0SPaul E. McKenney * adding a task to the tail of the list blocks any grace period that is
1448203d6d0SPaul E. McKenney * already waiting on one of the elements. In contrast, adding a task
1458203d6d0SPaul E. McKenney * to the head of the list won't block any grace period that is already
1468203d6d0SPaul E. McKenney * waiting on one of the elements.
1478203d6d0SPaul E. McKenney *
1488203d6d0SPaul E. McKenney * This queuing is imprecise, and can sometimes make an ongoing grace
1498203d6d0SPaul E. McKenney * period wait for a task that is not strictly speaking blocking it.
1508203d6d0SPaul E. McKenney * Given the choice, we needlessly block a normal grace period rather than
1518203d6d0SPaul E. McKenney * blocking an expedited grace period.
1528203d6d0SPaul E. McKenney *
1538203d6d0SPaul E. McKenney * Note that an endless sequence of expedited grace periods still cannot
1548203d6d0SPaul E. McKenney * indefinitely postpone a normal grace period. Eventually, all of the
1558203d6d0SPaul E. McKenney * fixed number of preempted tasks blocking the normal grace period that are
1568203d6d0SPaul E. McKenney * not also blocking the expedited grace period will resume and complete
1578203d6d0SPaul E. McKenney * their RCU read-side critical sections. At that point, the ->gp_tasks
1588203d6d0SPaul E. McKenney * pointer will equal the ->exp_tasks pointer, at which point the end of
1598203d6d0SPaul E. McKenney * the corresponding expedited grace period will also be the end of the
1608203d6d0SPaul E. McKenney * normal grace period.
1618203d6d0SPaul E. McKenney */
rcu_preempt_ctxt_queue(struct rcu_node * rnp,struct rcu_data * rdp)16246a5d164SPaul E. McKenney static void rcu_preempt_ctxt_queue(struct rcu_node *rnp, struct rcu_data *rdp)
16346a5d164SPaul E. McKenney __releases(rnp->lock) /* But leaves rrupts disabled. */
1648203d6d0SPaul E. McKenney {
1658203d6d0SPaul E. McKenney int blkd_state = (rnp->gp_tasks ? RCU_GP_TASKS : 0) +
1668203d6d0SPaul E. McKenney (rnp->exp_tasks ? RCU_EXP_TASKS : 0) +
1678203d6d0SPaul E. McKenney (rnp->qsmask & rdp->grpmask ? RCU_GP_BLKD : 0) +
1688203d6d0SPaul E. McKenney (rnp->expmask & rdp->grpmask ? RCU_EXP_BLKD : 0);
1698203d6d0SPaul E. McKenney struct task_struct *t = current;
1708203d6d0SPaul E. McKenney
171a32e01eeSMatthew Wilcox raw_lockdep_assert_held_rcu_node(rnp);
1722dee9404SPaul E. McKenney WARN_ON_ONCE(rdp->mynode != rnp);
1735b4c11d5SPaul E. McKenney WARN_ON_ONCE(!rcu_is_leaf_node(rnp));
1741f3e5f51SPaul E. McKenney /* RCU better not be waiting on newly onlined CPUs! */
1751f3e5f51SPaul E. McKenney WARN_ON_ONCE(rnp->qsmaskinitnext & ~rnp->qsmaskinit & rnp->qsmask &
1761f3e5f51SPaul E. McKenney rdp->grpmask);
177ea9b0c8aSPaul E. McKenney
1788203d6d0SPaul E. McKenney /*
1798203d6d0SPaul E. McKenney * Decide where to queue the newly blocked task. In theory,
1808203d6d0SPaul E. McKenney * this could be an if-statement. In practice, when I tried
1818203d6d0SPaul E. McKenney * that, it was quite messy.
1828203d6d0SPaul E. McKenney */
1838203d6d0SPaul E. McKenney switch (blkd_state) {
1848203d6d0SPaul E. McKenney case 0:
1858203d6d0SPaul E. McKenney case RCU_EXP_TASKS:
186c3291206SHongbo Li case RCU_EXP_TASKS | RCU_GP_BLKD:
1878203d6d0SPaul E. McKenney case RCU_GP_TASKS:
188c3291206SHongbo Li case RCU_GP_TASKS | RCU_EXP_TASKS:
1898203d6d0SPaul E. McKenney
1908203d6d0SPaul E. McKenney /*
1918203d6d0SPaul E. McKenney * Blocking neither GP, or first task blocking the normal
1928203d6d0SPaul E. McKenney * GP but not blocking the already-waiting expedited GP.
1938203d6d0SPaul E. McKenney * Queue at the head of the list to avoid unnecessarily
1948203d6d0SPaul E. McKenney * blocking the already-waiting GPs.
1958203d6d0SPaul E. McKenney */
1968203d6d0SPaul E. McKenney list_add(&t->rcu_node_entry, &rnp->blkd_tasks);
1978203d6d0SPaul E. McKenney break;
1988203d6d0SPaul E. McKenney
1998203d6d0SPaul E. McKenney case RCU_EXP_BLKD:
2008203d6d0SPaul E. McKenney case RCU_GP_BLKD:
201c3291206SHongbo Li case RCU_GP_BLKD | RCU_EXP_BLKD:
202c3291206SHongbo Li case RCU_GP_TASKS | RCU_EXP_BLKD:
203c3291206SHongbo Li case RCU_GP_TASKS | RCU_GP_BLKD | RCU_EXP_BLKD:
204c3291206SHongbo Li case RCU_GP_TASKS | RCU_EXP_TASKS | RCU_GP_BLKD | RCU_EXP_BLKD:
2058203d6d0SPaul E. McKenney
2068203d6d0SPaul E. McKenney /*
2078203d6d0SPaul E. McKenney * First task arriving that blocks either GP, or first task
2088203d6d0SPaul E. McKenney * arriving that blocks the expedited GP (with the normal
2098203d6d0SPaul E. McKenney * GP already waiting), or a task arriving that blocks
2108203d6d0SPaul E. McKenney * both GPs with both GPs already waiting. Queue at the
2118203d6d0SPaul E. McKenney * tail of the list to avoid any GP waiting on any of the
2128203d6d0SPaul E. McKenney * already queued tasks that are not blocking it.
2138203d6d0SPaul E. McKenney */
2148203d6d0SPaul E. McKenney list_add_tail(&t->rcu_node_entry, &rnp->blkd_tasks);
2158203d6d0SPaul E. McKenney break;
2168203d6d0SPaul E. McKenney
217c3291206SHongbo Li case RCU_EXP_TASKS | RCU_EXP_BLKD:
218c3291206SHongbo Li case RCU_EXP_TASKS | RCU_GP_BLKD | RCU_EXP_BLKD:
219c3291206SHongbo Li case RCU_GP_TASKS | RCU_EXP_TASKS | RCU_EXP_BLKD:
2208203d6d0SPaul E. McKenney
2218203d6d0SPaul E. McKenney /*
2228203d6d0SPaul E. McKenney * Second or subsequent task blocking the expedited GP.
2238203d6d0SPaul E. McKenney * The task either does not block the normal GP, or is the
2248203d6d0SPaul E. McKenney * first task blocking the normal GP. Queue just after
2258203d6d0SPaul E. McKenney * the first task blocking the expedited GP.
2268203d6d0SPaul E. McKenney */
2278203d6d0SPaul E. McKenney list_add(&t->rcu_node_entry, rnp->exp_tasks);
2288203d6d0SPaul E. McKenney break;
2298203d6d0SPaul E. McKenney
230c3291206SHongbo Li case RCU_GP_TASKS | RCU_GP_BLKD:
231c3291206SHongbo Li case RCU_GP_TASKS | RCU_EXP_TASKS | RCU_GP_BLKD:
2328203d6d0SPaul E. McKenney
2338203d6d0SPaul E. McKenney /*
2348203d6d0SPaul E. McKenney * Second or subsequent task blocking the normal GP.
2358203d6d0SPaul E. McKenney * The task does not block the expedited GP. Queue just
2368203d6d0SPaul E. McKenney * after the first task blocking the normal GP.
2378203d6d0SPaul E. McKenney */
2388203d6d0SPaul E. McKenney list_add(&t->rcu_node_entry, rnp->gp_tasks);
2398203d6d0SPaul E. McKenney break;
2408203d6d0SPaul E. McKenney
2418203d6d0SPaul E. McKenney default:
2428203d6d0SPaul E. McKenney
2438203d6d0SPaul E. McKenney /* Yet another exercise in excessive paranoia. */
2448203d6d0SPaul E. McKenney WARN_ON_ONCE(1);
2458203d6d0SPaul E. McKenney break;
2468203d6d0SPaul E. McKenney }
2478203d6d0SPaul E. McKenney
2488203d6d0SPaul E. McKenney /*
2498203d6d0SPaul E. McKenney * We have now queued the task. If it was the first one to
2508203d6d0SPaul E. McKenney * block either grace period, update the ->gp_tasks and/or
2518203d6d0SPaul E. McKenney * ->exp_tasks pointers, respectively, to reference the newly
2528203d6d0SPaul E. McKenney * blocked tasks.
2538203d6d0SPaul E. McKenney */
2544bc8d555SPaul E. McKenney if (!rnp->gp_tasks && (blkd_state & RCU_GP_BLKD)) {
2556935c398SEric Dumazet WRITE_ONCE(rnp->gp_tasks, &t->rcu_node_entry);
256d43a5d32SPaul E. McKenney WARN_ON_ONCE(rnp->completedqs == rnp->gp_seq);
2574bc8d555SPaul E. McKenney }
2588203d6d0SPaul E. McKenney if (!rnp->exp_tasks && (blkd_state & RCU_EXP_BLKD))
259314eeb43SPaul E. McKenney WRITE_ONCE(rnp->exp_tasks, &t->rcu_node_entry);
2602dee9404SPaul E. McKenney WARN_ON_ONCE(!(blkd_state & RCU_GP_BLKD) !=
2612dee9404SPaul E. McKenney !(rnp->qsmask & rdp->grpmask));
2622dee9404SPaul E. McKenney WARN_ON_ONCE(!(blkd_state & RCU_EXP_BLKD) !=
2632dee9404SPaul E. McKenney !(rnp->expmask & rdp->grpmask));
26467c583a7SBoqun Feng raw_spin_unlock_rcu_node(rnp); /* interrupts remain disabled. */
2658203d6d0SPaul E. McKenney
2668203d6d0SPaul E. McKenney /*
2678203d6d0SPaul E. McKenney * Report the quiescent state for the expedited GP. This expedited
2688203d6d0SPaul E. McKenney * GP should not be able to end until we report, so there should be
2698203d6d0SPaul E. McKenney * no need to check for a subsequent expedited GP. (Though we are
2708203d6d0SPaul E. McKenney * still in a quiescent state in any case.)
2719146eb25SPaul E. McKenney *
2729146eb25SPaul E. McKenney * Interrupts are disabled, so ->cpu_no_qs.b.exp cannot change.
2738203d6d0SPaul E. McKenney */
2746120b72eSFrederic Weisbecker if (blkd_state & RCU_EXP_BLKD && rdp->cpu_no_qs.b.exp)
27563d4c8c9SPaul E. McKenney rcu_report_exp_rdp(rdp);
276fcc878e4SPaul E. McKenney else
2776120b72eSFrederic Weisbecker WARN_ON_ONCE(rdp->cpu_no_qs.b.exp);
278ecc5e6b0SPaul E. McKenney ASSERT_EXCLUSIVE_WRITER_SCOPED(rdp->cpu_no_qs.b.exp);
2798203d6d0SPaul E. McKenney }
2808203d6d0SPaul E. McKenney
2814102adabSPaul E. McKenney /*
282c7037ff5SPaul E. McKenney * Record a preemptible-RCU quiescent state for the specified CPU.
283c7037ff5SPaul E. McKenney * Note that this does not necessarily mean that the task currently running
284c7037ff5SPaul E. McKenney * on the CPU is in a quiescent state: Instead, it means that the current
285c7037ff5SPaul E. McKenney * grace period need not wait on any RCU read-side critical section that
286c7037ff5SPaul E. McKenney * starts later on this CPU. It also means that if the current task is
287c7037ff5SPaul E. McKenney * in an RCU read-side critical section, it has already added itself to
288c7037ff5SPaul E. McKenney * some leaf rcu_node structure's ->blkd_tasks list. In addition to the
289c7037ff5SPaul E. McKenney * current task, there might be any number of other tasks blocked while
290c7037ff5SPaul E. McKenney * in an RCU read-side critical section.
2914102adabSPaul E. McKenney *
292a4382659SFrederic Weisbecker * Unlike non-preemptible-RCU, quiescent state reports for expedited
293a4382659SFrederic Weisbecker * grace periods are handled separately via deferred quiescent states
294a4382659SFrederic Weisbecker * and context switch events.
295a4382659SFrederic Weisbecker *
296c7037ff5SPaul E. McKenney * Callers to this function must disable preemption.
2974102adabSPaul E. McKenney */
rcu_qs(void)29845975c7dSPaul E. McKenney static void rcu_qs(void)
2994102adabSPaul E. McKenney {
30045975c7dSPaul E. McKenney RCU_LOCKDEP_WARN(preemptible(), "rcu_qs() invoked with preemption enabled!!!\n");
301a4382659SFrederic Weisbecker if (__this_cpu_read(rcu_data.cpu_no_qs.b.norm)) {
302284a8c93SPaul E. McKenney trace_rcu_grace_period(TPS("rcu_preempt"),
3032280ee5aSPaul E. McKenney __this_cpu_read(rcu_data.gp_seq),
304284a8c93SPaul E. McKenney TPS("cpuqs"));
3052280ee5aSPaul E. McKenney __this_cpu_write(rcu_data.cpu_no_qs.b.norm, false);
306c98cac60SPaul E. McKenney barrier(); /* Coordinate with rcu_flavor_sched_clock_irq(). */
307add0d37bSPaul E. McKenney WRITE_ONCE(current->rcu_read_unlock_special.b.need_qs, false);
3084102adabSPaul E. McKenney }
3094102adabSPaul E. McKenney }
3104102adabSPaul E. McKenney
3114102adabSPaul E. McKenney /*
3124102adabSPaul E. McKenney * We have entered the scheduler, and the current task might soon be
3134102adabSPaul E. McKenney * context-switched away from. If this task is in an RCU read-side
3144102adabSPaul E. McKenney * critical section, we will no longer be able to rely on the CPU to
3154102adabSPaul E. McKenney * record that fact, so we enqueue the task on the blkd_tasks list.
3164102adabSPaul E. McKenney * The task will dequeue itself when it exits the outermost enclosing
3174102adabSPaul E. McKenney * RCU read-side critical section. Therefore, the current grace period
3184102adabSPaul E. McKenney * cannot be permitted to complete until the blkd_tasks list entries
3194102adabSPaul E. McKenney * predating the current grace period drain, in other words, until
3204102adabSPaul E. McKenney * rnp->gp_tasks becomes NULL.
3214102adabSPaul E. McKenney *
32246a5d164SPaul E. McKenney * Caller must disable interrupts.
3234102adabSPaul E. McKenney */
rcu_note_context_switch(bool preempt)32445975c7dSPaul E. McKenney void rcu_note_context_switch(bool preempt)
3254102adabSPaul E. McKenney {
3264102adabSPaul E. McKenney struct task_struct *t = current;
327da1df50dSPaul E. McKenney struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
3284102adabSPaul E. McKenney struct rcu_node *rnp;
3294102adabSPaul E. McKenney
33045975c7dSPaul E. McKenney trace_rcu_utilization(TPS("Start context switch"));
331b04db8e1SFrederic Weisbecker lockdep_assert_irqs_disabled();
332521c89b3SPaul E. McKenney WARN_ONCE(!preempt && rcu_preempt_depth() > 0, "Voluntary context switch within RCU read-side critical section!");
33377339e61SLai Jiangshan if (rcu_preempt_depth() > 0 &&
3341d082fd0SPaul E. McKenney !t->rcu_read_unlock_special.b.blocked) {
3354102adabSPaul E. McKenney
3364102adabSPaul E. McKenney /* Possibly blocking in an RCU read-side critical section. */
3374102adabSPaul E. McKenney rnp = rdp->mynode;
33846a5d164SPaul E. McKenney raw_spin_lock_rcu_node(rnp);
3391d082fd0SPaul E. McKenney t->rcu_read_unlock_special.b.blocked = true;
3404102adabSPaul E. McKenney t->rcu_blocked_node = rnp;
3414102adabSPaul E. McKenney
3424102adabSPaul E. McKenney /*
3438203d6d0SPaul E. McKenney * Verify the CPU's sanity, trace the preemption, and
3448203d6d0SPaul E. McKenney * then queue the task as required based on the states
3458203d6d0SPaul E. McKenney * of any ongoing and expedited grace periods.
3464102adabSPaul E. McKenney */
3475ae0f1b5SPaul E. McKenney WARN_ON_ONCE(!rcu_rdp_cpu_online(rdp));
3484102adabSPaul E. McKenney WARN_ON_ONCE(!list_empty(&t->rcu_node_entry));
34988d1beadSPaul E. McKenney trace_rcu_preempt_task(rcu_state.name,
3504102adabSPaul E. McKenney t->pid,
3514102adabSPaul E. McKenney (rnp->qsmask & rdp->grpmask)
352598ce094SPaul E. McKenney ? rnp->gp_seq
353598ce094SPaul E. McKenney : rcu_seq_snap(&rnp->gp_seq));
35446a5d164SPaul E. McKenney rcu_preempt_ctxt_queue(rnp, rdp);
3553e310098SPaul E. McKenney } else {
3563e310098SPaul E. McKenney rcu_preempt_deferred_qs(t);
3574102adabSPaul E. McKenney }
3584102adabSPaul E. McKenney
3594102adabSPaul E. McKenney /*
3604102adabSPaul E. McKenney * Either we were not in an RCU read-side critical section to
3614102adabSPaul E. McKenney * begin with, or we have now recorded that critical section
3624102adabSPaul E. McKenney * globally. Either way, we can now note a quiescent state
3634102adabSPaul E. McKenney * for this CPU. Again, if we were in an RCU read-side critical
3644102adabSPaul E. McKenney * section, and if that critical section was blocking the current
3654102adabSPaul E. McKenney * grace period, then the fact that the task has been enqueued
3664102adabSPaul E. McKenney * means that we continue to block the current grace period.
3674102adabSPaul E. McKenney */
36845975c7dSPaul E. McKenney rcu_qs();
3696120b72eSFrederic Weisbecker if (rdp->cpu_no_qs.b.exp)
37063d4c8c9SPaul E. McKenney rcu_report_exp_rdp(rdp);
37143766c3eSPaul E. McKenney rcu_tasks_qs(current, preempt);
37245975c7dSPaul E. McKenney trace_rcu_utilization(TPS("End context switch"));
3734102adabSPaul E. McKenney }
37445975c7dSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_note_context_switch);
3754102adabSPaul E. McKenney
3764102adabSPaul E. McKenney /*
3774102adabSPaul E. McKenney * Check for preempted RCU readers blocking the current grace period
3784102adabSPaul E. McKenney * for the specified rcu_node structure. If the caller needs a reliable
3794102adabSPaul E. McKenney * answer, it must hold the rcu_node's ->lock.
3804102adabSPaul E. McKenney */
rcu_preempt_blocked_readers_cgp(struct rcu_node * rnp)3814102adabSPaul E. McKenney static int rcu_preempt_blocked_readers_cgp(struct rcu_node *rnp)
3824102adabSPaul E. McKenney {
3836935c398SEric Dumazet return READ_ONCE(rnp->gp_tasks) != NULL;
3844102adabSPaul E. McKenney }
3854102adabSPaul E. McKenney
3865f5fa7eaSLai Jiangshan /* limit value for ->rcu_read_lock_nesting. */
3875f1a6ef3SPaul E. McKenney #define RCU_NEST_PMAX (INT_MAX / 2)
3885f1a6ef3SPaul E. McKenney
rcu_preempt_read_enter(void)38977339e61SLai Jiangshan static void rcu_preempt_read_enter(void)
39077339e61SLai Jiangshan {
3915fcb3a5fSPaul E. McKenney WRITE_ONCE(current->rcu_read_lock_nesting, READ_ONCE(current->rcu_read_lock_nesting) + 1);
39277339e61SLai Jiangshan }
39377339e61SLai Jiangshan
rcu_preempt_read_exit(void)3945f5fa7eaSLai Jiangshan static int rcu_preempt_read_exit(void)
39577339e61SLai Jiangshan {
3965fcb3a5fSPaul E. McKenney int ret = READ_ONCE(current->rcu_read_lock_nesting) - 1;
3975fcb3a5fSPaul E. McKenney
3985fcb3a5fSPaul E. McKenney WRITE_ONCE(current->rcu_read_lock_nesting, ret);
3995fcb3a5fSPaul E. McKenney return ret;
40077339e61SLai Jiangshan }
40177339e61SLai Jiangshan
rcu_preempt_depth_set(int val)40277339e61SLai Jiangshan static void rcu_preempt_depth_set(int val)
40377339e61SLai Jiangshan {
4045fcb3a5fSPaul E. McKenney WRITE_ONCE(current->rcu_read_lock_nesting, val);
40577339e61SLai Jiangshan }
40677339e61SLai Jiangshan
4074102adabSPaul E. McKenney /*
4080e5da22eSPaul E. McKenney * Preemptible RCU implementation for rcu_read_lock().
4090e5da22eSPaul E. McKenney * Just increment ->rcu_read_lock_nesting, shared state will be updated
4100e5da22eSPaul E. McKenney * if we block.
4110e5da22eSPaul E. McKenney */
__rcu_read_lock(void)4120e5da22eSPaul E. McKenney void __rcu_read_lock(void)
4130e5da22eSPaul E. McKenney {
41477339e61SLai Jiangshan rcu_preempt_read_enter();
4155f1a6ef3SPaul E. McKenney if (IS_ENABLED(CONFIG_PROVE_LOCKING))
41677339e61SLai Jiangshan WARN_ON_ONCE(rcu_preempt_depth() > RCU_NEST_PMAX);
417f19920e4SPaul E. McKenney if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD) && rcu_state.gp_kthread)
418f19920e4SPaul E. McKenney WRITE_ONCE(current->rcu_read_unlock_special.b.need_qs, true);
4190e5da22eSPaul E. McKenney barrier(); /* critical section after entry code. */
4200e5da22eSPaul E. McKenney }
4210e5da22eSPaul E. McKenney EXPORT_SYMBOL_GPL(__rcu_read_lock);
4220e5da22eSPaul E. McKenney
4230e5da22eSPaul E. McKenney /*
4240e5da22eSPaul E. McKenney * Preemptible RCU implementation for rcu_read_unlock().
4250e5da22eSPaul E. McKenney * Decrement ->rcu_read_lock_nesting. If the result is zero (outermost
4260e5da22eSPaul E. McKenney * rcu_read_unlock()) and ->rcu_read_unlock_special is non-zero, then
4270e5da22eSPaul E. McKenney * invoke rcu_read_unlock_special() to clean up after a context switch
4280e5da22eSPaul E. McKenney * in an RCU read-side critical section and other special cases.
4290e5da22eSPaul E. McKenney */
__rcu_read_unlock(void)4300e5da22eSPaul E. McKenney void __rcu_read_unlock(void)
4310e5da22eSPaul E. McKenney {
4320e5da22eSPaul E. McKenney struct task_struct *t = current;
4330e5da22eSPaul E. McKenney
4347e937220SPaul E. McKenney barrier(); // critical section before exit code.
4355f5fa7eaSLai Jiangshan if (rcu_preempt_read_exit() == 0) {
4367e937220SPaul E. McKenney barrier(); // critical-section exit before .s check.
4370e5da22eSPaul E. McKenney if (unlikely(READ_ONCE(t->rcu_read_unlock_special.s)))
4380e5da22eSPaul E. McKenney rcu_read_unlock_special(t);
4390e5da22eSPaul E. McKenney }
4405f1a6ef3SPaul E. McKenney if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
44177339e61SLai Jiangshan int rrln = rcu_preempt_depth();
4420e5da22eSPaul E. McKenney
4435f5fa7eaSLai Jiangshan WARN_ON_ONCE(rrln < 0 || rrln > RCU_NEST_PMAX);
4440e5da22eSPaul E. McKenney }
4450e5da22eSPaul E. McKenney }
4460e5da22eSPaul E. McKenney EXPORT_SYMBOL_GPL(__rcu_read_unlock);
4470e5da22eSPaul E. McKenney
4480e5da22eSPaul E. McKenney /*
4494102adabSPaul E. McKenney * Advance a ->blkd_tasks-list pointer to the next entry, instead
4504102adabSPaul E. McKenney * returning NULL if at the end of the list.
4514102adabSPaul E. McKenney */
rcu_next_node_entry(struct task_struct * t,struct rcu_node * rnp)4524102adabSPaul E. McKenney static struct list_head *rcu_next_node_entry(struct task_struct *t,
4534102adabSPaul E. McKenney struct rcu_node *rnp)
4544102adabSPaul E. McKenney {
4554102adabSPaul E. McKenney struct list_head *np;
4564102adabSPaul E. McKenney
4574102adabSPaul E. McKenney np = t->rcu_node_entry.next;
4584102adabSPaul E. McKenney if (np == &rnp->blkd_tasks)
4594102adabSPaul E. McKenney np = NULL;
4604102adabSPaul E. McKenney return np;
4614102adabSPaul E. McKenney }
4624102adabSPaul E. McKenney
4634102adabSPaul E. McKenney /*
4648af3a5e7SPaul E. McKenney * Return true if the specified rcu_node structure has tasks that were
4658af3a5e7SPaul E. McKenney * preempted within an RCU read-side critical section.
4668af3a5e7SPaul E. McKenney */
rcu_preempt_has_tasks(struct rcu_node * rnp)4678af3a5e7SPaul E. McKenney static bool rcu_preempt_has_tasks(struct rcu_node *rnp)
4688af3a5e7SPaul E. McKenney {
4698af3a5e7SPaul E. McKenney return !list_empty(&rnp->blkd_tasks);
4708af3a5e7SPaul E. McKenney }
4718af3a5e7SPaul E. McKenney
4728af3a5e7SPaul E. McKenney /*
4733e310098SPaul E. McKenney * Report deferred quiescent states. The deferral time can
4743e310098SPaul E. McKenney * be quite short, for example, in the case of the call from
4753e310098SPaul E. McKenney * rcu_read_unlock_special().
4764102adabSPaul E. McKenney */
47748f8070fSPatrick Wang static notrace void
rcu_preempt_deferred_qs_irqrestore(struct task_struct * t,unsigned long flags)4783e310098SPaul E. McKenney rcu_preempt_deferred_qs_irqrestore(struct task_struct *t, unsigned long flags)
4794102adabSPaul E. McKenney {
480b6a932d1SPaul E. McKenney bool empty_exp;
481b6a932d1SPaul E. McKenney bool empty_norm;
482b6a932d1SPaul E. McKenney bool empty_exp_now;
4834102adabSPaul E. McKenney struct list_head *np;
484abaa93d9SPaul E. McKenney bool drop_boost_mutex = false;
4858203d6d0SPaul E. McKenney struct rcu_data *rdp;
4864102adabSPaul E. McKenney struct rcu_node *rnp;
4871d082fd0SPaul E. McKenney union rcu_special special;
4884102adabSPaul E. McKenney
4894102adabSPaul E. McKenney /*
4908203d6d0SPaul E. McKenney * If RCU core is waiting for this CPU to exit its critical section,
4918203d6d0SPaul E. McKenney * report the fact that it has exited. Because irqs are disabled,
4921d082fd0SPaul E. McKenney * t->rcu_read_unlock_special cannot change.
4934102adabSPaul E. McKenney */
4944102adabSPaul E. McKenney special = t->rcu_read_unlock_special;
495da1df50dSPaul E. McKenney rdp = this_cpu_ptr(&rcu_data);
4966120b72eSFrederic Weisbecker if (!special.s && !rdp->cpu_no_qs.b.exp) {
4973e310098SPaul E. McKenney local_irq_restore(flags);
4983e310098SPaul E. McKenney return;
4993e310098SPaul E. McKenney }
5003717e1e9SLai Jiangshan t->rcu_read_unlock_special.s = 0;
50144bad5b3SPaul E. McKenney if (special.b.need_qs) {
5023d29aaf1SPaul E. McKenney if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD)) {
50390d2efe7SPaul E. McKenney rdp->cpu_no_qs.b.norm = false;
504cfeac397SPaul E. McKenney rcu_report_qs_rdp(rdp);
5053d29aaf1SPaul E. McKenney udelay(rcu_unlock_delay);
5063d29aaf1SPaul E. McKenney } else {
50745975c7dSPaul E. McKenney rcu_qs();
50844bad5b3SPaul E. McKenney }
5093d29aaf1SPaul E. McKenney }
5104102adabSPaul E. McKenney
5118203d6d0SPaul E. McKenney /*
5123e310098SPaul E. McKenney * Respond to a request by an expedited grace period for a
5133e310098SPaul E. McKenney * quiescent state from this CPU. Note that requests from
5143e310098SPaul E. McKenney * tasks are handled when removing the task from the
5153e310098SPaul E. McKenney * blocked-tasks list below.
5168203d6d0SPaul E. McKenney */
5176120b72eSFrederic Weisbecker if (rdp->cpu_no_qs.b.exp)
51863d4c8c9SPaul E. McKenney rcu_report_exp_rdp(rdp);
5198203d6d0SPaul E. McKenney
5204102adabSPaul E. McKenney /* Clean up if blocked during RCU read-side critical section. */
5211d082fd0SPaul E. McKenney if (special.b.blocked) {
5224102adabSPaul E. McKenney
5234102adabSPaul E. McKenney /*
5240a0ba1c9SPaul E. McKenney * Remove this task from the list it blocked on. The task
5258ba9153bSPaul E. McKenney * now remains queued on the rcu_node corresponding to the
5268ba9153bSPaul E. McKenney * CPU it first blocked on, so there is no longer any need
5278ba9153bSPaul E. McKenney * to loop. Retain a WARN_ON_ONCE() out of sheer paranoia.
5284102adabSPaul E. McKenney */
5294102adabSPaul E. McKenney rnp = t->rcu_blocked_node;
5302a67e741SPeter Zijlstra raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
5318ba9153bSPaul E. McKenney WARN_ON_ONCE(rnp != t->rcu_blocked_node);
5325b4c11d5SPaul E. McKenney WARN_ON_ONCE(!rcu_is_leaf_node(rnp));
53374e871acSPaul E. McKenney empty_norm = !rcu_preempt_blocked_readers_cgp(rnp);
534d43a5d32SPaul E. McKenney WARN_ON_ONCE(rnp->completedqs == rnp->gp_seq &&
5354bc8d555SPaul E. McKenney (!empty_norm || rnp->qsmask));
5366c7d7dbfSPaul E. McKenney empty_exp = sync_rcu_exp_done(rnp);
5374102adabSPaul E. McKenney smp_mb(); /* ensure expedited fastpath sees end of RCU c-s. */
5384102adabSPaul E. McKenney np = rcu_next_node_entry(t, rnp);
5394102adabSPaul E. McKenney list_del_init(&t->rcu_node_entry);
5404102adabSPaul E. McKenney t->rcu_blocked_node = NULL;
5414102adabSPaul E. McKenney trace_rcu_unlock_preempted_task(TPS("rcu_preempt"),
542865aa1e0SPaul E. McKenney rnp->gp_seq, t->pid);
5434102adabSPaul E. McKenney if (&t->rcu_node_entry == rnp->gp_tasks)
5446935c398SEric Dumazet WRITE_ONCE(rnp->gp_tasks, np);
5454102adabSPaul E. McKenney if (&t->rcu_node_entry == rnp->exp_tasks)
546314eeb43SPaul E. McKenney WRITE_ONCE(rnp->exp_tasks, np);
547727b705bSPaul E. McKenney if (IS_ENABLED(CONFIG_RCU_BOOST)) {
548727b705bSPaul E. McKenney /* Snapshot ->boost_mtx ownership w/rnp->lock held. */
549830e6accSPeter Zijlstra drop_boost_mutex = rt_mutex_owner(&rnp->boost_mtx.rtmutex) == t;
5502dee9404SPaul E. McKenney if (&t->rcu_node_entry == rnp->boost_tasks)
5515822b812SPaul E. McKenney WRITE_ONCE(rnp->boost_tasks, np);
552727b705bSPaul E. McKenney }
5534102adabSPaul E. McKenney
5544102adabSPaul E. McKenney /*
5554102adabSPaul E. McKenney * If this was the last task on the current list, and if
5564102adabSPaul E. McKenney * we aren't waiting on any CPUs, report the quiescent state.
5574102adabSPaul E. McKenney * Note that rcu_report_unblock_qs_rnp() releases rnp->lock,
5584102adabSPaul E. McKenney * so we must take a snapshot of the expedited state.
5594102adabSPaul E. McKenney */
5606c7d7dbfSPaul E. McKenney empty_exp_now = sync_rcu_exp_done(rnp);
56174e871acSPaul E. McKenney if (!empty_norm && !rcu_preempt_blocked_readers_cgp(rnp)) {
5624102adabSPaul E. McKenney trace_rcu_quiescent_state_report(TPS("preempt_rcu"),
563db023296SPaul E. McKenney rnp->gp_seq,
5644102adabSPaul E. McKenney 0, rnp->qsmask,
5654102adabSPaul E. McKenney rnp->level,
5664102adabSPaul E. McKenney rnp->grplo,
5674102adabSPaul E. McKenney rnp->grphi,
5684102adabSPaul E. McKenney !!rnp->gp_tasks);
569139ad4daSPaul E. McKenney rcu_report_unblock_qs_rnp(rnp, flags);
5704102adabSPaul E. McKenney } else {
57167c583a7SBoqun Feng raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
5724102adabSPaul E. McKenney }
5734102adabSPaul E. McKenney
5744102adabSPaul E. McKenney /*
5754102adabSPaul E. McKenney * If this was the last task on the expedited lists,
5764102adabSPaul E. McKenney * then we need to report up the rcu_node hierarchy.
5774102adabSPaul E. McKenney */
5784102adabSPaul E. McKenney if (!empty_exp && empty_exp_now)
57963d4c8c9SPaul E. McKenney rcu_report_exp_rnp(rnp, true);
58010c53578SPaul E. McKenney
58110c53578SPaul E. McKenney /* Unboost if we were boosted. */
58210c53578SPaul E. McKenney if (IS_ENABLED(CONFIG_RCU_BOOST) && drop_boost_mutex)
58310c53578SPaul E. McKenney rt_mutex_futex_unlock(&rnp->boost_mtx.rtmutex);
5844102adabSPaul E. McKenney } else {
5854102adabSPaul E. McKenney local_irq_restore(flags);
5864102adabSPaul E. McKenney }
5874102adabSPaul E. McKenney }
5884102adabSPaul E. McKenney
5894102adabSPaul E. McKenney /*
5903e310098SPaul E. McKenney * Is a deferred quiescent-state pending, and are we also not in
5913e310098SPaul E. McKenney * an RCU read-side critical section? It is the caller's responsibility
5923e310098SPaul E. McKenney * to ensure it is otherwise safe to report any deferred quiescent
5933e310098SPaul E. McKenney * states. The reason for this is that it is safe to report a
5943e310098SPaul E. McKenney * quiescent state during context switch even though preemption
5953e310098SPaul E. McKenney * is disabled. This function cannot be expected to understand these
5963e310098SPaul E. McKenney * nuances, so the caller must handle them.
5973e310098SPaul E. McKenney */
rcu_preempt_need_deferred_qs(struct task_struct * t)59848f8070fSPatrick Wang static notrace bool rcu_preempt_need_deferred_qs(struct task_struct *t)
5993e310098SPaul E. McKenney {
6006120b72eSFrederic Weisbecker return (__this_cpu_read(rcu_data.cpu_no_qs.b.exp) ||
6013e310098SPaul E. McKenney READ_ONCE(t->rcu_read_unlock_special.s)) &&
6025f5fa7eaSLai Jiangshan rcu_preempt_depth() == 0;
6033e310098SPaul E. McKenney }
6043e310098SPaul E. McKenney
6053e310098SPaul E. McKenney /*
6063e310098SPaul E. McKenney * Report a deferred quiescent state if needed and safe to do so.
6073e310098SPaul E. McKenney * As with rcu_preempt_need_deferred_qs(), "safe" involves only
6083e310098SPaul E. McKenney * not being in an RCU read-side critical section. The caller must
6093e310098SPaul E. McKenney * evaluate safety in terms of interrupt, softirq, and preemption
6103e310098SPaul E. McKenney * disabling.
6113e310098SPaul E. McKenney */
rcu_preempt_deferred_qs(struct task_struct * t)61234bc7b45SPaul E. McKenney notrace void rcu_preempt_deferred_qs(struct task_struct *t)
6133e310098SPaul E. McKenney {
6143e310098SPaul E. McKenney unsigned long flags;
6153e310098SPaul E. McKenney
6163e310098SPaul E. McKenney if (!rcu_preempt_need_deferred_qs(t))
6173e310098SPaul E. McKenney return;
6183e310098SPaul E. McKenney local_irq_save(flags);
6193e310098SPaul E. McKenney rcu_preempt_deferred_qs_irqrestore(t, flags);
6203e310098SPaul E. McKenney }
6213e310098SPaul E. McKenney
6223e310098SPaul E. McKenney /*
6230864f057SPaul E. McKenney * Minimal handler to give the scheduler a chance to re-evaluate.
6240864f057SPaul E. McKenney */
rcu_preempt_deferred_qs_handler(struct irq_work * iwp)6250864f057SPaul E. McKenney static void rcu_preempt_deferred_qs_handler(struct irq_work *iwp)
6260864f057SPaul E. McKenney {
6270864f057SPaul E. McKenney struct rcu_data *rdp;
6280864f057SPaul E. McKenney
6290864f057SPaul E. McKenney rdp = container_of(iwp, struct rcu_data, defer_qs_iw);
6300864f057SPaul E. McKenney rdp->defer_qs_iw_pending = false;
6310864f057SPaul E. McKenney }
6320864f057SPaul E. McKenney
6330864f057SPaul E. McKenney /*
6343e310098SPaul E. McKenney * Handle special cases during rcu_read_unlock(), such as needing to
6353e310098SPaul E. McKenney * notify RCU core processing or task having blocked during the RCU
6363e310098SPaul E. McKenney * read-side critical section.
6373e310098SPaul E. McKenney */
rcu_read_unlock_special(struct task_struct * t)6383e310098SPaul E. McKenney static void rcu_read_unlock_special(struct task_struct *t)
6393e310098SPaul E. McKenney {
6403e310098SPaul E. McKenney unsigned long flags;
64139bbfc62SPaul E. McKenney bool irqs_were_disabled;
6423e310098SPaul E. McKenney bool preempt_bh_were_disabled =
6433e310098SPaul E. McKenney !!(preempt_count() & (PREEMPT_MASK | SOFTIRQ_MASK));
6443e310098SPaul E. McKenney
6453e310098SPaul E. McKenney /* NMI handlers cannot block and cannot safely manipulate state. */
6463e310098SPaul E. McKenney if (in_nmi())
6473e310098SPaul E. McKenney return;
6483e310098SPaul E. McKenney
6493e310098SPaul E. McKenney local_irq_save(flags);
6503e310098SPaul E. McKenney irqs_were_disabled = irqs_disabled_flags(flags);
65105f41571SPaul E. McKenney if (preempt_bh_were_disabled || irqs_were_disabled) {
65239bbfc62SPaul E. McKenney bool expboost; // Expedited GP in flight or possible boosting.
65325102de6SPaul E. McKenney struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
65425102de6SPaul E. McKenney struct rcu_node *rnp = rdp->mynode;
65525102de6SPaul E. McKenney
65639bbfc62SPaul E. McKenney expboost = (t->rcu_blocked_node && READ_ONCE(t->rcu_blocked_node->exp_tasks)) ||
65739bbfc62SPaul E. McKenney (rdp->grpmask & READ_ONCE(rnp->expmask)) ||
658621189a1SZqiang (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD) &&
659621189a1SZqiang ((rdp->grpmask & READ_ONCE(rnp->qsmask)) || t->rcu_blocked_node)) ||
66039bbfc62SPaul E. McKenney (IS_ENABLED(CONFIG_RCU_BOOST) && irqs_were_disabled &&
66139bbfc62SPaul E. McKenney t->rcu_blocked_node);
66223634ebcSPaul E. McKenney // Need to defer quiescent state until everything is enabled.
6632407a64fSChangbin Du if (use_softirq && (in_hardirq() || (expboost && !irqs_were_disabled))) {
664e4453d8aSPaul E. McKenney // Using softirq, safe to awaken, and either the
66539bbfc62SPaul E. McKenney // wakeup is free or there is either an expedited
66639bbfc62SPaul E. McKenney // GP in flight or a potential need to deboost.
6673e310098SPaul E. McKenney raise_softirq_irqoff(RCU_SOFTIRQ);
66805f41571SPaul E. McKenney } else {
66923634ebcSPaul E. McKenney // Enabling BH or preempt does reschedule, so...
67039bbfc62SPaul E. McKenney // Also if no expediting and no possible deboosting,
67139bbfc62SPaul E. McKenney // slow is OK. Plus nohz_full CPUs eventually get
67239bbfc62SPaul E. McKenney // tick enabled.
67305f41571SPaul E. McKenney set_tsk_need_resched(current);
67405f41571SPaul E. McKenney set_preempt_need_resched();
675d143b3d1SPaul E. McKenney if (IS_ENABLED(CONFIG_IRQ_WORK) && irqs_were_disabled &&
67639bbfc62SPaul E. McKenney expboost && !rdp->defer_qs_iw_pending && cpu_online(rdp->cpu)) {
6770864f057SPaul E. McKenney // Get scheduler to re-evaluate and call hooks.
6780864f057SPaul E. McKenney // If !IRQ_WORK, FQS scan will eventually IPI.
679f596e2ceSZqiang if (IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD) &&
680f596e2ceSZqiang IS_ENABLED(CONFIG_PREEMPT_RT))
681f596e2ceSZqiang rdp->defer_qs_iw = IRQ_WORK_INIT_HARD(
682f596e2ceSZqiang rcu_preempt_deferred_qs_handler);
683f596e2ceSZqiang else
684f596e2ceSZqiang init_irq_work(&rdp->defer_qs_iw,
685f596e2ceSZqiang rcu_preempt_deferred_qs_handler);
6860864f057SPaul E. McKenney rdp->defer_qs_iw_pending = true;
6870864f057SPaul E. McKenney irq_work_queue_on(&rdp->defer_qs_iw, rdp->cpu);
6880864f057SPaul E. McKenney }
68905f41571SPaul E. McKenney }
6903e310098SPaul E. McKenney local_irq_restore(flags);
6913e310098SPaul E. McKenney return;
6923e310098SPaul E. McKenney }
6933e310098SPaul E. McKenney rcu_preempt_deferred_qs_irqrestore(t, flags);
6943e310098SPaul E. McKenney }
6953e310098SPaul E. McKenney
6963e310098SPaul E. McKenney /*
6974102adabSPaul E. McKenney * Check that the list of blocked tasks for the newly completed grace
6984102adabSPaul E. McKenney * period is in fact empty. It is a serious bug to complete a grace
6994102adabSPaul E. McKenney * period that still has RCU readers blocked! This function must be
70003bd2983SPaul E. McKenney * invoked -before- updating this rnp's ->gp_seq.
7014102adabSPaul E. McKenney *
7024102adabSPaul E. McKenney * Also, if there are blocked tasks on the list, they automatically
7034102adabSPaul E. McKenney * block the newly created grace period, so set up ->gp_tasks accordingly.
7044102adabSPaul E. McKenney */
rcu_preempt_check_blocked_tasks(struct rcu_node * rnp)70581ab59a3SPaul E. McKenney static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp)
7064102adabSPaul E. McKenney {
707c5ebe66cSPaul E. McKenney struct task_struct *t;
708c5ebe66cSPaul E. McKenney
709ea9b0c8aSPaul E. McKenney RCU_LOCKDEP_WARN(preemptible(), "rcu_preempt_check_blocked_tasks() invoked with preemption enabled!!!\n");
71003bd2983SPaul E. McKenney raw_lockdep_assert_held_rcu_node(rnp);
7114bc8d555SPaul E. McKenney if (WARN_ON_ONCE(rcu_preempt_blocked_readers_cgp(rnp)))
71281ab59a3SPaul E. McKenney dump_blkd_tasks(rnp, 10);
7130b107d24SPaul E. McKenney if (rcu_preempt_has_tasks(rnp) &&
7140b107d24SPaul E. McKenney (rnp->qsmaskinit || rnp->wait_blkd_tasks)) {
7156935c398SEric Dumazet WRITE_ONCE(rnp->gp_tasks, rnp->blkd_tasks.next);
716c5ebe66cSPaul E. McKenney t = container_of(rnp->gp_tasks, struct task_struct,
717c5ebe66cSPaul E. McKenney rcu_node_entry);
718c5ebe66cSPaul E. McKenney trace_rcu_unlock_preempted_task(TPS("rcu_preempt-GPS"),
719865aa1e0SPaul E. McKenney rnp->gp_seq, t->pid);
720c5ebe66cSPaul E. McKenney }
7214102adabSPaul E. McKenney WARN_ON_ONCE(rnp->qsmask);
7224102adabSPaul E. McKenney }
7234102adabSPaul E. McKenney
7244102adabSPaul E. McKenney /*
725c98cac60SPaul E. McKenney * Check for a quiescent state from the current CPU, including voluntary
726c98cac60SPaul E. McKenney * context switches for Tasks RCU. When a task blocks, the task is
727c98cac60SPaul E. McKenney * recorded in the corresponding CPU's rcu_node structure, which is checked
728c98cac60SPaul E. McKenney * elsewhere, hence this function need only check for quiescent states
729c98cac60SPaul E. McKenney * related to the current CPU, not to those related to tasks.
7304102adabSPaul E. McKenney */
rcu_flavor_sched_clock_irq(int user)731c98cac60SPaul E. McKenney static void rcu_flavor_sched_clock_irq(int user)
7324102adabSPaul E. McKenney {
7334102adabSPaul E. McKenney struct task_struct *t = current;
7344102adabSPaul E. McKenney
735a649d25dSPaul E. McKenney lockdep_assert_irqs_disabled();
73677339e61SLai Jiangshan if (rcu_preempt_depth() > 0 ||
7373e310098SPaul E. McKenney (preempt_count() & (PREEMPT_MASK | SOFTIRQ_MASK))) {
7383e310098SPaul E. McKenney /* No QS, force context switch if deferred. */
739fced9c8cSPaul E. McKenney if (rcu_preempt_need_deferred_qs(t)) {
740fced9c8cSPaul E. McKenney set_tsk_need_resched(t);
741fced9c8cSPaul E. McKenney set_preempt_need_resched();
742fced9c8cSPaul E. McKenney }
7433e310098SPaul E. McKenney } else if (rcu_preempt_need_deferred_qs(t)) {
7443e310098SPaul E. McKenney rcu_preempt_deferred_qs(t); /* Report deferred QS. */
7453e310098SPaul E. McKenney return;
7465f5fa7eaSLai Jiangshan } else if (!WARN_ON_ONCE(rcu_preempt_depth())) {
74745975c7dSPaul E. McKenney rcu_qs(); /* Report immediate QS. */
7484102adabSPaul E. McKenney return;
7494102adabSPaul E. McKenney }
7503e310098SPaul E. McKenney
7513e310098SPaul E. McKenney /* If GP is oldish, ask for help from rcu_read_unlock_special(). */
75277339e61SLai Jiangshan if (rcu_preempt_depth() > 0 &&
7532280ee5aSPaul E. McKenney __this_cpu_read(rcu_data.core_needs_qs) &&
7542280ee5aSPaul E. McKenney __this_cpu_read(rcu_data.cpu_no_qs.b.norm) &&
75515651201SPaul E. McKenney !t->rcu_read_unlock_special.b.need_qs &&
756564a9ae6SPaul E. McKenney time_after(jiffies, rcu_state.gp_start + HZ))
7571d082fd0SPaul E. McKenney t->rcu_read_unlock_special.b.need_qs = true;
7584102adabSPaul E. McKenney }
7594102adabSPaul E. McKenney
7604102adabSPaul E. McKenney /*
7614102adabSPaul E. McKenney * Check for a task exiting while in a preemptible-RCU read-side
762884157ceSPaul E. McKenney * critical section, clean up if so. No need to issue warnings, as
763884157ceSPaul E. McKenney * debug_check_no_locks_held() already does this if lockdep is enabled.
764884157ceSPaul E. McKenney * Besides, if this function does anything other than just immediately
765884157ceSPaul E. McKenney * return, there was a bug of some sort. Spewing warnings from this
766884157ceSPaul E. McKenney * function is like as not to simply obscure important prior warnings.
7674102adabSPaul E. McKenney */
exit_rcu(void)7684102adabSPaul E. McKenney void exit_rcu(void)
7694102adabSPaul E. McKenney {
7704102adabSPaul E. McKenney struct task_struct *t = current;
7714102adabSPaul E. McKenney
772884157ceSPaul E. McKenney if (unlikely(!list_empty(¤t->rcu_node_entry))) {
77377339e61SLai Jiangshan rcu_preempt_depth_set(1);
7744102adabSPaul E. McKenney barrier();
775add0d37bSPaul E. McKenney WRITE_ONCE(t->rcu_read_unlock_special.b.blocked, true);
77677339e61SLai Jiangshan } else if (unlikely(rcu_preempt_depth())) {
77777339e61SLai Jiangshan rcu_preempt_depth_set(1);
778884157ceSPaul E. McKenney } else {
779884157ceSPaul E. McKenney return;
780884157ceSPaul E. McKenney }
7814102adabSPaul E. McKenney __rcu_read_unlock();
7823e310098SPaul E. McKenney rcu_preempt_deferred_qs(current);
7834102adabSPaul E. McKenney }
7844102adabSPaul E. McKenney
7854bc8d555SPaul E. McKenney /*
7864bc8d555SPaul E. McKenney * Dump the blocked-tasks state, but limit the list dump to the
7874bc8d555SPaul E. McKenney * specified number of elements.
7884bc8d555SPaul E. McKenney */
78957738942SPaul E. McKenney static void
dump_blkd_tasks(struct rcu_node * rnp,int ncheck)79081ab59a3SPaul E. McKenney dump_blkd_tasks(struct rcu_node *rnp, int ncheck)
7914bc8d555SPaul E. McKenney {
79257738942SPaul E. McKenney int cpu;
7934bc8d555SPaul E. McKenney int i;
7944bc8d555SPaul E. McKenney struct list_head *lhp;
79557738942SPaul E. McKenney struct rcu_data *rdp;
796ff3cee39SPaul E. McKenney struct rcu_node *rnp1;
7974bc8d555SPaul E. McKenney
798ce11fae8SBoqun Feng raw_lockdep_assert_held_rcu_node(rnp);
799ff3cee39SPaul E. McKenney pr_info("%s: grp: %d-%d level: %d ->gp_seq %ld ->completedqs %ld\n",
80077cfc7bfSPaul E. McKenney __func__, rnp->grplo, rnp->grphi, rnp->level,
8018ff37290SPaul E. McKenney (long)READ_ONCE(rnp->gp_seq), (long)rnp->completedqs);
802ff3cee39SPaul E. McKenney for (rnp1 = rnp; rnp1; rnp1 = rnp1->parent)
803ff3cee39SPaul E. McKenney pr_info("%s: %d:%d ->qsmask %#lx ->qsmaskinit %#lx ->qsmaskinitnext %#lx\n",
804ff3cee39SPaul E. McKenney __func__, rnp1->grplo, rnp1->grphi, rnp1->qsmask, rnp1->qsmaskinit, rnp1->qsmaskinitnext);
80577cfc7bfSPaul E. McKenney pr_info("%s: ->gp_tasks %p ->boost_tasks %p ->exp_tasks %p\n",
806065a6db1SPaul E. McKenney __func__, READ_ONCE(rnp->gp_tasks), data_race(rnp->boost_tasks),
807314eeb43SPaul E. McKenney READ_ONCE(rnp->exp_tasks));
80877cfc7bfSPaul E. McKenney pr_info("%s: ->blkd_tasks", __func__);
8094bc8d555SPaul E. McKenney i = 0;
8104bc8d555SPaul E. McKenney list_for_each(lhp, &rnp->blkd_tasks) {
8114bc8d555SPaul E. McKenney pr_cont(" %p", lhp);
812cd6d17b4SNeeraj Upadhyay if (++i >= ncheck)
8134bc8d555SPaul E. McKenney break;
8144bc8d555SPaul E. McKenney }
8154bc8d555SPaul E. McKenney pr_cont("\n");
81657738942SPaul E. McKenney for (cpu = rnp->grplo; cpu <= rnp->grphi; cpu++) {
817da1df50dSPaul E. McKenney rdp = per_cpu_ptr(&rcu_data, cpu);
81857738942SPaul E. McKenney pr_info("\t%d: %c online: %ld(%d) offline: %ld(%d)\n",
8195ae0f1b5SPaul E. McKenney cpu, ".o"[rcu_rdp_cpu_online(rdp)],
820ae2b217aSPaul E. McKenney (long)rdp->rcu_onl_gp_seq, rdp->rcu_onl_gp_state,
821ae2b217aSPaul E. McKenney (long)rdp->rcu_ofl_gp_seq, rdp->rcu_ofl_gp_state);
82257738942SPaul E. McKenney }
8234bc8d555SPaul E. McKenney }
8244bc8d555SPaul E. McKenney
82528f6569aSPranith Kumar #else /* #ifdef CONFIG_PREEMPT_RCU */
8264102adabSPaul E. McKenney
8274102adabSPaul E. McKenney /*
828aa40c138SPaul E. McKenney * If strict grace periods are enabled, and if the calling
829aa40c138SPaul E. McKenney * __rcu_read_unlock() marks the beginning of a quiescent state, immediately
830aa40c138SPaul E. McKenney * report that quiescent state and, if requested, spin for a bit.
831aa40c138SPaul E. McKenney */
rcu_read_unlock_strict(void)832aa40c138SPaul E. McKenney void rcu_read_unlock_strict(void)
833aa40c138SPaul E. McKenney {
834aa40c138SPaul E. McKenney struct rcu_data *rdp;
835aa40c138SPaul E. McKenney
836fcf0e25aSAnkur Arora if (irqs_disabled() || in_atomic_preempt_off() || !rcu_state.gp_kthread)
837aa40c138SPaul E. McKenney return;
838fcf0e25aSAnkur Arora
839fcf0e25aSAnkur Arora /*
840fcf0e25aSAnkur Arora * rcu_report_qs_rdp() can only be invoked with a stable rdp and
841fcf0e25aSAnkur Arora * from the local CPU.
842fcf0e25aSAnkur Arora *
843fcf0e25aSAnkur Arora * The in_atomic_preempt_off() check ensures that we come here holding
844fcf0e25aSAnkur Arora * the last preempt_count (which will get dropped once we return to
845fcf0e25aSAnkur Arora * __rcu_read_unlock().
846fcf0e25aSAnkur Arora */
847aa40c138SPaul E. McKenney rdp = this_cpu_ptr(&rcu_data);
8486d60ea03SZqiang rdp->cpu_no_qs.b.norm = false;
849cfeac397SPaul E. McKenney rcu_report_qs_rdp(rdp);
850aa40c138SPaul E. McKenney udelay(rcu_unlock_delay);
851aa40c138SPaul E. McKenney }
852aa40c138SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_read_unlock_strict);
853aa40c138SPaul E. McKenney
854aa40c138SPaul E. McKenney /*
8554102adabSPaul E. McKenney * Tell them what RCU they are running.
8564102adabSPaul E. McKenney */
rcu_bootup_announce(void)8574102adabSPaul E. McKenney static void __init rcu_bootup_announce(void)
8584102adabSPaul E. McKenney {
8594102adabSPaul E. McKenney pr_info("Hierarchical RCU implementation.\n");
8604102adabSPaul E. McKenney rcu_bootup_announce_oddness();
8614102adabSPaul E. McKenney }
8624102adabSPaul E. McKenney
86345975c7dSPaul E. McKenney /*
86490326f05SSebastian Andrzej Siewior * Note a quiescent state for PREEMPTION=n. Because we do not need to know
86545975c7dSPaul E. McKenney * how many quiescent states passed, just if there was at least one since
86645975c7dSPaul E. McKenney * the start of the grace period, this just sets a flag. The caller must
86745975c7dSPaul E. McKenney * have disabled preemption.
86845975c7dSPaul E. McKenney */
rcu_qs(void)86945975c7dSPaul E. McKenney static void rcu_qs(void)
870d28139c4SPaul E. McKenney {
87145975c7dSPaul E. McKenney RCU_LOCKDEP_WARN(preemptible(), "rcu_qs() invoked with preemption enabled!!!");
87245975c7dSPaul E. McKenney if (!__this_cpu_read(rcu_data.cpu_no_qs.s))
87345975c7dSPaul E. McKenney return;
87445975c7dSPaul E. McKenney trace_rcu_grace_period(TPS("rcu_sched"),
87545975c7dSPaul E. McKenney __this_cpu_read(rcu_data.gp_seq), TPS("cpuqs"));
87645975c7dSPaul E. McKenney __this_cpu_write(rcu_data.cpu_no_qs.b.norm, false);
8776e16b0f7SFrederic Weisbecker if (__this_cpu_read(rcu_data.cpu_no_qs.b.exp))
87863d4c8c9SPaul E. McKenney rcu_report_exp_rdp(this_cpu_ptr(&rcu_data));
879d28139c4SPaul E. McKenney }
880d28139c4SPaul E. McKenney
8814102adabSPaul E. McKenney /*
882395a2f09SPaul E. McKenney * Register an urgently needed quiescent state. If there is an
88332a9f26eSValentin Schneider * emergency, invoke rcu_momentary_eqs() to do a heavy-weight
884395a2f09SPaul E. McKenney * dyntick-idle quiescent state visible to other CPUs, which will in
885395a2f09SPaul E. McKenney * some cases serve for expedited as well as normal grace periods.
886395a2f09SPaul E. McKenney * Either way, register a lightweight quiescent state.
887395a2f09SPaul E. McKenney */
rcu_all_qs(void)888395a2f09SPaul E. McKenney void rcu_all_qs(void)
889395a2f09SPaul E. McKenney {
890395a2f09SPaul E. McKenney unsigned long flags;
891395a2f09SPaul E. McKenney
8922dba13f0SPaul E. McKenney if (!raw_cpu_read(rcu_data.rcu_urgent_qs))
893395a2f09SPaul E. McKenney return;
894089254fdSPaul E. McKenney preempt_disable(); // For CONFIG_PREEMPT_COUNT=y kernels
895395a2f09SPaul E. McKenney /* Load rcu_urgent_qs before other flags. */
8962dba13f0SPaul E. McKenney if (!smp_load_acquire(this_cpu_ptr(&rcu_data.rcu_urgent_qs))) {
897395a2f09SPaul E. McKenney preempt_enable();
898395a2f09SPaul E. McKenney return;
899395a2f09SPaul E. McKenney }
9002dba13f0SPaul E. McKenney this_cpu_write(rcu_data.rcu_urgent_qs, false);
9012dba13f0SPaul E. McKenney if (unlikely(raw_cpu_read(rcu_data.rcu_need_heavy_qs))) {
902395a2f09SPaul E. McKenney local_irq_save(flags);
90332a9f26eSValentin Schneider rcu_momentary_eqs();
904395a2f09SPaul E. McKenney local_irq_restore(flags);
905395a2f09SPaul E. McKenney }
906395a2f09SPaul E. McKenney rcu_qs();
907395a2f09SPaul E. McKenney preempt_enable();
908395a2f09SPaul E. McKenney }
909395a2f09SPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_all_qs);
910395a2f09SPaul E. McKenney
911395a2f09SPaul E. McKenney /*
91290326f05SSebastian Andrzej Siewior * Note a PREEMPTION=n context switch. The caller must have disabled interrupts.
9134102adabSPaul E. McKenney */
rcu_note_context_switch(bool preempt)91445975c7dSPaul E. McKenney void rcu_note_context_switch(bool preempt)
9154102adabSPaul E. McKenney {
91645975c7dSPaul E. McKenney trace_rcu_utilization(TPS("Start context switch"));
91745975c7dSPaul E. McKenney rcu_qs();
91845975c7dSPaul E. McKenney /* Load rcu_urgent_qs before other flags. */
9192dba13f0SPaul E. McKenney if (!smp_load_acquire(this_cpu_ptr(&rcu_data.rcu_urgent_qs)))
92045975c7dSPaul E. McKenney goto out;
9212dba13f0SPaul E. McKenney this_cpu_write(rcu_data.rcu_urgent_qs, false);
9222dba13f0SPaul E. McKenney if (unlikely(raw_cpu_read(rcu_data.rcu_need_heavy_qs)))
92332a9f26eSValentin Schneider rcu_momentary_eqs();
92445975c7dSPaul E. McKenney out:
9256a694411SPaul E. McKenney rcu_tasks_qs(current, preempt);
92645975c7dSPaul E. McKenney trace_rcu_utilization(TPS("End context switch"));
9274102adabSPaul E. McKenney }
92845975c7dSPaul E. McKenney EXPORT_SYMBOL_GPL(rcu_note_context_switch);
9294102adabSPaul E. McKenney
9304102adabSPaul E. McKenney /*
9314102adabSPaul E. McKenney * Because preemptible RCU does not exist, there are never any preempted
9324102adabSPaul E. McKenney * RCU readers.
9334102adabSPaul E. McKenney */
rcu_preempt_blocked_readers_cgp(struct rcu_node * rnp)9344102adabSPaul E. McKenney static int rcu_preempt_blocked_readers_cgp(struct rcu_node *rnp)
9354102adabSPaul E. McKenney {
9364102adabSPaul E. McKenney return 0;
9374102adabSPaul E. McKenney }
9384102adabSPaul E. McKenney
9398af3a5e7SPaul E. McKenney /*
9408af3a5e7SPaul E. McKenney * Because there is no preemptible RCU, there can be no readers blocked.
9418af3a5e7SPaul E. McKenney */
rcu_preempt_has_tasks(struct rcu_node * rnp)9428af3a5e7SPaul E. McKenney static bool rcu_preempt_has_tasks(struct rcu_node *rnp)
9434102adabSPaul E. McKenney {
9448af3a5e7SPaul E. McKenney return false;
9454102adabSPaul E. McKenney }
9464102adabSPaul E. McKenney
9474102adabSPaul E. McKenney /*
9483e310098SPaul E. McKenney * Because there is no preemptible RCU, there can be no deferred quiescent
9493e310098SPaul E. McKenney * states.
9503e310098SPaul E. McKenney */
rcu_preempt_need_deferred_qs(struct task_struct * t)95148f8070fSPatrick Wang static notrace bool rcu_preempt_need_deferred_qs(struct task_struct *t)
9523e310098SPaul E. McKenney {
9533e310098SPaul E. McKenney return false;
9543e310098SPaul E. McKenney }
955790da248SPaul E. McKenney
956bca4fa8cSZqiang // Except that we do need to respond to a request by an expedited
957bca4fa8cSZqiang // grace period for a quiescent state from this CPU. Note that in
958bca4fa8cSZqiang // non-preemptible kernels, there can be no context switches within RCU
959bca4fa8cSZqiang // read-side critical sections, which in turn means that the leaf rcu_node
960bca4fa8cSZqiang // structure's blocked-tasks list is always empty. is therefore no need to
961bca4fa8cSZqiang // actually check it. Instead, a quiescent state from this CPU suffices,
962bca4fa8cSZqiang // and this function is only called from such a quiescent state.
rcu_preempt_deferred_qs(struct task_struct * t)96334bc7b45SPaul E. McKenney notrace void rcu_preempt_deferred_qs(struct task_struct *t)
964790da248SPaul E. McKenney {
965790da248SPaul E. McKenney struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
966790da248SPaul E. McKenney
9679146eb25SPaul E. McKenney if (READ_ONCE(rdp->cpu_no_qs.b.exp))
968790da248SPaul E. McKenney rcu_report_exp_rdp(rdp);
969790da248SPaul E. McKenney }
9703e310098SPaul E. McKenney
9713e310098SPaul E. McKenney /*
9724102adabSPaul E. McKenney * Because there is no preemptible RCU, there can be no readers blocked,
9734102adabSPaul E. McKenney * so there is no need to check for blocked tasks. So check only for
9744102adabSPaul E. McKenney * bogus qsmask values.
9754102adabSPaul E. McKenney */
rcu_preempt_check_blocked_tasks(struct rcu_node * rnp)97681ab59a3SPaul E. McKenney static void rcu_preempt_check_blocked_tasks(struct rcu_node *rnp)
9774102adabSPaul E. McKenney {
9784102adabSPaul E. McKenney WARN_ON_ONCE(rnp->qsmask);
9794102adabSPaul E. McKenney }
9804102adabSPaul E. McKenney
9814102adabSPaul E. McKenney /*
982c98cac60SPaul E. McKenney * Check to see if this CPU is in a non-context-switch quiescent state,
983c98cac60SPaul E. McKenney * namely user mode and idle loop.
9844102adabSPaul E. McKenney */
rcu_flavor_sched_clock_irq(int user)985c98cac60SPaul E. McKenney static void rcu_flavor_sched_clock_irq(int user)
9864102adabSPaul E. McKenney {
987*83b28cfeSAnkur Arora if (user || rcu_is_cpu_rrupt_from_idle() ||
988*83b28cfeSAnkur Arora (IS_ENABLED(CONFIG_PREEMPT_COUNT) &&
989*83b28cfeSAnkur Arora (preempt_count() == HARDIRQ_OFFSET))) {
9904102adabSPaul E. McKenney
9914102adabSPaul E. McKenney /*
99245975c7dSPaul E. McKenney * Get here if this CPU took its interrupt from user
993*83b28cfeSAnkur Arora * mode, from the idle loop without this being a nested
994*83b28cfeSAnkur Arora * interrupt, or while not holding the task preempt count
995*83b28cfeSAnkur Arora * (with PREEMPT_COUNT=y). In this case, the CPU is in a
996*83b28cfeSAnkur Arora * quiescent state, so note it.
99745975c7dSPaul E. McKenney *
99845975c7dSPaul E. McKenney * No memory barrier is required here because rcu_qs()
99945975c7dSPaul E. McKenney * references only CPU-local variables that other CPUs
100045975c7dSPaul E. McKenney * neither access nor modify, at least not while the
100145975c7dSPaul E. McKenney * corresponding CPU is online.
10024102adabSPaul E. McKenney */
100345975c7dSPaul E. McKenney rcu_qs();
10044102adabSPaul E. McKenney }
100545975c7dSPaul E. McKenney }
100645975c7dSPaul E. McKenney
10074102adabSPaul E. McKenney /*
10084102adabSPaul E. McKenney * Because preemptible RCU does not exist, tasks cannot possibly exit
10094102adabSPaul E. McKenney * while in preemptible RCU read-side critical sections.
10104102adabSPaul E. McKenney */
exit_rcu(void)10114102adabSPaul E. McKenney void exit_rcu(void)
10124102adabSPaul E. McKenney {
10134102adabSPaul E. McKenney }
10144102adabSPaul E. McKenney
10154bc8d555SPaul E. McKenney /*
10164bc8d555SPaul E. McKenney * Dump the guaranteed-empty blocked-tasks state. Trust but verify.
10174bc8d555SPaul E. McKenney */
101857738942SPaul E. McKenney static void
dump_blkd_tasks(struct rcu_node * rnp,int ncheck)101981ab59a3SPaul E. McKenney dump_blkd_tasks(struct rcu_node *rnp, int ncheck)
10204bc8d555SPaul E. McKenney {
10214bc8d555SPaul E. McKenney WARN_ON_ONCE(!list_empty(&rnp->blkd_tasks));
10224bc8d555SPaul E. McKenney }
10234bc8d555SPaul E. McKenney
102428f6569aSPranith Kumar #endif /* #else #ifdef CONFIG_PREEMPT_RCU */
10254102adabSPaul E. McKenney
10264102adabSPaul E. McKenney /*
102748d07c04SSebastian Andrzej Siewior * If boosting, set rcuc kthreads to realtime priority.
10284102adabSPaul E. McKenney */
rcu_cpu_kthread_setup(unsigned int cpu)102948d07c04SSebastian Andrzej Siewior static void rcu_cpu_kthread_setup(unsigned int cpu)
103048d07c04SSebastian Andrzej Siewior {
1031c9515875SZqiang struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
103248d07c04SSebastian Andrzej Siewior #ifdef CONFIG_RCU_BOOST
103348d07c04SSebastian Andrzej Siewior struct sched_param sp;
103448d07c04SSebastian Andrzej Siewior
103548d07c04SSebastian Andrzej Siewior sp.sched_priority = kthread_prio;
103648d07c04SSebastian Andrzej Siewior sched_setscheduler_nocheck(current, SCHED_FIFO, &sp);
103748d07c04SSebastian Andrzej Siewior #endif /* #ifdef CONFIG_RCU_BOOST */
1038c9515875SZqiang
1039c9515875SZqiang WRITE_ONCE(rdp->rcuc_activity, jiffies);
10404102adabSPaul E. McKenney }
10414102adabSPaul E. McKenney
rcu_is_callbacks_nocb_kthread(struct rcu_data * rdp)104251038506SZqiang static bool rcu_is_callbacks_nocb_kthread(struct rcu_data *rdp)
104351038506SZqiang {
104451038506SZqiang #ifdef CONFIG_RCU_NOCB_CPU
104551038506SZqiang return rdp->nocb_cb_kthread == current;
104651038506SZqiang #else
104751038506SZqiang return false;
104851038506SZqiang #endif
104951038506SZqiang }
105051038506SZqiang
105151038506SZqiang /*
105251038506SZqiang * Is the current CPU running the RCU-callbacks kthread?
105351038506SZqiang * Caller must have preemption disabled.
105451038506SZqiang */
rcu_is_callbacks_kthread(struct rcu_data * rdp)105551038506SZqiang static bool rcu_is_callbacks_kthread(struct rcu_data *rdp)
105651038506SZqiang {
105751038506SZqiang return rdp->rcu_cpu_kthread_task == current ||
105851038506SZqiang rcu_is_callbacks_nocb_kthread(rdp);
105951038506SZqiang }
106051038506SZqiang
106148d07c04SSebastian Andrzej Siewior #ifdef CONFIG_RCU_BOOST
106248d07c04SSebastian Andrzej Siewior
10634102adabSPaul E. McKenney /*
10644102adabSPaul E. McKenney * Carry out RCU priority boosting on the task indicated by ->exp_tasks
10654102adabSPaul E. McKenney * or ->boost_tasks, advancing the pointer to the next task in the
10664102adabSPaul E. McKenney * ->blkd_tasks list.
10674102adabSPaul E. McKenney *
10684102adabSPaul E. McKenney * Note that irqs must be enabled: boosting the task can block.
10694102adabSPaul E. McKenney * Returns 1 if there are more tasks needing to be boosted.
10704102adabSPaul E. McKenney */
rcu_boost(struct rcu_node * rnp)10714102adabSPaul E. McKenney static int rcu_boost(struct rcu_node *rnp)
10724102adabSPaul E. McKenney {
10734102adabSPaul E. McKenney unsigned long flags;
10744102adabSPaul E. McKenney struct task_struct *t;
10754102adabSPaul E. McKenney struct list_head *tb;
10764102adabSPaul E. McKenney
10777d0ae808SPaul E. McKenney if (READ_ONCE(rnp->exp_tasks) == NULL &&
10787d0ae808SPaul E. McKenney READ_ONCE(rnp->boost_tasks) == NULL)
10794102adabSPaul E. McKenney return 0; /* Nothing left to boost. */
10804102adabSPaul E. McKenney
10812a67e741SPeter Zijlstra raw_spin_lock_irqsave_rcu_node(rnp, flags);
10824102adabSPaul E. McKenney
10834102adabSPaul E. McKenney /*
10844102adabSPaul E. McKenney * Recheck under the lock: all tasks in need of boosting
10854102adabSPaul E. McKenney * might exit their RCU read-side critical sections on their own.
10864102adabSPaul E. McKenney */
10874102adabSPaul E. McKenney if (rnp->exp_tasks == NULL && rnp->boost_tasks == NULL) {
108867c583a7SBoqun Feng raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
10894102adabSPaul E. McKenney return 0;
10904102adabSPaul E. McKenney }
10914102adabSPaul E. McKenney
10924102adabSPaul E. McKenney /*
10934102adabSPaul E. McKenney * Preferentially boost tasks blocking expedited grace periods.
10944102adabSPaul E. McKenney * This cannot starve the normal grace periods because a second
10954102adabSPaul E. McKenney * expedited grace period must boost all blocked tasks, including
10964102adabSPaul E. McKenney * those blocking the pre-existing normal grace period.
10974102adabSPaul E. McKenney */
1098bec06785SPaul E. McKenney if (rnp->exp_tasks != NULL)
10994102adabSPaul E. McKenney tb = rnp->exp_tasks;
1100bec06785SPaul E. McKenney else
11014102adabSPaul E. McKenney tb = rnp->boost_tasks;
11024102adabSPaul E. McKenney
11034102adabSPaul E. McKenney /*
11044102adabSPaul E. McKenney * We boost task t by manufacturing an rt_mutex that appears to
11054102adabSPaul E. McKenney * be held by task t. We leave a pointer to that rt_mutex where
11064102adabSPaul E. McKenney * task t can find it, and task t will release the mutex when it
11074102adabSPaul E. McKenney * exits its outermost RCU read-side critical section. Then
11084102adabSPaul E. McKenney * simply acquiring this artificial rt_mutex will boost task
11094102adabSPaul E. McKenney * t's priority. (Thanks to tglx for suggesting this approach!)
11104102adabSPaul E. McKenney *
11114102adabSPaul E. McKenney * Note that task t must acquire rnp->lock to remove itself from
11124102adabSPaul E. McKenney * the ->blkd_tasks list, which it will do from exit() if from
11134102adabSPaul E. McKenney * nowhere else. We therefore are guaranteed that task t will
11144102adabSPaul E. McKenney * stay around at least until we drop rnp->lock. Note that
11154102adabSPaul E. McKenney * rnp->lock also resolves races between our priority boosting
11164102adabSPaul E. McKenney * and task t's exiting its outermost RCU read-side critical
11174102adabSPaul E. McKenney * section.
11184102adabSPaul E. McKenney */
11194102adabSPaul E. McKenney t = container_of(tb, struct task_struct, rcu_node_entry);
1120830e6accSPeter Zijlstra rt_mutex_init_proxy_locked(&rnp->boost_mtx.rtmutex, t);
112167c583a7SBoqun Feng raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
1122abaa93d9SPaul E. McKenney /* Lock only for side effect: boosts task t's priority. */
1123abaa93d9SPaul E. McKenney rt_mutex_lock(&rnp->boost_mtx);
1124abaa93d9SPaul E. McKenney rt_mutex_unlock(&rnp->boost_mtx); /* Then keep lockdep happy. */
1125396eba65SPaul E. McKenney rnp->n_boosts++;
11264102adabSPaul E. McKenney
11277d0ae808SPaul E. McKenney return READ_ONCE(rnp->exp_tasks) != NULL ||
11287d0ae808SPaul E. McKenney READ_ONCE(rnp->boost_tasks) != NULL;
11294102adabSPaul E. McKenney }
11304102adabSPaul E. McKenney
11314102adabSPaul E. McKenney /*
1132bc17ea10SPaul E. McKenney * Priority-boosting kthread, one per leaf rcu_node.
11334102adabSPaul E. McKenney */
rcu_boost_kthread(void * arg)11344102adabSPaul E. McKenney static int rcu_boost_kthread(void *arg)
11354102adabSPaul E. McKenney {
11364102adabSPaul E. McKenney struct rcu_node *rnp = (struct rcu_node *)arg;
11374102adabSPaul E. McKenney int spincnt = 0;
11384102adabSPaul E. McKenney int more2boost;
11394102adabSPaul E. McKenney
11404102adabSPaul E. McKenney trace_rcu_utilization(TPS("Start boost kthread@init"));
11414102adabSPaul E. McKenney for (;;) {
11423ca3b0e2SPaul E. McKenney WRITE_ONCE(rnp->boost_kthread_status, RCU_KTHREAD_WAITING);
11434102adabSPaul E. McKenney trace_rcu_utilization(TPS("End boost kthread@rcu_wait"));
1144065a6db1SPaul E. McKenney rcu_wait(READ_ONCE(rnp->boost_tasks) ||
1145065a6db1SPaul E. McKenney READ_ONCE(rnp->exp_tasks));
11464102adabSPaul E. McKenney trace_rcu_utilization(TPS("Start boost kthread@rcu_wait"));
11473ca3b0e2SPaul E. McKenney WRITE_ONCE(rnp->boost_kthread_status, RCU_KTHREAD_RUNNING);
11484102adabSPaul E. McKenney more2boost = rcu_boost(rnp);
11494102adabSPaul E. McKenney if (more2boost)
11504102adabSPaul E. McKenney spincnt++;
11514102adabSPaul E. McKenney else
11524102adabSPaul E. McKenney spincnt = 0;
11534102adabSPaul E. McKenney if (spincnt > 10) {
11543ca3b0e2SPaul E. McKenney WRITE_ONCE(rnp->boost_kthread_status, RCU_KTHREAD_YIELDING);
11554102adabSPaul E. McKenney trace_rcu_utilization(TPS("End boost kthread@rcu_yield"));
1156a9352f72SPaul E. McKenney schedule_timeout_idle(2);
11574102adabSPaul E. McKenney trace_rcu_utilization(TPS("Start boost kthread@rcu_yield"));
11584102adabSPaul E. McKenney spincnt = 0;
11594102adabSPaul E. McKenney }
11604102adabSPaul E. McKenney }
11614102adabSPaul E. McKenney /* NOTREACHED */
11624102adabSPaul E. McKenney trace_rcu_utilization(TPS("End boost kthread@notreached"));
11634102adabSPaul E. McKenney return 0;
11644102adabSPaul E. McKenney }
11654102adabSPaul E. McKenney
11664102adabSPaul E. McKenney /*
11674102adabSPaul E. McKenney * Check to see if it is time to start boosting RCU readers that are
11684102adabSPaul E. McKenney * blocking the current grace period, and, if so, tell the per-rcu_node
11694102adabSPaul E. McKenney * kthread to start boosting them. If there is an expedited grace
11704102adabSPaul E. McKenney * period in progress, it is always time to boost.
11714102adabSPaul E. McKenney *
11724102adabSPaul E. McKenney * The caller must hold rnp->lock, which this function releases.
11734102adabSPaul E. McKenney * The ->boost_kthread_task is immortal, so we don't need to worry
11744102adabSPaul E. McKenney * about it going away.
11754102adabSPaul E. McKenney */
rcu_initiate_boost(struct rcu_node * rnp,unsigned long flags)11764102adabSPaul E. McKenney static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags)
1177615e41c6SPranith Kumar __releases(rnp->lock)
11784102adabSPaul E. McKenney {
1179a32e01eeSMatthew Wilcox raw_lockdep_assert_held_rcu_node(rnp);
118088ca472fSZqiang if (!rnp->boost_kthread_task ||
118188ca472fSZqiang (!rcu_preempt_blocked_readers_cgp(rnp) && !rnp->exp_tasks)) {
118267c583a7SBoqun Feng raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
11834102adabSPaul E. McKenney return;
11844102adabSPaul E. McKenney }
11854102adabSPaul E. McKenney if (rnp->exp_tasks != NULL ||
11864102adabSPaul E. McKenney (rnp->gp_tasks != NULL &&
11874102adabSPaul E. McKenney rnp->boost_tasks == NULL &&
11884102adabSPaul E. McKenney rnp->qsmask == 0 &&
118970a82c3cSZqiang (!time_after(rnp->boost_time, jiffies) || rcu_state.cbovld ||
119070a82c3cSZqiang IS_ENABLED(CONFIG_RCU_STRICT_GRACE_PERIOD)))) {
11914102adabSPaul E. McKenney if (rnp->exp_tasks == NULL)
11925822b812SPaul E. McKenney WRITE_ONCE(rnp->boost_tasks, rnp->gp_tasks);
119367c583a7SBoqun Feng raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
1194a2badefaSPaul E. McKenney rcu_wake_cond(rnp->boost_kthread_task,
11953ca3b0e2SPaul E. McKenney READ_ONCE(rnp->boost_kthread_status));
11964102adabSPaul E. McKenney } else {
119767c583a7SBoqun Feng raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
11984102adabSPaul E. McKenney }
11994102adabSPaul E. McKenney }
12004102adabSPaul E. McKenney
12014102adabSPaul E. McKenney #define RCU_BOOST_DELAY_JIFFIES DIV_ROUND_UP(CONFIG_RCU_BOOST_DELAY * HZ, 1000)
12024102adabSPaul E. McKenney
12034102adabSPaul E. McKenney /*
12044102adabSPaul E. McKenney * Do priority-boost accounting for the start of a new grace period.
12054102adabSPaul E. McKenney */
rcu_preempt_boost_start_gp(struct rcu_node * rnp)12064102adabSPaul E. McKenney static void rcu_preempt_boost_start_gp(struct rcu_node *rnp)
12074102adabSPaul E. McKenney {
12084102adabSPaul E. McKenney rnp->boost_time = jiffies + RCU_BOOST_DELAY_JIFFIES;
12094102adabSPaul E. McKenney }
12104102adabSPaul E. McKenney
12114102adabSPaul E. McKenney /*
12124102adabSPaul E. McKenney * Create an RCU-boost kthread for the specified node if one does not
12134102adabSPaul E. McKenney * already exist. We only create this kthread for preemptible RCU.
12144102adabSPaul E. McKenney */
rcu_spawn_one_boost_kthread(struct rcu_node * rnp)12153545832fSByungchul Park static void rcu_spawn_one_boost_kthread(struct rcu_node *rnp)
12164102adabSPaul E. McKenney {
12174102adabSPaul E. McKenney unsigned long flags;
12183ef5a1c3SPaul E. McKenney int rnp_index = rnp - rcu_get_root();
12194102adabSPaul E. McKenney struct sched_param sp;
12204102adabSPaul E. McKenney struct task_struct *t;
12214102adabSPaul E. McKenney
12228e5e6215SFrederic Weisbecker if (rnp->boost_kthread_task)
12238e5e6215SFrederic Weisbecker return;
12243545832fSByungchul Park
12254102adabSPaul E. McKenney t = kthread_create(rcu_boost_kthread, (void *)rnp,
12264102adabSPaul E. McKenney "rcub/%d", rnp_index);
12273545832fSByungchul Park if (WARN_ON_ONCE(IS_ERR(t)))
12288e5e6215SFrederic Weisbecker return;
12293545832fSByungchul Park
12302a67e741SPeter Zijlstra raw_spin_lock_irqsave_rcu_node(rnp, flags);
12314102adabSPaul E. McKenney rnp->boost_kthread_task = t;
123267c583a7SBoqun Feng raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
1233db7ee3cbSFrederic Weisbecker
123421871d7eSClark Williams sp.sched_priority = kthread_prio;
12354102adabSPaul E. McKenney sched_setscheduler_nocheck(t, SCHED_FIFO, &sp);
1236db7ee3cbSFrederic Weisbecker rcu_thread_affine_rnp(t, rnp);
12374102adabSPaul E. McKenney wake_up_process(t); /* get to TASK_INTERRUPTIBLE quickly. */
12384102adabSPaul E. McKenney }
12394102adabSPaul E. McKenney
12404102adabSPaul E. McKenney #else /* #ifdef CONFIG_RCU_BOOST */
12414102adabSPaul E. McKenney
rcu_initiate_boost(struct rcu_node * rnp,unsigned long flags)12424102adabSPaul E. McKenney static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags)
1243615e41c6SPranith Kumar __releases(rnp->lock)
12444102adabSPaul E. McKenney {
124567c583a7SBoqun Feng raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
12464102adabSPaul E. McKenney }
12474102adabSPaul E. McKenney
rcu_preempt_boost_start_gp(struct rcu_node * rnp)12484102adabSPaul E. McKenney static void rcu_preempt_boost_start_gp(struct rcu_node *rnp)
12494102adabSPaul E. McKenney {
12504102adabSPaul E. McKenney }
12514102adabSPaul E. McKenney
rcu_spawn_one_boost_kthread(struct rcu_node * rnp)12523ef5a1c3SPaul E. McKenney static void rcu_spawn_one_boost_kthread(struct rcu_node *rnp)
12533ef5a1c3SPaul E. McKenney {
12543ef5a1c3SPaul E. McKenney }
12553ef5a1c3SPaul E. McKenney
12564102adabSPaul E. McKenney #endif /* #else #ifdef CONFIG_RCU_BOOST */
12574102adabSPaul E. McKenney
12584102adabSPaul E. McKenney /*
1259a096932fSPaul E. McKenney * Is this CPU a NO_HZ_FULL CPU that should ignore RCU so that the
1260a096932fSPaul E. McKenney * grace-period kthread will do force_quiescent_state() processing?
1261a096932fSPaul E. McKenney * The idea is to avoid waking up RCU core processing on such a
1262a096932fSPaul E. McKenney * CPU unless the grace period has extended for too long.
1263a096932fSPaul E. McKenney *
1264a096932fSPaul E. McKenney * This code relies on the fact that all NO_HZ_FULL CPUs are also
126517ea3718SZhouyi Zhou * RCU_NOCB_CPU CPUs.
1266a096932fSPaul E. McKenney */
rcu_nohz_full_cpu(void)12674580b054SPaul E. McKenney static bool rcu_nohz_full_cpu(void)
1268a096932fSPaul E. McKenney {
1269a096932fSPaul E. McKenney #ifdef CONFIG_NO_HZ_FULL
1270a096932fSPaul E. McKenney if (tick_nohz_full_cpu(smp_processor_id()) &&
1271de8e8730SPaul E. McKenney (!rcu_gp_in_progress() ||
1272e2f3ccfaSPaul E. McKenney time_before(jiffies, READ_ONCE(rcu_state.gp_start) + HZ)))
12735ce035fbSJoe Perches return true;
1274a096932fSPaul E. McKenney #endif /* #ifdef CONFIG_NO_HZ_FULL */
12755ce035fbSJoe Perches return false;
1276a096932fSPaul E. McKenney }
12775057f55eSPaul E. McKenney
12785057f55eSPaul E. McKenney /*
1279265f5f28SPaul E. McKenney * Bind the RCU grace-period kthreads to the housekeeping CPU.
12805057f55eSPaul E. McKenney */
rcu_bind_gp_kthread(void)12815057f55eSPaul E. McKenney static void rcu_bind_gp_kthread(void)
12825057f55eSPaul E. McKenney {
1283c0f489d2SPaul E. McKenney if (!tick_nohz_full_enabled())
12845057f55eSPaul E. McKenney return;
128504d4e665SFrederic Weisbecker housekeeping_affine(current, HK_TYPE_RCU);
12865057f55eSPaul E. McKenney }
1287