From edcf84733cc5b8eb98996c32b176d122606c5d33001a5c3a3c70009484db9236 Mon Sep 17 00:00:00 2001 From: Andreas Jaeger Date: Tue, 3 Jan 2012 10:00:11 +0000 Subject: [PATCH] Accepting request 98594 from home:a_jaeger:my-factory-packages Fix a few bugs. OBS-URL: https://build.opensuse.org/request/show/98594 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=146 --- glibc-2.15-2ba92745c36e.tar.bz2 | 3 + glibc-2.15-c0da14cdda1f.tar.bz2 | 3 - glibc.changes | 13 ++ glibc.spec | 7 +- pthread-cond-wait-revert.patch | 252 ++++++++++++++++++++++++++++++++ 5 files changed, 273 insertions(+), 5 deletions(-) create mode 100644 glibc-2.15-2ba92745c36e.tar.bz2 delete mode 100644 glibc-2.15-c0da14cdda1f.tar.bz2 create mode 100644 pthread-cond-wait-revert.patch diff --git a/glibc-2.15-2ba92745c36e.tar.bz2 b/glibc-2.15-2ba92745c36e.tar.bz2 new file mode 100644 index 0000000..17609ea --- /dev/null +++ b/glibc-2.15-2ba92745c36e.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65aacbb4b5218b686da63994150e7e34e71d85c45cc7c264b1d6ee55207d0b05 +size 15776871 diff --git a/glibc-2.15-c0da14cdda1f.tar.bz2 b/glibc-2.15-c0da14cdda1f.tar.bz2 deleted file mode 100644 index 6353a1f..0000000 --- a/glibc-2.15-c0da14cdda1f.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb2366b1bf2bdf00c63c2f2be91ef41fe3bde49d898e1b1c7e53fc31fc34c58f -size 15776360 diff --git a/glibc.changes b/glibc.changes index e9986ec..b410176 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Tue Jan 3 08:40:28 UTC 2012 - aj@suse.de + +- Update to 2ba92745c36e: + - Update copyright years + - Fix miscompilation of posix/regex_internal.c with GCC 4.7. + +------------------------------------------------------------------- +Tue Jan 3 08:23:44 UTC 2012 - aj@suse.de + +- Revert pthread-cond-wait change for now since it causes hangs + (patch pthread-cond-wait-revert.patch). + ------------------------------------------------------------------- Mon Dec 26 12:53:55 UTC 2011 - aj@suse.de diff --git a/glibc.spec b/glibc.spec index 1a6e9e4..14b075c 100644 --- a/glibc.spec +++ b/glibc.spec @@ -1,7 +1,7 @@ # # spec file for package glibc # -# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -79,7 +79,7 @@ Obsoletes: glibc-32bit %endif Version: 2.15 Release: 11 -%define git_id c0da14cdda1f +%define git_id 2ba92745c36e %define glibc_ports_ver 2.15 %define ports_git_id 8a70b2dcabbf Url: http://www.gnu.org/software/libc/libc.html @@ -196,6 +196,8 @@ Patch82: crypt_blowfish-1.2-hack_around_arm.diff Patch84: nscd-avoid-gcc-warning.diff # PATCH-FIX-OPENSUSE fixed build-compare by omitting one more date - meissner@suse.de Patch87: glibc-nodate.patch +# PATCH-FIX-OPENSUSE revert pthread-cond-wait change since it causes hangs +Patch88: pthread-cond-wait-revert.patch %description The GNU C Library provides the most important standard libraries used @@ -413,6 +415,7 @@ rm nscd/s-stamp %patch75 -p1 %patch84 %patch87 -p0 +%patch88 -p1 -R # # Inconsistency detected by ld.so: dl-close.c: 719: _dl_close: Assertion `map->l_init_called' failed! diff --git a/pthread-cond-wait-revert.patch b/pthread-cond-wait-revert.patch new file mode 100644 index 0000000..5f70d87 --- /dev/null +++ b/pthread-cond-wait-revert.patch @@ -0,0 +1,252 @@ +http://sourceware.org/ml/libc-alpha/2012-01/msg00002.html + +The following patch: +Has been reported as causing numerous problems in Fedora & Debian. I +don't think anyone has done any serious analysis of the issue, but the +patch has been pulled from both distributions because of the +instability it's introduced. + +https://bugzilla.redhat.com/show_bug.cgi?id=769421 +http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=651899 + + +commit c5a0802a682dba23f92d47f0f99775aebfbe2539 +Author: Andreas Schwab +Date: Mon Nov 28 13:38:19 2011 +0100 + + Handle EAGAIN from FUTEX_WAIT_REQUEUE_PI + +2011-11-28 Andreas Schwab + + * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Handle + EAGAIN from FUTEX_WAIT_REQUEUE_PI. + * sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Likewise. + +diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S +index 53970d7..54590b7 100644 +--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S ++++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S +@@ -134,6 +134,7 @@ __pthread_cond_wait: + cmpl $PI_BIT, %eax + jne 18f + ++90: + movl $(FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG), %ecx + movl %ebp, %edx + xorl %esi, %esi +@@ -147,6 +148,9 @@ __pthread_cond_wait: + sete 16(%esp) + je 19f + ++ cmpl $-EAGAIN, %eax ++ je 91f ++ + /* Normal and PI futexes dont mix. Use normal futex functions only + if the kernel does not support the PI futex functions. */ + cmpl $-ENOSYS, %eax +@@ -391,6 +395,78 @@ __pthread_cond_wait: + #endif + call __lll_unlock_wake + jmp 11b ++ ++91: ++.LcleanupSTART2: ++ /* FUTEX_WAIT_REQUEUE_PI returned EAGAIN. We need to ++ call it again. */ ++ ++ /* Get internal lock. */ ++ movl $1, %edx ++ xorl %eax, %eax ++ LOCK ++#if cond_lock == 0 ++ cmpxchgl %edx, (%ebx) ++#else ++ cmpxchgl %edx, cond_lock(%ebx) ++#endif ++ jz 92f ++ ++#if cond_lock == 0 ++ movl %ebx, %edx ++#else ++ leal cond_lock(%ebx), %edx ++#endif ++#if (LLL_SHARED-LLL_PRIVATE) > 255 ++ xorl %ecx, %ecx ++#endif ++ cmpl $-1, dep_mutex(%ebx) ++ setne %cl ++ subl $1, %ecx ++ andl $(LLL_SHARED-LLL_PRIVATE), %ecx ++#if LLL_PRIVATE != 0 ++ addl $LLL_PRIVATE, %ecx ++#endif ++ call __lll_lock_wait ++ ++92: ++ /* Increment the cond_futex value again, so it can be used as a new ++ expected value. */ ++ addl $1, cond_futex(%ebx) ++ movl cond_futex(%ebx), %ebp ++ ++ /* Unlock. */ ++ LOCK ++#if cond_lock == 0 ++ subl $1, (%ebx) ++#else ++ subl $1, cond_lock(%ebx) ++#endif ++ je 93f ++#if cond_lock == 0 ++ movl %ebx, %eax ++#else ++ leal cond_lock(%ebx), %eax ++#endif ++#if (LLL_SHARED-LLL_PRIVATE) > 255 ++ xorl %ecx, %ecx ++#endif ++ cmpl $-1, dep_mutex(%ebx) ++ setne %cl ++ subl $1, %ecx ++ andl $(LLL_SHARED-LLL_PRIVATE), %ecx ++#if LLL_PRIVATE != 0 ++ addl $LLL_PRIVATE, %ecx ++#endif ++ call __lll_unlock_wake ++ ++93: ++ /* Set the rest of SYS_futex args for FUTEX_WAIT_REQUEUE_PI. */ ++ xorl %ecx, %ecx ++ movl dep_mutex(%ebx), %edi ++ jmp 90b ++.LcleanupEND2: ++ + .size __pthread_cond_wait, .-__pthread_cond_wait + versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait, + GLIBC_2_3_2) +@@ -563,6 +639,10 @@ __condvar_w_cleanup: + .long .LcleanupEND-.Lsub_cond_futex + .long __condvar_w_cleanup-.LSTARTCODE + .uleb128 0 ++ .long .LcleanupSTART2-.LSTARTCODE ++ .long .LcleanupEND2-.LcleanupSTART2 ++ .long __condvar_w_cleanup-.LSTARTCODE ++ .uleb128 0 + .long .LcallUR-.LSTARTCODE + .long .LENDCODE-.LcallUR + .long 0 +diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S +index 7535baa..d837d15 100644 +--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S ++++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + + #include + +@@ -133,11 +134,14 @@ __pthread_cond_wait: + cmpl $PI_BIT, %eax + jne 61f + ++90: + movl $(FUTEX_WAIT_REQUEUE_PI|FUTEX_PRIVATE_FLAG), %esi + movl $SYS_futex, %eax + syscall + + movl $1, %r8d ++ cmpq $-EAGAIN, %rax ++ je 91f + #ifdef __ASSUME_REQUEUE_PI + jmp 62f + #else +@@ -324,6 +328,70 @@ __pthread_cond_wait: + + 13: movq %r10, %rax + jmp 14b ++ ++91: ++.LcleanupSTART2: ++ /* FUTEX_WAIT_REQUEUE_PI returned EAGAIN. We need to ++ call it again. */ ++ movq 8(%rsp), %rdi ++ ++ /* Get internal lock. */ ++ movl $1, %esi ++ xorl %eax, %eax ++ LOCK ++#if cond_lock == 0 ++ cmpxchgl %esi, (%rdi) ++#else ++ cmpxchgl %esi, cond_lock(%rdi) ++#endif ++ jz 92f ++ ++#if cond_lock != 0 ++ addq $cond_lock, %rdi ++#endif ++ cmpq $-1, dep_mutex-cond_lock(%rdi) ++ movl $LLL_PRIVATE, %eax ++ movl $LLL_SHARED, %esi ++ cmovne %eax, %esi ++ callq __lll_lock_wait ++#if cond_lock != 0 ++ subq $cond_lock, %rdi ++#endif ++92: ++ /* Increment the cond_futex value again, so it can be used as a new ++ expected value. */ ++ incl cond_futex(%rdi) ++ movl cond_futex(%rdi), %edx ++ ++ /* Release internal lock. */ ++ LOCK ++#if cond_lock == 0 ++ decl (%rdi) ++#else ++ decl cond_lock(%rdi) ++#endif ++ jz 93f ++ ++#if cond_lock != 0 ++ addq $cond_lock, %rdi ++#endif ++ cmpq $-1, dep_mutex-cond_lock(%rdi) ++ movl $LLL_PRIVATE, %eax ++ movl $LLL_SHARED, %esi ++ cmovne %eax, %esi ++ /* The call preserves %rdx. */ ++ callq __lll_unlock_wake ++#if cond_lock != 0 ++ subq $cond_lock, %rdi ++#endif ++93: ++ /* Set the rest of SYS_futex args for FUTEX_WAIT_REQUEUE_PI. */ ++ xorq %r10, %r10 ++ movq dep_mutex(%rdi), %r8 ++ leaq cond_futex(%rdi), %rdi ++ jmp 90b ++.LcleanupEND2: ++ + .size __pthread_cond_wait, .-__pthread_cond_wait + versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait, + GLIBC_2_3_2) +@@ -476,11 +544,15 @@ __condvar_cleanup1: + .uleb128 .LcleanupSTART-.LSTARTCODE + .uleb128 .LcleanupEND-.LcleanupSTART + .uleb128 __condvar_cleanup1-.LSTARTCODE +- .uleb128 0 ++ .uleb128 0 ++ .uleb128 .LcleanupSTART2-.LSTARTCODE ++ .uleb128 .LcleanupEND2-.LcleanupSTART2 ++ .uleb128 __condvar_cleanup1-.LSTARTCODE ++ .uleb128 0 + .uleb128 .LcallUR-.LSTARTCODE + .uleb128 .LENDCODE-.LcallUR + .uleb128 0 +- .uleb128 0 ++ .uleb128 0 + .Lcstend: + +