diff options
author | Nick Piggin <nickpiggin@yahoo.com.au> | 2005-06-25 17:57:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-25 19:24:44 -0400 |
commit | 77391d71681d05d2f4502f91ad62618522abf624 (patch) | |
tree | e8931edb38a4ef3b7eb9e5ec7d25f7128e049994 /kernel/sched.c | |
parent | 476d139c218e44e045e4bc6d4cc02b010b343939 (diff) |
[PATCH] sched: relax pinned balancing
The maximum rebalance interval allowed by the multiprocessor balancing
backoff is often not large enough to handle corner cases where there are
lots of tasks pinned on a CPU. Suresh reported:
I see system livelock's if for example I have 7000 processes
pinned onto one cpu (this is on the fastest 8-way system I
have access to).
After this patch, the machine is reported to go well above this number.
Signed-off-by: Nick Piggin <nickpiggin@yahoo.com.au>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 579da278e72f..6e452eb95ac3 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -2031,6 +2031,12 @@ static runqueue_t *find_busiest_queue(struct sched_group *group) | |||
2031 | } | 2031 | } |
2032 | 2032 | ||
2033 | /* | 2033 | /* |
2034 | * Max backoff if we encounter pinned tasks. Pretty arbitrary value, but | ||
2035 | * so long as it is large enough. | ||
2036 | */ | ||
2037 | #define MAX_PINNED_INTERVAL 512 | ||
2038 | |||
2039 | /* | ||
2034 | * Check this_cpu to ensure it is balanced within domain. Attempt to move | 2040 | * Check this_cpu to ensure it is balanced within domain. Attempt to move |
2035 | * tasks if there is an imbalance. | 2041 | * tasks if there is an imbalance. |
2036 | * | 2042 | * |
@@ -2042,7 +2048,7 @@ static int load_balance(int this_cpu, runqueue_t *this_rq, | |||
2042 | struct sched_group *group; | 2048 | struct sched_group *group; |
2043 | runqueue_t *busiest; | 2049 | runqueue_t *busiest; |
2044 | unsigned long imbalance; | 2050 | unsigned long imbalance; |
2045 | int nr_moved, all_pinned; | 2051 | int nr_moved, all_pinned = 0; |
2046 | int active_balance = 0; | 2052 | int active_balance = 0; |
2047 | 2053 | ||
2048 | spin_lock(&this_rq->lock); | 2054 | spin_lock(&this_rq->lock); |
@@ -2133,7 +2139,8 @@ out_balanced: | |||
2133 | 2139 | ||
2134 | sd->nr_balance_failed = 0; | 2140 | sd->nr_balance_failed = 0; |
2135 | /* tune up the balancing interval */ | 2141 | /* tune up the balancing interval */ |
2136 | if (sd->balance_interval < sd->max_interval) | 2142 | if ((all_pinned && sd->balance_interval < MAX_PINNED_INTERVAL) || |
2143 | (sd->balance_interval < sd->max_interval)) | ||
2137 | sd->balance_interval *= 2; | 2144 | sd->balance_interval *= 2; |
2138 | 2145 | ||
2139 | return 0; | 2146 | return 0; |