On Tue, 2005-08-30 at 11:00 -0400, Steven Rostedt wrote:
> OK, I'm looking for a second set of eyes (or third or more :-) to see if
> there's a danger of a deadlock here.

Unless someone sees a problem with the patch, here it is.  I noticed
that I unlocked the lock->wait_lock when I should not have.  (scares me
since I'm currently running the kernel with that bug!)

Ingo,  in the pi_setprio, I can stop the loop if the owner of the BKL
has a task lock_depth >= 0 correct?  This means that the owner is either
running, or is going to go to sleep.  If it was blocked on another task,
via a mutex, then this count would be -1.  Correct?  I may need to move
the setting of lock_depth = -1 to inside the protection of the task
pi_lock.

-- Steve

Signed-off-by: Steven Rostedt <[EMAIL PROTECTED]>

Index: linux_realtime_goliath/kernel/rt.c
===================================================================
--- linux_realtime_goliath/kernel/rt.c  (revision 310)
+++ linux_realtime_goliath/kernel/rt.c  (working copy)
@@ -1089,11 +1089,21 @@
                __raw_spin_unlock(&new_owner->task->pi_lock);
                goto try_again;
        }
+       /*
+        * Once again the BKL comes to play.  Since the BKL can be grabbed and 
released
+        * out of the normal P1->L1->P2 order, there's a chance that someone 
has the
+        * BKL owner's lock and is waiting on the new owner lock.
+        */
+       if (unlikely(lock == &kernel_sem.lock)) {
+               if (!__raw_spin_trylock(&old_owner->task->pi_lock)) {
+                       __raw_spin_unlock(&new_owner->task->pi_lock);
+                       goto try_again;
+               }
+       } else
 #endif
+               __raw_spin_lock(&old_owner->task->pi_lock);
+
        plist_del_init(&waiter->list, &lock->wait_list);
-
-       __raw_spin_lock(&old_owner->task->pi_lock);
-
        plist_del(&waiter->pi_list, &old_owner->task->pi_waiters);
        plist_init(&waiter->pi_list, waiter->ti->task->prio);
 


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to