|
@@ -1630,17 +1630,23 @@ module_param(rcu_idle_lazy_gp_delay, int, 0644);
|
|
|
extern int tick_nohz_enabled;
|
|
|
|
|
|
/*
|
|
|
- * Try to advance callbacks for all flavors of RCU on the current CPU.
|
|
|
- * Afterwards, if there are any callbacks ready for immediate invocation,
|
|
|
- * return true.
|
|
|
+ * Try to advance callbacks for all flavors of RCU on the current CPU, but
|
|
|
+ * only if it has been awhile since the last time we did so. Afterwards,
|
|
|
+ * if there are any callbacks ready for immediate invocation, return true.
|
|
|
*/
|
|
|
static bool rcu_try_advance_all_cbs(void)
|
|
|
{
|
|
|
bool cbs_ready = false;
|
|
|
struct rcu_data *rdp;
|
|
|
+ struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
|
|
|
struct rcu_node *rnp;
|
|
|
struct rcu_state *rsp;
|
|
|
|
|
|
+ /* Exit early if we advanced recently. */
|
|
|
+ if (jiffies == rdtp->last_advance_all)
|
|
|
+ return 0;
|
|
|
+ rdtp->last_advance_all = jiffies;
|
|
|
+
|
|
|
for_each_rcu_flavor(rsp) {
|
|
|
rdp = this_cpu_ptr(rsp->rda);
|
|
|
rnp = rdp->mynode;
|