diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2009-01-07 15:28:57 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-01-07 16:10:54 +0100 |
commit | da8d5089da6dfd54e5fd05d0c291a63c2bcf6885 (patch) | |
tree | ad9f7deceed846e56e0185976af5c620722ff9ba /kernel/sched.c | |
parent | ede6f5aea054d3fb67c78857f7abdee602302043 (diff) | |
download | op-kernel-dev-da8d5089da6dfd54e5fd05d0c291a63c2bcf6885.zip op-kernel-dev-da8d5089da6dfd54e5fd05d0c291a63c2bcf6885.tar.gz |
sched: fix possible recursive rq->lock
Vaidyanathan Srinivasan reported:
> =============================================
> [ INFO: possible recursive locking detected ]
> 2.6.28-autotest-tip-sv #1
> ---------------------------------------------
> klogd/5062 is trying to acquire lock:
> (&rq->lock){++..}, at: [<ffffffff8022aca2>] task_rq_lock+0x45/0x7e
>
> but task is already holding lock:
> (&rq->lock){++..}, at: [<ffffffff805f7354>] schedule+0x158/0xa31
With sched_mc at 2. (it is default-off)
Strictly speaking we'll not deadlock, because ttwu will not be able to
place the migration task on our rq, but since the code can deal with
both rqs getting unlocked, this seems the easiest way out.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 2e3545f..deb5ac8 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -3728,8 +3728,13 @@ redo: } double_unlock_balance(this_rq, busiest); + /* + * Should not call ttwu while holding a rq->lock + */ + spin_unlock(&this_rq->lock); if (active_balance) wake_up_process(busiest->migration_thread); + spin_lock(&this_rq->lock); } else sd->nr_balance_failed = 0; |