mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-11-01 02:21:16 +00:00
sched: re-calculate a cpu's next_balance point upon sched domain changes
Commit 55ddeb0f (sched: Reset rq->next_interval before going idle) reset a cpu's rq->next_balance when pulled_task = 0, which will be true when the cpu failed to pull any task, causing it go idle. However that patch relied on next_balance being calculated as a result of traversing cpu's sched domain hierarchy. A cpu that is the only online cpu will however not be attached to any sched domain hierarchy. When such a cpu calls into idle_balance(), we will end up initializing next_balance to be 1sec away! Such a CPU will defer load balance check for another 1sec, even though we may bring up more cpus in the meantime requiring it to check for load imbalance more frequently. This could then lead to increased scheduling latency for some tasks. This patch results in a cpu's next_balance being re-calculated when its attaching to a new sched domain hierarchy. This should let cpus call load balance checks at the right time we expect them to! Change-Id: I855cff8da5ca28d278596c3bb0163b839d4704bc Signed-off-by: Srivatsa Vaddagiri <vatsa@codeaurora.org>
This commit is contained in:
parent
ec6b7a0cf6
commit
d0feb11030
1 changed files with 12 additions and 0 deletions
|
@ -5693,6 +5693,7 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
|
|||
{
|
||||
struct rq *rq = cpu_rq(cpu);
|
||||
struct sched_domain *tmp;
|
||||
unsigned long next_balance = rq->next_balance;
|
||||
|
||||
/* Remove the sched domains which do not contribute to scheduling. */
|
||||
for (tmp = sd; tmp; ) {
|
||||
|
@ -5717,6 +5718,17 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
|
|||
sd->child = NULL;
|
||||
}
|
||||
|
||||
for (tmp = sd; tmp; ) {
|
||||
unsigned long interval;
|
||||
|
||||
interval = msecs_to_jiffies(tmp->balance_interval);
|
||||
if (time_after(next_balance, tmp->last_balance + interval))
|
||||
next_balance = tmp->last_balance + interval;
|
||||
|
||||
tmp = tmp->parent;
|
||||
}
|
||||
rq->next_balance = next_balance;
|
||||
|
||||
sched_domain_debug(sd, cpu);
|
||||
|
||||
rq_attach_root(rq, rd);
|
||||
|
|
Loading…
Reference in a new issue