hehe, I can almost follow this code :-)
How about something like this on top? --- --- a/kernel/locking/rtmutex.c +++ b/kernel/locking/rtmutex.c @@ -260,6 +260,11 @@ static void rt_mutex_adjust_prio(struct */ int max_lock_depth = 1024; +static inline struct rt_mutex *task_blocked_on(struct task_struct *p) +{ + return p->pi_blocked_on ? p->pi_blocked_on->lock : NULL; +} + /* * Adjust the priority chain. Also used for deadlock detection. * Decreases task's usage by one - may thus free the task. @@ -443,10 +448,7 @@ static int rt_mutex_adjust_prio_chain(st * blocked itself. If yes we store a pointer to the lock for * the lock chain change detection above. */ - if (task->pi_blocked_on) - next_lock = task->pi_blocked_on->lock; - else - next_lock = NULL; + next_lock = task_blocked_on(task); raw_spin_unlock_irqrestore(&task->pi_lock, flags); @@ -569,7 +571,7 @@ static int task_blocks_on_rt_mutex(struc { struct task_struct *owner = rt_mutex_owner(lock); struct rt_mutex_waiter *top_waiter = waiter; - struct rt_mutex *next_lock = NULL; + struct rt_mutex *next_lock; unsigned long flags; int chain_walk, res; @@ -614,8 +616,8 @@ static int task_blocks_on_rt_mutex(struc } else if (debug_rt_mutex_detect_deadlock(waiter, detect_deadlock)) { chain_walk = 1; } - if (owner->pi_blocked_on) - next_lock = owner->pi_blocked_on->lock; + + next_lock = task_blocked_on(owner); raw_spin_unlock_irqrestore(&owner->pi_lock, flags); if (!chain_walk) @@ -705,8 +707,7 @@ static void remove_waiter(struct rt_mute } __rt_mutex_adjust_prio(owner); - if (owner->pi_blocked_on) - next_lock = owner->pi_blocked_on->lock; + next_lock = task_blocked_on(owner); raw_spin_unlock_irqrestore(&owner->pi_lock, flags); }
pgpCWhvdMKb9P.pgp
Description: PGP signature