diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2009-12-17 18:10:09 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-01-21 13:40:13 +0100 |
commit | baa8c1102f0cd86e69c1497d61d2ee177e663663 (patch) | |
tree | d87729687336b8f4c1e4e08a34f84587d073eaf4 /kernel | |
parent | 230059de77a4e0f6afba98073e73bc9fd471506e (diff) | |
download | linux-baa8c1102f0cd86e69c1497d61d2ee177e663663.tar.gz linux-baa8c1102f0cd86e69c1497d61d2ee177e663663.tar.bz2 linux-baa8c1102f0cd86e69c1497d61d2ee177e663663.zip |
sched: Add a lock break for PREEMPT=y
Since load-balancing can hold rq->locks for quite a long while, allow
breaking out early when there is lock contention.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched_fair.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 93fccbadde23..65d08207e925 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c @@ -2065,6 +2065,10 @@ static int move_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest, */ if (idle == CPU_NEWLY_IDLE && this_rq->nr_running) break; + + if (raw_spin_is_contended(&this_rq->lock) || + raw_spin_is_contended(&busiest->lock)) + break; #endif } while (load_moved && max_load_move > total_load_moved); |