summaryrefslogtreecommitdiffstats
path: root/import-layers/yocto-poky/meta/recipes-core/glibc/glibc/0006-Fix-atomic_fetch_xor_release.patch
diff options
context:
space:
mode:
Diffstat (limited to 'import-layers/yocto-poky/meta/recipes-core/glibc/glibc/0006-Fix-atomic_fetch_xor_release.patch')
-rw-r--r--import-layers/yocto-poky/meta/recipes-core/glibc/glibc/0006-Fix-atomic_fetch_xor_release.patch81
1 files changed, 81 insertions, 0 deletions
diff --git a/import-layers/yocto-poky/meta/recipes-core/glibc/glibc/0006-Fix-atomic_fetch_xor_release.patch b/import-layers/yocto-poky/meta/recipes-core/glibc/glibc/0006-Fix-atomic_fetch_xor_release.patch
new file mode 100644
index 000000000..7616efa18
--- /dev/null
+++ b/import-layers/yocto-poky/meta/recipes-core/glibc/glibc/0006-Fix-atomic_fetch_xor_release.patch
@@ -0,0 +1,81 @@
+From b671f20cc160238b62894d032a55baf85867106e Mon Sep 17 00:00:00 2001
+From: Catalin Enache <catalin.enache@windriver.com>
+Date: Fri, 30 Jun 2017 19:12:43 +0300
+Subject: [PATCH 6/6] Fix atomic_fetch_xor_release.
+
+No code uses atomic_fetch_xor_release except for the upcoming
+conditional variable rewrite. Therefore there is no user
+visible bug here. The use of atomic_compare_and_exchange_bool_rel
+is removed (since it doesn't exist anymore), and is replaced
+by atomic_compare_exchange_weak_release.
+
+We use weak_release because it provides better performance in
+the loop (the weak semantic) and because the xor is release MO
+(the release semantic). We don't reload expected in the loop
+because atomic_compare_and_exchange_weak_release does this for
+us as part of the CAS failure.
+
+It is otherwise a fairly plain conversion that fixes building
+the new condvar for 32-bit x86. Passes all regression tests
+for x86.
+
+Upstream-Status: Backport
+
+Author: Carlos O'Donell <carlos@systemhalted.org>
+Signed-off-by: Catalin Enache <catalin.enache@windriver.com>
+---
+ ChangeLog | 6 ++++++
+ include/atomic.h | 19 +++++++++++--------
+ 2 files changed, 17 insertions(+), 8 deletions(-)
+
+diff --git a/ChangeLog b/ChangeLog
+index 44c518b..893262d 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,9 @@
++2016-10-26 Carlos O'Donell <carlos@redhat.com>
++
++ * include/atomic.h
++ [USE_COMPILER_ATOMIC_BUILTINS && !atomic_fetch_xor_release]
++ (atomic_fetch_xor_release): Use atomic_compare_exchange_weak_release.
++
+ 2017-04-04 Adhemerval Zanella <adhemerval.zanella@linaro.org>
+
+ * nptl/pthreadP.h (USE_REQUEUE_PI): Remove ununsed macro.
+diff --git a/include/atomic.h b/include/atomic.h
+index 5a8e7e7..c8b4664 100644
+--- a/include/atomic.h
++++ b/include/atomic.h
+@@ -777,18 +777,21 @@ void __atomic_link_error (void);
+ # endif
+
+ # ifndef atomic_fetch_xor_release
++/* Failing the atomic_compare_exchange_weak_release reloads the value in
++ __atg104_expected, so we need only do the XOR again and retry. */
+ # define atomic_fetch_xor_release(mem, operand) \
+- ({ __typeof (*(mem)) __atg104_old; \
+- __typeof (mem) __atg104_memp = (mem); \
++ ({ __typeof (mem) __atg104_memp = (mem); \
++ __typeof (*(mem)) __atg104_expected = (*__atg104_memp); \
++ __typeof (*(mem)) __atg104_desired; \
+ __typeof (*(mem)) __atg104_op = (operand); \
+ \
+ do \
+- __atg104_old = (*__atg104_memp); \
+- while (__builtin_expect \
+- (atomic_compare_and_exchange_bool_rel ( \
+- __atg104_memp, __atg104_old ^ __atg104_op, __atg104_old), 0));\
+- \
+- __atg104_old; })
++ __atg104_desired = __atg104_expected ^ __atg104_op; \
++ while (__glibc_unlikely \
++ (atomic_compare_exchange_weak_release ( \
++ __atg104_memp, &__atg104_expected, __atg104_desired) \
++ == 0)); \
++ __atg104_expected; })
+ #endif
+
+ #endif /* !USE_ATOMIC_COMPILER_BUILTINS */
+--
+2.10.2
+
OpenPOWER on IntegriCloud