Index: linux-2.6.14-rt22-rayrt5/kernel/rt.c =================================================================== --- linux-2.6.14-rt22-rayrt5.orig/kernel/rt.c 2005-12-15 02:15:13.000000000 +0530 +++ linux-2.6.14-rt22-rayrt5/kernel/rt.c 2005-12-19 15:51:26.000000000 +0530 @@ -1042,7 +1042,8 @@ return; } #endif - _raw_spin_lock(&lock_owner(lock)->task->pi_lock); + if (current != lock_owner(lock)->task) + _raw_spin_lock(&lock_owner(lock)->task->pi_lock); plist_add(&waiter->pi_list, &lock_owner(lock)->task->pi_waiters); /* * Add RT tasks to the head: @@ -1055,7 +1056,8 @@ */ if (task->prio < lock_owner(lock)->task->prio) pi_setprio(lock, lock_owner(lock)->task, task->prio); - _raw_spin_unlock(&lock_owner(lock)->task->pi_lock); + if (current != lock_owner(lock)->task) + _raw_spin_unlock(&lock_owner(lock)->task->pi_lock); } /* @@ -3016,8 +3018,7 @@ * the first waiter and we'll just block on the down_interruptible. */ - if (owner_task != current) - down_try_futex(lock, owner_task->thread_info __EIP__); + down_try_futex(lock, owner_task->thread_info __EIP__); /* * we can now drop the locks because the rt_mutex is held.