lkml.org 
[lkml]   [2006]   [Jan]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: 2.6.15-git7 oopses in ext3 during LTP runs
On St 11-01-06 22:27:55, Arjan van de Ven wrote:
> > We expect the lock to be held on entry. Hence we expect mutex_trylock()
> > to return zero.
>
> you are correct, and the x86-64 mutex.h is buggy
>
> --- linux-2.6.15/include/asm-x86_64/mutex.h.org 2006-01-11 22:25:37.000000000 +0100
> +++ linux-2.6.15/include/asm-x86_64/mutex.h 2006-01-11 22:25:43.000000000 +0100
> @@ -104,7 +104,7 @@
> static inline int
> __mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *))
> {
> - if (likely(atomic_cmpxchg(count, 1, 0)) == 1)
> + if (likely(atomic_cmpxchg(count, 1, 0) == 1))
> return 1;
> else
> return 0;
>
> changes the asm to be the correct one for me.
> This is odd/evil though..

likely is the evil part here. What about this? Should make this bug
impossible to do....

Signed-off-by: Pavel Machek <pavel@suse.cz>

diff --git a/include/linux/compiler.h b/include/linux/compiler.h
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -59,8 +59,8 @@ extern void __chk_io_ptr(void __iomem *)
* specific implementations come from the above header files
*/

-#define likely(x) __builtin_expect(!!(x), 1)
-#define unlikely(x) __builtin_expect(!!(x), 0)
+#define likely(x) (__builtin_expect(!!(x), 1))
+#define unlikely(x) (__builtin_expect(!!(x), 0))

/* Optimization barrier */
#ifndef barrier
diff --git a/kernel/sched.c b/kernel/sched.c
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -367,7 +367,7 @@ repeat_lock_task:
local_irq_save(*flags);
rq = task_rq(p);
spin_lock(&rq->lock);
- if (unlikely(rq != task_rq(p))) {
+ if unlikely(rq != task_rq(p)) {
spin_unlock_irqrestore(&rq->lock, *flags);
goto repeat_lock_task;
}
@@ -751,7 +751,7 @@ static int recalc_task_prio(task_t *p, u
else
sleep_time = (unsigned long)__sleep_time;

- if (likely(sleep_time > 0)) {
+ if likely(sleep_time > 0) {
/*
* User tasks that sleep a long time are categorised as
* idle and will get just interactive status to stay active &
@@ -876,7 +876,7 @@ static void resched_task(task_t *p)

assert_spin_locked(&task_rq(p)->lock);

- if (unlikely(test_tsk_thread_flag(p, TIF_NEED_RESCHED)))
+ if unlikely(test_tsk_thread_flag(p, TIF_NEED_RESCHED))
return;

set_tsk_thread_flag(p, TIF_NEED_RESCHED);

--
Thanks, Sharp!
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-01-11 23:42    [W:0.077 / U:0.472 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site