[glibc/f16] - Handle EAGAIN from FUTEX_WAIT_REQUEUE_PI (#552960) - Add {dist} - Correct return value from

Jeffrey Law law at fedoraproject.org
Fri Dec 16 04:56:54 UTC 2011


commit 73a44fd641e793a360bd1fbd6ef24457cea97697
Author: Jeff Law <law at redhat.com>
Date:   Thu Dec 15 21:56:41 2011 -0700

      - Handle EAGAIN from FUTEX_WAIT_REQUEUE_PI (#552960)
      - Add {dist}
      - Correct return value from pthread_create when stack alloction fails.

 glibc-rh552960.patch |  226 ++++++++++++++++++++++++++++++++++++++++++++++++++
 glibc-rh767746.patch |   14 +++
 glibc.spec           |   11 ++-
 3 files changed, 250 insertions(+), 1 deletions(-)
---
diff --git a/glibc-rh552960.patch b/glibc-rh552960.patch
new file mode 100644
index 0000000..96e2c8c
--- /dev/null
+++ b/glibc-rh552960.patch
@@ -0,0 +1,226 @@
+diff -rup a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S
+--- a/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S	2011-12-15 10:45:09.759232551 -0700
++++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S	2011-12-15 15:11:57.534479377 -0700
+@@ -137,6 +137,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
+@@ -150,6 +151,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
+@@ -394,6 +398,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)
+@@ -566,6 +642,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 -rup a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S
+--- a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S	2011-12-15 10:45:09.764232551 -0700
++++ b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S	2011-12-15 15:12:49.287474417 -0700
+@@ -23,6 +23,7 @@
+ #include <lowlevelcond.h>
+ #include <tcb-offsets.h>
+ #include <pthread-pi-defines.h>
++#include <pthread-errnos.h>
+ #include <stap-probe.h>
+ 
+ #include <kernel-features.h>
+@@ -136,11 +137,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
+@@ -327,6 +331,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)
+@@ -479,11 +547,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:
+ 
+ 
diff --git a/glibc-rh767746.patch b/glibc-rh767746.patch
new file mode 100644
index 0000000..58d96d8
--- /dev/null
+++ b/glibc-rh767746.patch
@@ -0,0 +1,14 @@
+--- a/nptl/pthread_create.c	2011-12-13 11:41:37.000000000 -0700
++++ b/nptl/pthread_create.c	2011-12-14 10:03:13.000000000 -0700
+@@ -440,8 +440,9 @@
+   int err = ALLOCATE_STACK (iattr, &pd);
+   if (__builtin_expect (err != 0, 0))
+     /* Something went wrong.  Maybe a parameter of the attributes is
+-       invalid or we could not allocate memory.  */
+-    return err;
++       invalid or we could not allocate memory.  Note we have to
++       translate error codes.  */
++    return err == ENOMEM ? EAGAIN : err;
+ 
+ 
+   /* Initialize the TCB.  All initializations with zero should be
diff --git a/glibc.spec b/glibc.spec
index f6b0f8b..07bdf9b 100644
--- a/glibc.spec
+++ b/glibc.spec
@@ -28,7 +28,7 @@
 Summary: The GNU libc libraries
 Name: glibc
 Version: %{glibcversion}
-Release: 23
+Release: 24%{?dist}
 # GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
 # Things that are linked directly into dynamically linked programs
 # and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
@@ -52,6 +52,8 @@ Patch8: %{name}-fdelt.patch
 Patch9: %{name}-rh708455.patch
 Patch10: %{name}-rh750811.patch
 Patch11: %{name}-rh758252.patch
+Patch12: %{name}-rh767746.patch
+Patch13: %{name}-rh552960.patch
 Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 Obsoletes: glibc-profile < 2.4
 Obsoletes: nss_db
@@ -280,6 +282,8 @@ rm -rf %{glibcportsdir}
 %patch9 -p1
 %patch10 -p1
 %patch11 -p1
+%patch12 -p1
+%patch13 -p1
 
 # A lot of programs still misuse memcpy when they have to use
 # memmove. The memcpy implementation below is not tolerant at
@@ -1132,6 +1136,11 @@ rm -f *.filelist*
 %endif
 
 %changelog
+* Thu Dec 15 2011 Jeff Law <law at redhat.com> - 2.14.90-24
+  - Handle EAGAIN from FUTEX_WAIT_REQUEUE_PI (#552960)
+  - Add {dist}
+  - Correct return value from pthread_create when stack alloction fails.
+
 * Wed Dec 7 2011 Jeff Law <law at redhat.com> - 2.14.90-23
   - Fix a wrong constant in powerpc hypot implementation (#750811)
     #13534 in python bug database


More information about the scm-commits mailing list