forked from pool/glibc
Accepting request 336473 from home:michel_mno:branches:Base:System
- new patch [BZ #18743] PowerPC: Fix a race condition when eliding a lock 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch related to openSUSE boo#923486 OBS-URL: https://build.opensuse.org/request/show/336473 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=417
This commit is contained in:
parent
82cb193ae9
commit
dcc3753b29
@ -0,0 +1,152 @@
|
|||||||
|
From: Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
|
||||||
|
Date: Thu, 30 Jul 2015 13:48:56 -0300
|
||||||
|
Subject: [PATCH][BZ 18743] PowerPC: Fix a race condition when eliding a lock
|
||||||
|
|
||||||
|
[PATCH][BZ 18743] PowerPC: Fix a race condition when eliding a lock
|
||||||
|
|
||||||
|
The previous code used to evaluate the preprocessor token is_lock_free to
|
||||||
|
a variable before starting a transaction. This behavior can cause an
|
||||||
|
error if another thread got the lock (without using a transaction)
|
||||||
|
between the conversion of the token and the beginning of the transaction.
|
||||||
|
|
||||||
|
This patch delays the evaluation of is_lock_free to inside a transaction
|
||||||
|
by moving this part of the code to the macro ELIDE_LOCK.
|
||||||
|
|
||||||
|
2015-07-30 Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
|
||||||
|
|
||||||
|
[BZ #18743]
|
||||||
|
* sysdeps/powerpc/nptl/elide.h (__elide_lock): Move most of this
|
||||||
|
code to...
|
||||||
|
(ELIDE_LOCK): ...here.
|
||||||
|
(__get_new_count): New function with part of the code from
|
||||||
|
__elide_lock that updates the value of adapt_count after a
|
||||||
|
transaction abort.
|
||||||
|
(__elided_trylock): Moved this code to...
|
||||||
|
(ELIDE_TRYLOCK): ...here.
|
||||||
|
|
||||||
|
Signed-off-by: Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
|
||||||
|
Signed-off-by: Michel Normand <normand@linux.vnet.ibm.com>
|
||||||
|
Index: glibc-2.22/sysdeps/powerpc/nptl/elide.h
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.22.orig/sysdeps/powerpc/nptl/elide.h
|
||||||
|
+++ glibc-2.22/sysdeps/powerpc/nptl/elide.h
|
||||||
|
@@ -23,67 +23,67 @@
|
||||||
|
# include <htm.h>
|
||||||
|
# include <elision-conf.h>
|
||||||
|
|
||||||
|
-/* Returns true if the lock defined by is_lock_free as elided.
|
||||||
|
- ADAPT_COUNT is a pointer to per-lock state variable. */
|
||||||
|
-
|
||||||
|
+/* Get the new value of adapt_count according to the elision
|
||||||
|
+ configurations. Returns true if the system should retry again or false
|
||||||
|
+ otherwise. */
|
||||||
|
static inline bool
|
||||||
|
-__elide_lock (uint8_t *adapt_count, int is_lock_free)
|
||||||
|
+__get_new_count (uint8_t *adapt_count)
|
||||||
|
{
|
||||||
|
- if (*adapt_count > 0)
|
||||||
|
+ /* A persistent failure indicates that a retry will probably
|
||||||
|
+ result in another failure. Use normal locking now and
|
||||||
|
+ for the next couple of calls. */
|
||||||
|
+ if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ()))
|
||||||
|
{
|
||||||
|
- (*adapt_count)--;
|
||||||
|
+ if (__elision_aconf.skip_lock_internal_abort > 0)
|
||||||
|
+ *adapt_count = __elision_aconf.skip_lock_internal_abort;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- for (int i = __elision_aconf.try_tbegin; i > 0; i--)
|
||||||
|
- {
|
||||||
|
- if (__builtin_tbegin (0))
|
||||||
|
- {
|
||||||
|
- if (is_lock_free)
|
||||||
|
- return true;
|
||||||
|
- /* Lock was busy. */
|
||||||
|
- __builtin_tabort (_ABORT_LOCK_BUSY);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- /* A persistent failure indicates that a retry will probably
|
||||||
|
- result in another failure. Use normal locking now and
|
||||||
|
- for the next couple of calls. */
|
||||||
|
- if (_TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ()))
|
||||||
|
- {
|
||||||
|
- if (__elision_aconf.skip_lock_internal_abort > 0)
|
||||||
|
- *adapt_count = __elision_aconf.skip_lock_internal_abort;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- /* Same logic as above, but for a number of temporary failures in a
|
||||||
|
- a row. */
|
||||||
|
- else if (__elision_aconf.skip_lock_out_of_tbegin_retries > 0
|
||||||
|
- && __elision_aconf.try_tbegin > 0)
|
||||||
|
- *adapt_count = __elision_aconf.skip_lock_out_of_tbegin_retries;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return false;
|
||||||
|
+ /* Same logic as above, but for a number of temporary failures in a
|
||||||
|
+ a row. */
|
||||||
|
+ else if (__elision_aconf.skip_lock_out_of_tbegin_retries > 0
|
||||||
|
+ && __elision_aconf.try_tbegin > 0)
|
||||||
|
+ *adapt_count = __elision_aconf.skip_lock_out_of_tbegin_retries;
|
||||||
|
+ return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
-# define ELIDE_LOCK(adapt_count, is_lock_free) \
|
||||||
|
- __elide_lock (&(adapt_count), is_lock_free)
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-static inline bool
|
||||||
|
-__elide_trylock (uint8_t *adapt_count, int is_lock_free, int write)
|
||||||
|
-{
|
||||||
|
- if (__elision_aconf.try_tbegin > 0)
|
||||||
|
- {
|
||||||
|
- if (write)
|
||||||
|
- __builtin_tabort (_ABORT_NESTED_TRYLOCK);
|
||||||
|
- return __elide_lock (adapt_count, is_lock_free);
|
||||||
|
- }
|
||||||
|
- return false;
|
||||||
|
-}
|
||||||
|
+/* Returns 0 if the lock defined by is_lock_free was elided.
|
||||||
|
+ ADAPT_COUNT is a per-lock state variable. */
|
||||||
|
+# define ELIDE_LOCK(adapt_count, is_lock_free) \
|
||||||
|
+ ({ \
|
||||||
|
+ int ret = 0; \
|
||||||
|
+ if (adapt_count > 0) \
|
||||||
|
+ (adapt_count)--; \
|
||||||
|
+ else \
|
||||||
|
+ for (int i = __elision_aconf.try_tbegin; i > 0; i--) \
|
||||||
|
+ { \
|
||||||
|
+ asm volatile("" ::: "memory"); \
|
||||||
|
+ if (__builtin_tbegin (0)) \
|
||||||
|
+ { \
|
||||||
|
+ if (is_lock_free) \
|
||||||
|
+ { \
|
||||||
|
+ ret = 1; \
|
||||||
|
+ break; \
|
||||||
|
+ } \
|
||||||
|
+ __builtin_tabort (_ABORT_LOCK_BUSY); \
|
||||||
|
+ } \
|
||||||
|
+ else \
|
||||||
|
+ if (!__get_new_count(&adapt_count)) \
|
||||||
|
+ break; \
|
||||||
|
+ } \
|
||||||
|
+ ret; \
|
||||||
|
+ })
|
||||||
|
|
||||||
|
# define ELIDE_TRYLOCK(adapt_count, is_lock_free, write) \
|
||||||
|
- __elide_trylock (&(adapt_count), is_lock_free, write)
|
||||||
|
+ ({ \
|
||||||
|
+ int ret = 0; \
|
||||||
|
+ if (__elision_aconf.try_tbegin > 0) \
|
||||||
|
+ { \
|
||||||
|
+ if (write) \
|
||||||
|
+ __builtin_tabort (_ABORT_NESTED_TRYLOCK); \
|
||||||
|
+ ret = ELIDE_LOCK (adapt_count, is_lock_free); \
|
||||||
|
+ } \
|
||||||
|
+ ret; \
|
||||||
|
+ })
|
||||||
|
|
||||||
|
|
||||||
|
static inline bool
|
@ -1,3 +1,9 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Sep 30 11:48:05 UTC 2015 - normand@linux.vnet.ibm.com
|
||||||
|
|
||||||
|
- new patch [BZ #18743] PowerPC: Fix a race condition when eliding a lock
|
||||||
|
0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu Sep 24 09:41:13 UTC 2015 - schwab@suse.de
|
Thu Sep 24 09:41:13 UTC 2015 - schwab@suse.de
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# spec file for package glibc-testsuite
|
# spec file for package glibc-testsuite
|
||||||
#
|
#
|
||||||
# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
|
# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||||
#
|
#
|
||||||
# All modifications and additions to the file contributed by third parties
|
# All modifications and additions to the file contributed by third parties
|
||||||
# remain the property of their copyright owners, unless otherwise agreed
|
# remain the property of their copyright owners, unless otherwise agreed
|
||||||
@ -258,6 +258,8 @@ Patch2007: static-dlopen.patch
|
|||||||
Patch2008: fnmatch-collating-elements.patch
|
Patch2008: fnmatch-collating-elements.patch
|
||||||
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
|
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
|
||||||
Patch2009: nss-files-long-lines-2.patch
|
Patch2009: nss-files-long-lines-2.patch
|
||||||
|
# PATCH-FIX-UPSTREAM [BZ #18743] PowerPC: Fix a race condition when eliding a lock
|
||||||
|
Patch2010: 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch
|
||||||
|
|
||||||
# Non-glibc patches
|
# Non-glibc patches
|
||||||
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
|
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
|
||||||
@ -470,6 +472,7 @@ rm nscd/s-stamp
|
|||||||
%patch2007 -p1
|
%patch2007 -p1
|
||||||
%patch2008 -p1
|
%patch2008 -p1
|
||||||
%patch2009 -p1
|
%patch2009 -p1
|
||||||
|
%patch2010 -p1
|
||||||
|
|
||||||
%patch3000
|
%patch3000
|
||||||
|
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Sep 30 11:48:05 UTC 2015 - normand@linux.vnet.ibm.com
|
||||||
|
|
||||||
|
- new patch [BZ #18743] PowerPC: Fix a race condition when eliding a lock
|
||||||
|
0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu Sep 24 09:41:13 UTC 2015 - schwab@suse.de
|
Thu Sep 24 09:41:13 UTC 2015 - schwab@suse.de
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# spec file for package glibc-utils
|
# spec file for package glibc-utils
|
||||||
#
|
#
|
||||||
# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
|
# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||||
#
|
#
|
||||||
# All modifications and additions to the file contributed by third parties
|
# All modifications and additions to the file contributed by third parties
|
||||||
# remain the property of their copyright owners, unless otherwise agreed
|
# remain the property of their copyright owners, unless otherwise agreed
|
||||||
@ -257,6 +257,8 @@ Patch2007: static-dlopen.patch
|
|||||||
Patch2008: fnmatch-collating-elements.patch
|
Patch2008: fnmatch-collating-elements.patch
|
||||||
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
|
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
|
||||||
Patch2009: nss-files-long-lines-2.patch
|
Patch2009: nss-files-long-lines-2.patch
|
||||||
|
# PATCH-FIX-UPSTREAM [BZ #18743] PowerPC: Fix a race condition when eliding a lock
|
||||||
|
Patch2010: 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch
|
||||||
|
|
||||||
# Non-glibc patches
|
# Non-glibc patches
|
||||||
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
|
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
|
||||||
@ -470,6 +472,7 @@ rm nscd/s-stamp
|
|||||||
%patch2007 -p1
|
%patch2007 -p1
|
||||||
%patch2008 -p1
|
%patch2008 -p1
|
||||||
%patch2009 -p1
|
%patch2009 -p1
|
||||||
|
%patch2010 -p1
|
||||||
|
|
||||||
%patch3000
|
%patch3000
|
||||||
|
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Sep 30 11:48:05 UTC 2015 - normand@linux.vnet.ibm.com
|
||||||
|
|
||||||
|
- new patch [BZ #18743] PowerPC: Fix a race condition when eliding a lock
|
||||||
|
0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu Sep 24 09:41:13 UTC 2015 - schwab@suse.de
|
Thu Sep 24 09:41:13 UTC 2015 - schwab@suse.de
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# spec file for package glibc
|
# spec file for package glibc
|
||||||
#
|
#
|
||||||
# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
|
# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||||
#
|
#
|
||||||
# All modifications and additions to the file contributed by third parties
|
# All modifications and additions to the file contributed by third parties
|
||||||
# remain the property of their copyright owners, unless otherwise agreed
|
# remain the property of their copyright owners, unless otherwise agreed
|
||||||
@ -258,6 +258,8 @@ Patch2007: static-dlopen.patch
|
|||||||
Patch2008: fnmatch-collating-elements.patch
|
Patch2008: fnmatch-collating-elements.patch
|
||||||
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
|
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
|
||||||
Patch2009: nss-files-long-lines-2.patch
|
Patch2009: nss-files-long-lines-2.patch
|
||||||
|
# PATCH-FIX-UPSTREAM [BZ #18743] PowerPC: Fix a race condition when eliding a lock
|
||||||
|
Patch2010: 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch
|
||||||
|
|
||||||
# Non-glibc patches
|
# Non-glibc patches
|
||||||
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
|
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
|
||||||
@ -470,6 +472,7 @@ rm nscd/s-stamp
|
|||||||
%patch2007 -p1
|
%patch2007 -p1
|
||||||
%patch2008 -p1
|
%patch2008 -p1
|
||||||
%patch2009 -p1
|
%patch2009 -p1
|
||||||
|
%patch2010 -p1
|
||||||
|
|
||||||
%patch3000
|
%patch3000
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user