diff options
| author | Peter Zijlstra <peterz@infradead.org> | 2011-12-15 14:47:00 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2011-12-16 03:44:58 -0500 |
| commit | ab2789213d224202237292d78aaa0c386c7b28b2 (patch) | |
| tree | da6a28ca9a2eddad554742361e496764f17682a3 | |
| parent | 75fc2d3797c47f5f70ca71c41c342c352845cd06 (diff) | |
sched: Fix select_idle_sibling() regression in selecting an idle SMT sibling
Mike Galbraith reported that this recent commit:
commit 4dcfe1025b513c2c1da5bf5586adb0e80148f612
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: Mike Galbraith <efault@gmx.de>
Reported-by: Alex Shi <alex.shi@intel.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Link: http://lkml.kernel.org/r/1323978421.1984.244.camel@sbsiddha-desk.sc.intel.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | kernel/sched_fair.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index a78ed2736ba7..8a39fa3e3c6c 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -2352,13 +2352,11 @@ again: | |||
| 2352 | if (!smt && (sd->flags & SD_SHARE_CPUPOWER)) | 2352 | if (!smt && (sd->flags & SD_SHARE_CPUPOWER)) |
| 2353 | continue; | 2353 | continue; |
| 2354 | 2354 | ||
| 2355 | if (!(sd->flags & SD_SHARE_PKG_RESOURCES)) { | 2355 | if (smt && !(sd->flags & SD_SHARE_CPUPOWER)) |
| 2356 | if (!smt) { | 2356 | break; |
| 2357 | smt = 1; | 2357 | |
| 2358 | goto again; | 2358 | if (!(sd->flags & SD_SHARE_PKG_RESOURCES)) |
| 2359 | } | ||
| 2360 | break; | 2359 | break; |
| 2361 | } | ||
| 2362 | 2360 | ||
| 2363 | sg = sd->groups; | 2361 | sg = sd->groups; |
| 2364 | do { | 2362 | do { |
| @@ -2378,6 +2376,10 @@ next: | |||
| 2378 | sg = sg->next; | 2376 | sg = sg->next; |
| 2379 | } while (sg != sd->groups); | 2377 | } while (sg != sd->groups); |
| 2380 | } | 2378 | } |
| 2379 | if (!smt) { | ||
| 2380 | smt = 1; | ||
| 2381 | goto again; | ||
| 2382 | } | ||
| 2381 | done: | 2383 | done: |
| 2382 | rcu_read_unlock(); | 2384 | rcu_read_unlock(); |
| 2383 | 2385 | ||
