blob: dc33b178c240d46bbf66cb8bc3a2ea458e8d2293 [file] [log] [blame]
From ca8acdc21b78d41b2e0f64f0ce0693a775c41694 Mon Sep 17 00:00:00 2001
From: Paul Gortmaker <paul.gortmaker@windriver.com>
Date: Mon, 17 Jan 2011 20:56:11 -0500
Subject: [PATCH] rt: trash the Linux Semaphores implemented via RT-mutexes
This is one of several extractions from the merge up to 33-rc8.
Best seen in the tip repo with:
git diff 5f854cfc024622e4aae14d7cf422f6ff86278688^1 \
5f854cfc024622e4aae14d7cf422f6ff86278688 kernel/rt.c
i.e. show the difference between the 1st parent of the merge
(which is kernel.org default) and the code after the change.
You can find the origin of this change in the tip merge commit:
commit 5f854cfc024622e4aae14d7cf422f6ff86278688
Merge: cc24da0 4ec62b2
Author: Thomas Gleixner <tglx@linutronix.de>
Date: Sun Feb 21 20:17:22 2010 +0100
Forward to 2.6.33-rc8
Merge branch 'linus' into rt/head with a pile of conflicts.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Normally there are not significant changes/additions in a merge commit that
are not from any other "normal" commit. But in this case there are, so
break them out into separate explicit commits.
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
diff --git a/kernel/rt.c b/kernel/rt.c
index fd033a9..ccbf20f 100644
--- a/kernel/rt.c
+++ b/kernel/rt.c
@@ -408,139 +408,6 @@ void __rt_rwsem_init(struct rw_semaphore *rwsem, char *name,
}
EXPORT_SYMBOL(__rt_rwsem_init);
-/*
- * Semaphores
- */
-/*
- * Linux Semaphores implemented via RT-mutexes.
- *
- * In the down() variants we use the mutex as the semaphore blocking
- * object: we always acquire it, decrease the counter and keep the lock
- * locked if we did the 1->0 transition. The next down() will then block.
- *
- * In the up() path we atomically increase the counter and do the
- * unlock if we were the one doing the 0->1 transition.
- */
-
-static inline void __down_complete(struct semaphore *sem)
-{
- int count = atomic_dec_return(&sem->count);
-
- if (unlikely(count > 0))
- rt_mutex_unlock(&sem->lock);
-}
-
-void rt_down(struct semaphore *sem)
-{
- rt_mutex_lock(&sem->lock);
- __down_complete(sem);
-}
-EXPORT_SYMBOL(rt_down);
-
-int rt_down_interruptible(struct semaphore *sem)
-{
- int ret;
-
- ret = rt_mutex_lock_interruptible(&sem->lock, 0);
- if (ret)
- return ret;
- __down_complete(sem);
- return 0;
-}
-EXPORT_SYMBOL(rt_down_interruptible);
-
-int rt_down_timeout(struct semaphore *sem, long jiff)
-{
- struct hrtimer_sleeper t;
- struct timespec ts;
- unsigned long expires = jiffies + jiff + 1;
- int ret;
-
- /*
- * rt_mutex_slowlock can use an interruptible, but this needs to
- * be TASK_INTERRUPTIBLE. The down_timeout uses TASK_UNINTERRUPTIBLE.
- * To handle this we loop if a signal caused the timeout and the
- * we recalculate the new timeout.
- * Yes Thomas, this is a hack! But we can fix it right later.
- */
- do {
- jiffies_to_timespec(jiff, &ts);
- hrtimer_init_on_stack(&t.timer, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
- t.timer._expires = timespec_to_ktime(ts);
-
- ret = rt_mutex_timed_lock(&sem->lock, &t, 0);
- if (ret != -EINTR)
- break;
-
- /* signal occured, but the down_timeout doesn't handle them */
- jiff = expires - jiffies;
-
- } while (jiff > 0);
-
- if (!ret)
- __down_complete(sem);
- else
- ret = -ETIME;
-
- return ret;
-}
-EXPORT_SYMBOL(rt_down_timeout);
-
-/*
- * try to down the semaphore, 0 on success and 1 on failure. (inverted)
- */
-int rt_down_trylock(struct semaphore *sem)
-{
- /*
- * Here we are a tiny bit different from ordinary Linux semaphores,
- * because we can get 'transient' locking-failures when say a
- * process decreases the count from 9 to 8 and locks/releases the
- * embedded mutex internally. It would be quite complex to remove
- * these transient failures so lets try it the simple way first:
- */
- if (rt_mutex_trylock(&sem->lock)) {
- __down_complete(sem);
- return 0;
- }
- return 1;
-}
-EXPORT_SYMBOL(rt_down_trylock);
-
-void rt_up(struct semaphore *sem)
-{
- int count;
-
- /*
- * Disable preemption to make sure a highprio trylock-er cannot
- * preempt us here and get into an infinite loop:
- */
- preempt_disable();
- count = atomic_inc_return(&sem->count);
- /*
- * If we did the 0 -> 1 transition then we are the ones to unlock it:
- */
- if (likely(count == 1))
- rt_mutex_unlock(&sem->lock);
- preempt_enable();
-}
-EXPORT_SYMBOL(rt_up);
-
-void __sema_init(struct semaphore *sem, int val,
- char *name, char *file, int line)
-{
- atomic_set(&sem->count, val);
- switch (val) {
- case 0:
- __rt_mutex_init(&sem->lock, name);
- rt_mutex_lock(&sem->lock);
- break;
- default:
- __rt_mutex_init(&sem->lock, name);
- break;
- }
-}
-EXPORT_SYMBOL(__sema_init);
-
/**
* atomic_dec_and_mutex_lock - return holding mutex if we dec to 0
* @cnt: the atomic which we are to dec
--
1.7.1.1