SHA256
1
0
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:
Andreas Schwab 2015-10-05 10:15:17 +00:00 committed by Git OBS Bridge
parent 82cb193ae9
commit dcc3753b29
7 changed files with 182 additions and 3 deletions

View File

@ -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

View File

@ -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

View File

@ -1,7 +1,7 @@
#
# 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
# remain the property of their copyright owners, unless otherwise agreed
@ -258,6 +258,8 @@ Patch2007: static-dlopen.patch
Patch2008: fnmatch-collating-elements.patch
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
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
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
@ -470,6 +472,7 @@ rm nscd/s-stamp
%patch2007 -p1
%patch2008 -p1
%patch2009 -p1
%patch2010 -p1
%patch3000

View File

@ -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

View File

@ -1,7 +1,7 @@
#
# 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
# remain the property of their copyright owners, unless otherwise agreed
@ -257,6 +257,8 @@ Patch2007: static-dlopen.patch
Patch2008: fnmatch-collating-elements.patch
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
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
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
@ -470,6 +472,7 @@ rm nscd/s-stamp
%patch2007 -p1
%patch2008 -p1
%patch2009 -p1
%patch2010 -p1
%patch3000

View File

@ -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

View File

@ -1,7 +1,7 @@
#
# 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
# remain the property of their copyright owners, unless otherwise agreed
@ -258,6 +258,8 @@ Patch2007: static-dlopen.patch
Patch2008: fnmatch-collating-elements.patch
# PATCH-FIX-UPSTREAM Properly reread entry after failure in nss_files getent function (BZ #18991)
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
# PATCH-FIX-OPENSUSE Remove debianisms from manpages
@ -470,6 +472,7 @@ rm nscd/s-stamp
%patch2007 -p1
%patch2008 -p1
%patch2009 -p1
%patch2010 -p1
%patch3000