Index: linux-acpica/kernel/rcu/tree_exp.h =================================================================== --- linux-acpica.orig/kernel/rcu/tree_exp.h +++ linux-acpica/kernel/rcu/tree_exp.h @@ -297,16 +297,22 @@ fastpath: return false; } -/* Invoked on each online non-idle CPU for expedited quiescent state. */ -static void sync_sched_exp_handler(void *data) +static bool sync_sched_exp_is_required(struct rcu_state *rsp) { struct rcu_data *rdp; struct rcu_node *rnp; - struct rcu_state *rsp = data; rdp = this_cpu_ptr(rsp->rda); rnp = rdp->mynode; - if (!(READ_ONCE(rnp->expmask) & rdp->grpmask) || + return !!(READ_ONCE(rnp->expmask) & rdp->grpmask); +} + +/* Invoked on each online non-idle CPU for expedited quiescent state. */ +static void sync_sched_exp_handler(void *data) +{ + struct rcu_state *rsp = data; + + if (!sync_sched_exp_is_requierd(rsp) || __this_cpu_read(rcu_sched_data.cpu_no_qs.b.exp)) return; if (rcu_is_cpu_rrupt_from_idle()) { @@ -610,6 +616,8 @@ void synchronize_sched_expedited(void) /* If only one CPU, this is automatically a grace period. */ if (rcu_blocking_is_gp()) return; + if (!sync_sched_exp_is_required(rsp)) + return; _synchronize_rcu_expedited(rsp, sync_sched_exp_handler); }