aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorPeter Zijlstra <a.p.zijlstra@chello.nl>2009-12-17 18:10:09 +0100
committerIngo Molnar <mingo@elte.hu>2010-01-21 13:40:13 +0100
commitbaa8c1102f0cd86e69c1497d61d2ee177e663663 (patch)
treed87729687336b8f4c1e4e08a34f84587d073eaf4 /kernel
parent230059de77a4e0f6afba98073e73bc9fd471506e (diff)
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.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index 93fccbadde2..65d08207e92 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);