sched: skip updating rq's next_balance under null SD
PATCH 1/1 sched: skip updating rq's next_balance under null SD
Was playing with sched_smt_power_savings/sched_mc_power_savings and found out that while the scheduler domains are reconstructed when sysfs settings change, rebalance_domains() can get triggered with null domain on other cpus, which is setting next_balance to jiffies + 60*HZ. Resulting in no idle/busy balancing for 60 seconds.
Fix this.
---
kernel/sched.c +12 -2
@@ -3020,6 +3020,7 @@ static inline void rebalance_domains(int cpu, enum cpu_idle_type idle)struct sched_domain *sd;/* Earliest time when we have to do rebalance again */ unsigned long next_balance = jiffies +60 *HZ ; +int update_next_balance =0 ;for_each_domain (cpu, sd) {if (!(sd->flags &SD_LOAD_BALANCE ))
@@ -3056,8 +3057,10 @@ static inline void rebalance_domains(int cpu, enum cpu_idle_type idle)if (sd->flags &SD_SERIALIZE )spin_unlock (&balancing); out: -if (time_after (next_balance, sd->last_balance + interval)) +if (time_after (next_balance, sd->last_balance + interval)) { next_balance = sd->last_balance + interval; + update_next_balance =1 ; + }/* * Stop the load balance at this level. There is another
@@ -3067,7 +3070,14 @@ out:if (!balance)break ; } - rq->next_balance = next_balance; + +/* +* next_balance will be updated only when there is a need. +* When the cpu is attached to null domain for ex, it will not be +* updated. +*/ +if (likely (update_next_balance)) + rq->next_balance = next_balance; }/*
Ingo Molnar
AppliedQuoted 7 lines · Siddha, Suresh B
Was playing with sched_smt_power_savings/sched_mc_power_savings and found out that while the scheduler domains are reconstructed when sysfs settings change,
rebalance_domains()can get triggered with null domain on other cpus, which is settingnext_balanceto jiffies + 60*HZ. Resulting in no idle/busy balancing for 60 seconds.Fix this.
thanks, applied.
Ingo