Commit ab278921 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar

sched: Fix select_idle_sibling() regression in selecting an idle SMT sibling

Mike Galbraith reported that this recent commit:

   commit 4dcfe102
   Author: Peter Zijlstra <peterz@infradead.org>
   Date:   Thu Nov 10 13:01:10 2011 +0100

       sched: Avoid SMT siblings in select_idle_sibling() if possible

stopped selecting an idle SMT sibling when there are no idle
cores in a single socket system.

Intent of the select_idle_sibling() was to fallback to an idle
SMT sibling, if it fails to identify an idle core. But this
fallback was not happening on systems where all the scheduler
domains had `SD_SHARE_PKG_RESOURCES' flag set.

Fix it. Slightly bigger patch of cleaning all these goto's etc
is queued up for the next release.
Reported-by: default avatarMike Galbraith <efault@gmx.de>
Reported-by: default avatarAlex Shi <alex.shi@intel.com>
Signed-off-by: default avatarPeter Zijlstra <peterz@infradead.org>
Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
Link: http://lkml.kernel.org/r/1323978421.1984.244.camel@sbsiddha-desk.sc.intel.comSigned-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 75fc2d37
...@@ -2352,13 +2352,11 @@ static int select_idle_sibling(struct task_struct *p, int target) ...@@ -2352,13 +2352,11 @@ static int select_idle_sibling(struct task_struct *p, int target)
if (!smt && (sd->flags & SD_SHARE_CPUPOWER)) if (!smt && (sd->flags & SD_SHARE_CPUPOWER))
continue; continue;
if (!(sd->flags & SD_SHARE_PKG_RESOURCES)) { if (smt && !(sd->flags & SD_SHARE_CPUPOWER))
if (!smt) { break;
smt = 1;
goto again; if (!(sd->flags & SD_SHARE_PKG_RESOURCES))
}
break; break;
}
sg = sd->groups; sg = sd->groups;
do { do {
...@@ -2378,6 +2376,10 @@ static int select_idle_sibling(struct task_struct *p, int target) ...@@ -2378,6 +2376,10 @@ static int select_idle_sibling(struct task_struct *p, int target)
sg = sg->next; sg = sg->next;
} while (sg != sd->groups); } while (sg != sd->groups);
} }
if (!smt) {
smt = 1;
goto again;
}
done: done:
rcu_read_unlock(); rcu_read_unlock();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment