From: Oleg Nesterov On top of Steven's rtmutex-clean-up-and-remove-some-extra-spinlocks.patch There are still 2 get_task_struct()s under ->pi_lock. Imho, this is confusing. Move them outside of ->pi_lock protected section. The task can't go away, otherwise it was unsafe to take task->pi_lock. Signed-off-by: Oleg Nesterov Cc: Steven Rostedt Cc: Ingo Molnar Cc: Thomas Gleixner Cc: Esben Nielsen Signed-off-by: Andrew Morton --- kernel/rtmutex.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff -puN kernel/rtmutex.c~rtmutex-clean-up-and-remove-some-extra-spinlocks-more kernel/rtmutex.c --- a/kernel/rtmutex.c~rtmutex-clean-up-and-remove-some-extra-spinlocks-more +++ a/kernel/rtmutex.c @@ -251,6 +251,7 @@ static int rt_mutex_adjust_prio_chain(st /* Grab the next task */ task = rt_mutex_owner(lock); + get_task_struct(task); spin_lock_irqsave(&task->pi_lock, flags); if (waiter == rt_mutex_top_waiter(lock)) { @@ -269,7 +270,6 @@ static int rt_mutex_adjust_prio_chain(st __rt_mutex_adjust_prio(task); } - get_task_struct(task); spin_unlock_irqrestore(&task->pi_lock, flags); top_waiter = rt_mutex_top_waiter(lock); @@ -591,10 +591,10 @@ void rt_mutex_adjust_pi(struct task_stru return; } - /* gets dropped in rt_mutex_adjust_prio_chain()! */ - get_task_struct(task); spin_unlock_irqrestore(&task->pi_lock, flags); + /* gets dropped in rt_mutex_adjust_prio_chain()! */ + get_task_struct(task); rt_mutex_adjust_prio_chain(task, 0, NULL, NULL, task); } _