From: Paul E. McKenney Date: Sat, 30 Jun 2018 22:23:37 +0000 (-0700) Subject: rcu: Report expedited grace periods at context-switch time X-Git-Tag: for-linus-20181026~64^2^2^2~107 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=ba1c64c27239373be1b3d88cf0a9ac1b10fa871f;p=linux-block.git rcu: Report expedited grace periods at context-switch time This commit reduces the latency of expedited RCU grace periods by reporting a quiescent state for the CPU at context-switch time. In CONFIG_PREEMPT=y kernels, if the outgoing task is still within an RCU read-side critical section (and thus still blocking some grace period, perhaps including this expedited grace period), then that task will already have been placed on one of the leaf rcu_node structures' ->blkd_tasks list. Signed-off-by: Paul E. McKenney --- diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index c686bf63bba5..0d7107fb3dec 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h @@ -332,7 +332,7 @@ static void rcu_preempt_qs(void) static void rcu_preempt_note_context_switch(bool preempt) { struct task_struct *t = current; - struct rcu_data *rdp; + struct rcu_data *rdp = this_cpu_ptr(rcu_state_p->rda); struct rcu_node *rnp; lockdep_assert_irqs_disabled(); @@ -341,7 +341,6 @@ static void rcu_preempt_note_context_switch(bool preempt) !t->rcu_read_unlock_special.b.blocked) { /* Possibly blocking in an RCU read-side critical section. */ - rdp = this_cpu_ptr(rcu_state_p->rda); rnp = rdp->mynode; raw_spin_lock_rcu_node(rnp); t->rcu_read_unlock_special.b.blocked = true; @@ -383,6 +382,8 @@ static void rcu_preempt_note_context_switch(bool preempt) * means that we continue to block the current grace period. */ rcu_preempt_qs(); + if (rdp->deferred_qs) + rcu_report_exp_rdp(rcu_state_p, rdp, true); } /*