diff options
Diffstat (limited to 'kernel/rcutree_plugin.h')
-rw-r--r-- | kernel/rcutree_plugin.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index 18d9c91f25d1..d81e3856fa91 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
@@ -1630,17 +1630,23 @@ module_param(rcu_idle_lazy_gp_delay, int, 0644); | |||
1630 | extern int tick_nohz_enabled; | 1630 | extern int tick_nohz_enabled; |
1631 | 1631 | ||
1632 | /* | 1632 | /* |
1633 | * Try to advance callbacks for all flavors of RCU on the current CPU. | 1633 | * Try to advance callbacks for all flavors of RCU on the current CPU, but |
1634 | * Afterwards, if there are any callbacks ready for immediate invocation, | 1634 | * only if it has been awhile since the last time we did so. Afterwards, |
1635 | * return true. | 1635 | * if there are any callbacks ready for immediate invocation, return true. |
1636 | */ | 1636 | */ |
1637 | static bool rcu_try_advance_all_cbs(void) | 1637 | static bool rcu_try_advance_all_cbs(void) |
1638 | { | 1638 | { |
1639 | bool cbs_ready = false; | 1639 | bool cbs_ready = false; |
1640 | struct rcu_data *rdp; | 1640 | struct rcu_data *rdp; |
1641 | struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks); | ||
1641 | struct rcu_node *rnp; | 1642 | struct rcu_node *rnp; |
1642 | struct rcu_state *rsp; | 1643 | struct rcu_state *rsp; |
1643 | 1644 | ||
1645 | /* Exit early if we advanced recently. */ | ||
1646 | if (jiffies == rdtp->last_advance_all) | ||
1647 | return 0; | ||
1648 | rdtp->last_advance_all = jiffies; | ||
1649 | |||
1644 | for_each_rcu_flavor(rsp) { | 1650 | for_each_rcu_flavor(rsp) { |
1645 | rdp = this_cpu_ptr(rsp->rda); | 1651 | rdp = this_cpu_ptr(rsp->rda); |
1646 | rnp = rdp->mynode; | 1652 | rnp = rdp->mynode; |