For RCU tasks trace, the userspace execution is also a valid quiescent. when the scheduling clock interrupt handler interrupts current task and check current tasks running in userspace, then invoke rcu_tasks_trace_qs() to check quiescent state, usually, the current tasks ->trc_reader_nesting should be zero, if the current tasks ->trc_reader_special.b.need_qs is not set, set TRC_NEED_QS_CHECKED to ->trc_reader_special.b.need_qs. this cause grace period kthread remove task from holdout list if current tasks is in holdout list. But sometimes, although the scheduling clock interrupt handler check current tasks running in userspace, but the current tasks ->trc_reader_nesting maybe not zero (if one of the functions in the scheduling-clock interrupt handler were traced/instrumented), and then invoke rcu_tasks_trace_qs(), if the current tasks ->trc_reader_nesting is still not zero, the current tasks will be insert local CPU blocked list. if starts a new RCU tasks trace grace period and the grace period kthread scan running tasks on each CPU, find that current tasks is running, will also insert it to hold out list. Signed-off-by: Zqiang <qiang1.zhang@xxxxxxxxx> --- v1->v2: Fix build error due to undeclared rcu_tasks_trace_qs(), note in no-PREEMPT_RCU kernel, the RCU Tasks is replaced by RCU, so rcu_note_voluntary_context_switch() only include rcu_tasks_trace_qs(). v2->v3: Modify commit information. kernel/rcu/tree_plugin.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index 4152816dd29f..5fb0b2dd24fd 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h @@ -976,7 +976,7 @@ static void rcu_flavor_sched_clock_irq(int user) * neither access nor modify, at least not while the * corresponding CPU is online. */ - + rcu_note_voluntary_context_switch(current); rcu_qs(); } } -- 2.25.1