| From 78e651a0c9a7863c237410a8f8485ff98a1f3c70 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Fri, 3 Jul 2009 08:44:23 -0500 |
| Subject: [PATCH] rtmutex: cleanup the adaptive spin code |
| |
| commit edeb8fe63dce75e827a27292a186b98fe3d26959 in tip. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Ingo Molnar <mingo@elte.hu> |
| |
| diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c |
| index 4d53d03..b649eb0 100644 |
| --- a/kernel/rtmutex.c |
| +++ b/kernel/rtmutex.c |
| @@ -708,41 +708,22 @@ update_current(unsigned long new_state, unsigned long *saved_state) |
| static int adaptive_wait(struct rt_mutex_waiter *waiter, |
| struct task_struct *orig_owner) |
| { |
| - int sleep = 0; |
| - |
| for (;;) { |
| |
| /* we are the owner? */ |
| if (!waiter->task) |
| - break; |
| + return 0; |
| |
| - /* |
| - * We need to read the owner of the lock and then check |
| - * its state. But we can't let the owner task be freed |
| - * while we read the state. We grab the rcu_lock and |
| - * this makes sure that the owner task wont disappear |
| - * between testing that it still has the lock, and checking |
| - * its state. |
| - */ |
| - rcu_read_lock(); |
| /* Owner changed? Then lets update the original */ |
| - if (orig_owner != rt_mutex_owner(waiter->lock)) { |
| - rcu_read_unlock(); |
| - break; |
| - } |
| + if (orig_owner != rt_mutex_owner(waiter->lock)) |
| + return 0; |
| |
| /* Owner went to bed, so should we */ |
| - if (!task_is_current(orig_owner)) { |
| - sleep = 1; |
| - rcu_read_unlock(); |
| - break; |
| - } |
| - rcu_read_unlock(); |
| + if (!task_is_current(orig_owner)) |
| + return 1; |
| |
| cpu_relax(); |
| } |
| - |
| - return sleep; |
| } |
| #else |
| static int adaptive_wait(struct rt_mutex_waiter *waiter, |
| @@ -820,11 +801,13 @@ rt_spin_lock_slowlock(struct rt_mutex *lock) |
| */ |
| current->lock_depth = -1; |
| orig_owner = rt_mutex_owner(lock); |
| + get_task_struct(orig_owner); |
| raw_spin_unlock_irqrestore(&lock->wait_lock, flags); |
| |
| debug_rt_mutex_print_deadlock(&waiter); |
| |
| if (adaptive_wait(&waiter, orig_owner)) { |
| + put_task_struct(orig_owner); |
| update_current(TASK_UNINTERRUPTIBLE, &saved_state); |
| /* |
| * The xchg() in update_current() is an implicit |
| @@ -833,7 +816,8 @@ rt_spin_lock_slowlock(struct rt_mutex *lock) |
| */ |
| if (waiter.task) |
| schedule_rt_mutex(lock); |
| - } |
| + } else |
| + put_task_struct(orig_owner); |
| |
| raw_spin_lock_irqsave(&lock->wait_lock, flags); |
| current->lock_depth = saved_lock_depth; |
| -- |
| 1.7.1.1 |
| |