blob: a833eb56c80732e5b387a71fe9bcf5c9303a74fe [file] [log] [blame]
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