mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
[PATCH] sched: don't kick ALB in the presence of pinned task
Jack Steiner brought this issue at my OLS talk. Take a scenario where two tasks are pinned to two HT threads in a physical package. Idle packages in the system will keep kicking migration_thread on the busy package with out any success. We will run into similar scenarios in the presence of CMP/NUMA. Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Acked-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
5927ad78ec
commit
fa3b6ddc3f
1 changed files with 14 additions and 1 deletions
|
@ -2125,6 +2125,16 @@ static int load_balance(int this_cpu, runqueue_t *this_rq,
|
|||
if (unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2)) {
|
||||
|
||||
spin_lock(&busiest->lock);
|
||||
|
||||
/* don't kick the migration_thread, if the curr
|
||||
* task on busiest cpu can't be moved to this_cpu
|
||||
*/
|
||||
if (!cpu_isset(this_cpu, busiest->curr->cpus_allowed)) {
|
||||
spin_unlock(&busiest->lock);
|
||||
all_pinned = 1;
|
||||
goto out_one_pinned;
|
||||
}
|
||||
|
||||
if (!busiest->active_balance) {
|
||||
busiest->active_balance = 1;
|
||||
busiest->push_cpu = this_cpu;
|
||||
|
@ -2165,6 +2175,8 @@ out_balanced:
|
|||
schedstat_inc(sd, lb_balanced[idle]);
|
||||
|
||||
sd->nr_balance_failed = 0;
|
||||
|
||||
out_one_pinned:
|
||||
/* tune up the balancing interval */
|
||||
if ((all_pinned && sd->balance_interval < MAX_PINNED_INTERVAL) ||
|
||||
(sd->balance_interval < sd->max_interval))
|
||||
|
@ -2357,7 +2369,8 @@ static void rebalance_tick(int this_cpu, runqueue_t *this_rq,
|
|||
|
||||
if (j - sd->last_balance >= interval) {
|
||||
if (load_balance(this_cpu, this_rq, sd, idle)) {
|
||||
/* We've pulled tasks over so either we're no
|
||||
/*
|
||||
* We've pulled tasks over so either we're no
|
||||
* longer idle, or one of our SMT siblings is
|
||||
* not idle.
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue