diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2007-06-17 15:11:10 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-06-18 12:48:41 -0400 |
commit | bd197234b0a616c8f04f6b682326a5a24b33ca92 (patch) | |
tree | 1c31f8934b0d5472c9038c042ff27d08b52ffdc6 /kernel/rtmutex_common.h | |
parent | 188e1f81ba31af1b65a2f3611df4c670b092bbac (diff) |
Revert "futex_requeue_pi optimization"
This reverts commit d0aa7a70bf03b9de9e995ab272293be1f7937822.
It not only introduced user space visible changes to the futex syscall,
it is also non-functional and there is no way to fix it proper before
the 2.6.22 release.
The breakage report ( http://lkml.org/lkml/2007/5/12/17 ) went
unanswered, and unfortunately it turned out that the concept is not
feasible at all. It violates the rtmutex semantics badly by introducing
a virtual owner, which hacks around the coupling of the user-space
pi_futex and the kernel internal rt_mutex representation.
At the moment the only safe option is to remove it fully as it contains
user-space visible changes to broken kernel code, which we do not want
to expose in the 2.6.22 release.
The patch reverts the original patch mostly 1:1, but contains a couple
of trivial manual cleanups which were necessary due to patches, which
touched the same area of code later.
Verified against the glibc tests and my own PI futex tests.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Ulrich Drepper <drepper@redhat.com>
Cc: Pierre Peiffer <pierre.peiffer@bull.net>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/rtmutex_common.h')
-rw-r--r-- | kernel/rtmutex_common.h | 34 |
1 files changed, 0 insertions, 34 deletions
diff --git a/kernel/rtmutex_common.h b/kernel/rtmutex_common.h index 242ec7ee740b..9c75856e791e 100644 --- a/kernel/rtmutex_common.h +++ b/kernel/rtmutex_common.h | |||
@@ -113,29 +113,6 @@ static inline unsigned long rt_mutex_owner_pending(struct rt_mutex *lock) | |||
113 | } | 113 | } |
114 | 114 | ||
115 | /* | 115 | /* |
116 | * We can speed up the acquire/release, if the architecture | ||
117 | * supports cmpxchg and if there's no debugging state to be set up | ||
118 | */ | ||
119 | #if defined(__HAVE_ARCH_CMPXCHG) && !defined(CONFIG_DEBUG_RT_MUTEXES) | ||
120 | # define rt_mutex_cmpxchg(l,c,n) (cmpxchg(&l->owner, c, n) == c) | ||
121 | static inline void mark_rt_mutex_waiters(struct rt_mutex *lock) | ||
122 | { | ||
123 | unsigned long owner, *p = (unsigned long *) &lock->owner; | ||
124 | |||
125 | do { | ||
126 | owner = *p; | ||
127 | } while (cmpxchg(p, owner, owner | RT_MUTEX_HAS_WAITERS) != owner); | ||
128 | } | ||
129 | #else | ||
130 | # define rt_mutex_cmpxchg(l,c,n) (0) | ||
131 | static inline void mark_rt_mutex_waiters(struct rt_mutex *lock) | ||
132 | { | ||
133 | lock->owner = (struct task_struct *) | ||
134 | ((unsigned long)lock->owner | RT_MUTEX_HAS_WAITERS); | ||
135 | } | ||
136 | #endif | ||
137 | |||
138 | /* | ||
139 | * PI-futex support (proxy locking functions, etc.): | 116 | * PI-futex support (proxy locking functions, etc.): |
140 | */ | 117 | */ |
141 | extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); | 118 | extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); |
@@ -143,15 +120,4 @@ extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, | |||
143 | struct task_struct *proxy_owner); | 120 | struct task_struct *proxy_owner); |
144 | extern void rt_mutex_proxy_unlock(struct rt_mutex *lock, | 121 | extern void rt_mutex_proxy_unlock(struct rt_mutex *lock, |
145 | struct task_struct *proxy_owner); | 122 | struct task_struct *proxy_owner); |
146 | |||
147 | extern void rt_mutex_set_owner(struct rt_mutex *lock, struct task_struct *owner, | ||
148 | unsigned long mask); | ||
149 | extern void __rt_mutex_adjust_prio(struct task_struct *task); | ||
150 | extern int rt_mutex_adjust_prio_chain(struct task_struct *task, | ||
151 | int deadlock_detect, | ||
152 | struct rt_mutex *orig_lock, | ||
153 | struct rt_mutex_waiter *orig_waiter, | ||
154 | struct task_struct *top_task); | ||
155 | extern void remove_waiter(struct rt_mutex *lock, | ||
156 | struct rt_mutex_waiter *waiter); | ||
157 | #endif | 123 | #endif |