From: Ingo Molnar Teach special (recursive) locking code to the lock validator. Has no effect on non-lockdep kernels. Signed-off-by: Ingo Molnar Signed-off-by: Arjan van de Ven Signed-off-by: Andrew Morton --- kernel/exit.c | 2 +- kernel/fork.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff -puN kernel/exit.c~lock-validator-special-locking-mmap_sem kernel/exit.c --- devel/kernel/exit.c~lock-validator-special-locking-mmap_sem 2006-05-29 18:13:28.000000000 -0700 +++ devel-akpm/kernel/exit.c 2006-05-29 18:13:28.000000000 -0700 @@ -582,7 +582,7 @@ static void exit_mm(struct task_struct * /* more a memory barrier than a real lock */ task_lock(tsk); tsk->mm = NULL; - up_read(&mm->mmap_sem); + up_read_non_nested(&mm->mmap_sem); enter_lazy_tlb(mm, current); task_unlock(tsk); mmput(mm); diff -puN kernel/fork.c~lock-validator-special-locking-mmap_sem kernel/fork.c --- devel/kernel/fork.c~lock-validator-special-locking-mmap_sem 2006-05-29 18:13:28.000000000 -0700 +++ devel-akpm/kernel/fork.c 2006-05-29 18:13:28.000000000 -0700 @@ -196,7 +196,10 @@ static inline int dup_mmap(struct mm_str down_write(&oldmm->mmap_sem); flush_cache_mm(oldmm); - down_write(&mm->mmap_sem); + /* + * Not linked in yet - no deadlock potential: + */ + down_write_nested(&mm->mmap_sem, 1); mm->locked_vm = 0; mm->mmap = NULL; _