diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2018-06-30 18:23:37 -0400 |
---|---|---|
committer | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2018-08-30 19:02:38 -0400 |
commit | ba1c64c27239373be1b3d88cf0a9ac1b10fa871f (patch) | |
tree | 213989e0ed3d4c35f86efd1f1f4248634ab80e06 /kernel | |
parent | d28139c4e96713d52a300fb9036c5be2f45e0741 (diff) |
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 <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/rcu/tree_plugin.h | 5 |
1 files changed, 3 insertions, 2 deletions
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) | |||
332 | static void rcu_preempt_note_context_switch(bool preempt) | 332 | static void rcu_preempt_note_context_switch(bool preempt) |
333 | { | 333 | { |
334 | struct task_struct *t = current; | 334 | struct task_struct *t = current; |
335 | struct rcu_data *rdp; | 335 | struct rcu_data *rdp = this_cpu_ptr(rcu_state_p->rda); |
336 | struct rcu_node *rnp; | 336 | struct rcu_node *rnp; |
337 | 337 | ||
338 | lockdep_assert_irqs_disabled(); | 338 | lockdep_assert_irqs_disabled(); |
@@ -341,7 +341,6 @@ static void rcu_preempt_note_context_switch(bool preempt) | |||
341 | !t->rcu_read_unlock_special.b.blocked) { | 341 | !t->rcu_read_unlock_special.b.blocked) { |
342 | 342 | ||
343 | /* Possibly blocking in an RCU read-side critical section. */ | 343 | /* Possibly blocking in an RCU read-side critical section. */ |
344 | rdp = this_cpu_ptr(rcu_state_p->rda); | ||
345 | rnp = rdp->mynode; | 344 | rnp = rdp->mynode; |
346 | raw_spin_lock_rcu_node(rnp); | 345 | raw_spin_lock_rcu_node(rnp); |
347 | t->rcu_read_unlock_special.b.blocked = true; | 346 | t->rcu_read_unlock_special.b.blocked = true; |
@@ -383,6 +382,8 @@ static void rcu_preempt_note_context_switch(bool preempt) | |||
383 | * means that we continue to block the current grace period. | 382 | * means that we continue to block the current grace period. |
384 | */ | 383 | */ |
385 | rcu_preempt_qs(); | 384 | rcu_preempt_qs(); |
385 | if (rdp->deferred_qs) | ||
386 | rcu_report_exp_rdp(rcu_state_p, rdp, true); | ||
386 | } | 387 | } |
387 | 388 | ||
388 | /* | 389 | /* |