2.6.15-mm4 failure on power5

Ingo Molnar mingo at elte.hu
Wed Jan 18 18:07:34 EST 2006


* Nathan Lynch <ntl at pobox.com> wrote:

> Dave C Boutcher wrote:
> > On Tue, Jan 17, 2006 at 10:52:44AM -0600, Dave C Boutcher wrote:
> > > Well, it turns out that I've been running with CONFIG_DEBUG_MUTEXES all
> > > along...so no noise.  My console output is a little different that
> > > Serge's, so I think this is timing related.  Also note that I'm dying in
> > > the timer interrupt...
> > 
> > duh... here's the backtrace
> > 0:mon> t
> > [c000000000577890] c0000000000034b4 decrementer_common+0xb4/0x100
> > --- Exception: 901 (Decrementer) at c0000000004627ec
> > .__mutex_lock_interruptible_slowpath+0x3bc/0x4c4
> > [c000000000577c60] c000000000075064 .__lock_cpu_hotplug+0x44/0xa8
> > [c000000000577ce0] c000000000075600 .register_cpu_notifier+0x24/0x68
> > [c000000000577d70] c00000000052cd7c .do_init_bootmem+0x68c/0xab0
> > [c000000000577e50] c000000000522c84 .setup_arch+0x21c/0x2c0
> > [c000000000577ef0] c00000000051a538 .start_kernel+0x40/0x280
> > [c000000000577f90] c000000000008574 .hmt_init+0x0/0x8c
> 
> The mutex debug code (debug_spin_unlock in kernel/mutex-debug.h) is 
> doing a local_irq_enable way before we're ready.
> 
> BTW: I couldn't build powerpc without mutex debugging until I changed 
> the SYNC_ON_SMP in include/asm-powerpc/mutex.h:__mutex_fastpath_unlock 
> to ISYNC_ON_SMP.
> 
> With that change, I was able to boot semi-successfully with mutex 
> debugging off -- the system got hung up when udev started, apparently 
> (or maybe I was too impatient).

ugh! Does the patch below get you a working system with DEBUG_MUTEXES=n?

	Ingo

--

revert the ppc64 mutex fastpath assembly optimizations for now.

Signed-off-by: Ingo Molnar <mingo at elte.hu>

----
 include/asm-powerpc/mutex.h |   85 ++------------------------------------------
 1 files changed, 5 insertions(+), 80 deletions(-)

Index: linux/include/asm-powerpc/mutex.h
===================================================================
--- linux.orig/include/asm-powerpc/mutex.h
+++ linux/include/asm-powerpc/mutex.h
@@ -1,84 +1,9 @@
 /*
- * include/asm-powerpc/mutex.h
+ * Pull in the generic implementation for the mutex fastpath.
  *
- * PowerPC optimized mutex locking primitives
- *
- * Please look into asm-generic/mutex-xchg.h for a formal definition.
- * Copyright (C) 2006 Joel Schopp <jschopp at austin.ibm.com>, IBM
+ * TODO: implement optimized primitives instead, or leave the generic
+ * implementation in place, or pick the atomic_xchg() based generic
+ * implementation. (see asm-generic/mutex-xchg.h for details)
  */
-#ifndef _ASM_MUTEX_H
-#define _ASM_MUTEX_H
-#define __mutex_fastpath_lock(count, fail_fn)\
-do{					\
-	int tmp;			\
-	__asm__ __volatile__(		\
-"1:	lwarx		%0,0,%1\n"	\
-"	addic		%0,%0,-1\n"	\
-"	stwcx.		%0,0,%1\n"	\
-"	bne-		1b\n"		\
-	ISYNC_ON_SMP			\
-	: "=&r" (tmp)			\
-	: "r" (&(count)->counter)	\
-	: "cr0", "memory");		\
-	if (unlikely(tmp < 0))		\
-		fail_fn(count);		\
-} while (0)
-
-#define __mutex_fastpath_unlock(count, fail_fn)\
-do{					\
-	int tmp;			\
-	__asm__ __volatile__(SYNC_ON_SMP\
-"1:	lwarx		%0,0,%1\n"	\
-"	addic		%0,%0,1\n"	\
-"	stwcx.		%0,0,%1\n"	\
-"	bne-		1b\n"		\
-	: "=&r" (tmp)			\
-	: "r" (&(count)->counter)	\
-	: "cr0", "memory");		\
-	if (unlikely(tmp <= 0))		\
-		fail_fn(count);		\
-} while (0)
-
-
-static inline int
-__mutex_fastpath_trylock(atomic_t* count, int (*fail_fn)(atomic_t*))
-{
-	int tmp;
-	__asm__ __volatile__(
-"1:	lwarx		%0,0,%1\n"
-"	cmpwi		0,%0,1\n"
-"	bne-		2f\n"
-"	addic		%0,%0,-1\n"
-"	stwcx.		%0,0,%1\n"
-"	bne-		1b\n"
-"	isync\n"
-"2:"
-	: "=&r" (tmp)
-	: "r" (&(count)->counter)
-	: "cr0", "memory");
-
-	return (int)tmp;
-
-}
-
-#define __mutex_slowpath_needs_to_unlock()		1
 
-static inline int
-__mutex_fastpath_lock_retval(atomic_t* count, int (*fail_fn)(atomic_t *))
-{
-	int tmp;
-	__asm__ __volatile__(
-"1:	lwarx		%0,0,%1\n"
-"	addic		%0,%0,-1\n"
-"	stwcx.		%0,0,%1\n"
-"	bne-		1b\n"
-"	isync		\n"
-	: "=&r" (tmp)
-	: "r" (&(count)->counter)
-	: "cr0", "memory");
-	if (unlikely(tmp < 0))
-		return fail_fn(count);
-	else
-		return 0;
-}
-#endif
+#include <asm-generic/mutex-dec.h>



More information about the Linuxppc64-dev mailing list