linux/kernel/rcu
Paul E. McKenney e386b67257 rcu-tasks: Eliminate RCU Tasks Trace IPIs to online CPUs
Currently, the RCU Tasks Trace grace-period kthread IPIs each online CPU
using smp_call_function_single() in order to track any tasks currently in
RCU Tasks Trace read-side critical sections during which the corresponding
task has neither blocked nor been preempted.  These IPIs are annoying
and are also not strictly necessary because any task that blocks or is
preempted within its current RCU Tasks Trace read-side critical section
will be tracked on one of the per-CPU rcu_tasks_percpu structure's
->rtp_blkd_tasks list.  So the only time that this is a problem is if
one of the CPUs runs through a long-duration RCU Tasks Trace read-side
critical section without a context switch.

Note that the task_call_func() function cannot help here because there is
no safe way to identify the target task.  Of course, the task_call_func()
function will be very useful later, when processing the list of tasks,
but it needs to know the task.

This commit therefore creates a cpu_curr_snapshot() function that returns
a pointer the task_struct structure of some task that happened to be
running on the specified CPU more or less during the time that the
cpu_curr_snapshot() function was executing.  If there was no context
switch during this time, this function will return a pointer to the
task_struct structure of the task that was running throughout.  If there
was a context switch, then the outgoing task will be taken care of by
RCU's context-switch hook, and the incoming task was either already taken
care during some previous context switch, or it is not currently within an
RCU Tasks Trace read-side critical section.  And in this latter case, the
grace period already started, so there is no need to wait on this task.

This new cpu_curr_snapshot() function is invoked on each CPU early in
the RCU Tasks Trace grace-period processing, and the resulting tasks
are queued for later quiescent-state inspection.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Neeraj Upadhyay <quic_neeraju@quicinc.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Andrii Nakryiko <andrii@kernel.org>
Cc: Martin KaFai Lau <kafai@fb.com>
Cc: KP Singh <kpsingh@kernel.org>
2022-06-21 15:49:38 -07:00
..
Kconfig Merge branch 'exp.2022.05.11a' into HEAD 2022-05-11 11:49:35 -07:00
Kconfig.debug Merge branch 'exp.2022.05.11a' into HEAD 2022-05-11 11:49:35 -07:00
Makefile rcuperf: Change rcuperf to rcuscale 2020-08-24 18:39:24 -07:00
rcu_segcblist.c rcu: Clarify fill-the-gap comment in rcu_segcblist_advance() 2022-04-11 17:28:48 -07:00
rcu_segcblist.h rcu: Mark writes to the rcu_segcblist structure's ->flags field 2022-02-14 10:36:58 -08:00
rcu.h sysctl changes for v5.19-rc1 2022-05-26 16:57:20 -07:00
rcuscale.c rcuscale: Allow rcuscale without RCU Tasks Rude/Trace 2022-04-20 16:53:19 -07:00
rcutorture.c Merge branches 'docs.2022.04.20a', 'fixes.2022.04.20a', 'nocb.2022.04.11b', 'rcu-tasks.2022.04.11b', 'srcu.2022.05.03a', 'torture.2022.04.11b', 'torture-tasks.2022.04.20a' and 'torturescript.2022.04.20a' into HEAD 2022-05-03 10:21:40 -07:00
refscale.c refscale: Allow refscale without RCU Tasks Rude/Trace 2022-04-20 16:53:19 -07:00
srcutiny.c srcu: Prevent redundant __srcu_read_unlock() wakeup 2021-11-30 17:28:16 -08:00
srcutree.c srcu: Drop needless initialization of sdp in srcu_gp_start() 2022-05-03 10:20:57 -07:00
sync.c rcu_sync: Fix comment to properly reflect rcu_sync_exit() behavior 2022-04-20 16:51:11 -07:00
tasks.h rcu-tasks: Eliminate RCU Tasks Trace IPIs to online CPUs 2022-06-21 15:49:38 -07:00
tiny.c srcu: Initialize SRCU after timers 2021-05-10 16:03:35 -07:00
tree_exp.h rcu: Move expedited grace period (GP) work to RT kthread_worker 2022-05-11 11:47:10 -07:00
tree_nocb.h rcu/nocb: Initialize nocb kthreads only for boot CPU prior SMP initialization 2022-04-11 17:05:58 -07:00
tree_plugin.h rcu-tasks: Make rcu_note_context_switch() unconditionally call rcu_tasks_qs() 2022-06-20 09:22:27 -07:00
tree_stall.h printk changes for 5.19 2022-05-25 10:32:08 -07:00
tree.c Merge branch 'exp.2022.05.11a' into HEAD 2022-05-11 11:49:35 -07:00
tree.h Merge branch 'exp.2022.05.11a' into HEAD 2022-05-11 11:49:35 -07:00
update.c rcu: Introduce CONFIG_RCU_EXP_CPU_STALL_TIMEOUT 2022-05-11 11:38:50 -07:00