On Thu, 2008-10-30 at 14:12 +0100, Pierre Habouzit wrote:
> On Thu, Oct 30, 2008 at 12:44:35PM +0000, Martin Schwidefsky wrote:
> > On Mon, 2008-10-27 at 19:59 +0100, Julien Danjou wrote:
> > > At 1225129482 time_t, Moritz Muehlenhoff wrote:
> > > > Maybe we could forward this bug to Martin Schwidefsky <[EMAIL 
> > > > PROTECTED]>,
> > > > who is the glibc s390 maintainer and who works for IBM on the s390 
> > > > Linux port.
> > > 
> > > Why not.
> > > 
> > > Martin, do you have any clue about bug #479952?
> > > 
> > > http://bugs.debian.org/479952
> > 
> > This does look familiar, I've seen this some years ago with broken
> > locking primivites in the nptl lowlevellock implementation. Could you
> > check your copy of glibc to verify if the locking inline assemblies in
> > nptl/sysdeps/unix/sysv/linux/s390/lowlevellock.h all have the "memory"
> > clobber? This has been the bug last time. Just for information I'm
> > currently on travel and will read my mail only randomly.
> 
> They all have the memory constraint.

In the meantime Michael Matz from Novell found the problem: the
__lll_lock Funktion uses atomic_compare_and_exchange_bool_acq which uses
the __arch_compare_and_exchange_val_32_acq function which does NOT have
a "memory" clobber. The patch below should fix the problem

-- 
blue skies,
  Martin.

"Reality continues to ruin my life." - Calvin.

---
diff -urpN libc/sysdeps/s390/bits/atomic.h libc-s390/sysdeps/s390/bits/atomic.h
--- libc/sysdeps/s390/bits/atomic.h     2003-05-05 20:20:54.000000000 +0200
+++ libc-s390/sysdeps/s390/bits/atomic.h        2008-11-03 10:56:20.000000000 
+0100
@@ -56,7 +56,7 @@ typedef uintmax_t uatomic_max_t;
      __typeof (*mem) __archold = (oldval);                                   \
      __asm __volatile ("cs %0,%2,%1"                                         \
                       : "+d" (__archold), "=Q" (*__archmem)                  \
-                      : "d" (newval), "m" (*__archmem) : "cc" );             \
+                      : "d" (newval), "m" (*__archmem) : "cc", "memory" );   \
      __archold; })
 
 #ifdef __s390x__
@@ -65,7 +65,8 @@ typedef uintmax_t uatomic_max_t;
      __typeof (*mem) __archold = (oldval);                                   \
      __asm __volatile ("csg %0,%2,%1"                                        \
                       : "+d" (__archold), "=Q" (*__archmem)                  \
-                      : "d" ((long) (newval)), "m" (*__archmem) : "cc" );    \
+                      : "d" ((long) (newval)), "m" (*__archmem)              \
+                      : "cc", "memory" );                                    \
      __archold; })
 #else
 /* For 31 bit we do not really need 64-bit compare-and-exchange. We can





-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to