[packages/tbb] patch for improving stability under load; rel 2

atler atler at pld-linux.org
Sat Jun 18 20:38:36 CEST 2022


commit 000cede3a37bfa9f872cd1d9dc3059626420288f
Author: Jan Palus <atler at pld-linux.org>
Date:   Sat Jun 18 20:36:24 2022 +0200

    patch for improving stability under load; rel 2
    
    from: https://github.com/oneapi-src/oneTBB/pull/824

 retry-pthread-create-eagain.patch | 63 +++++++++++++++++++++++++++++++++++++++
 tbb.spec                          |  4 ++-
 2 files changed, 66 insertions(+), 1 deletion(-)
---
diff --git a/tbb.spec b/tbb.spec
index d9eb09d..cfb5778 100644
--- a/tbb.spec
+++ b/tbb.spec
@@ -11,7 +11,7 @@ Summary:	The Threading Building Blocks library abstracts low-level threading det
 Summary(pl.UTF-8):	Threading Building Blocks - biblioteka abstrahująca niskopoziomowe szczegóły obsługi wątków
 Name:		tbb
 Version:	%{major}.%{minor}.%{micro}
-Release:	1
+Release:	2
 License:	Apache v2.0
 Group:		Development/Tools
 # Source0Download: https://github.com/oneapi-src/oneTBB/releases
@@ -27,6 +27,7 @@ Source4:	http://www.threadingbuildingblocks.org/uploads/81/91/Latest%20Open%20So
 # Source4-md5:	5bbdd1050c5dac5c1b782a6a98db0c46
 URL:		http://www.threadingbuildingblocks.org/
 Patch0:		%{name}-x86_32bit.patch
+Patch1:		retry-pthread-create-eagain.patch
 BuildRequires:	cmake >= 3.1
 BuildRequires:	hwloc-devel
 %{?with_libatomic:BuildRequires:	libatomic-devel}
@@ -99,6 +100,7 @@ Building Blocks (TBB).
 %prep
 %setup -q -n oneTBB-%{version}
 %patch0 -p1
+%patch1 -p1
 
 cp -p %{SOURCE1} %{SOURCE2} %{SOURCE3} %{SOURCE4} .
 
diff --git a/retry-pthread-create-eagain.patch b/retry-pthread-create-eagain.patch
new file mode 100644
index 0000000..7188839
--- /dev/null
+++ b/retry-pthread-create-eagain.patch
@@ -0,0 +1,63 @@
+From f12c93efd04991bc982a27e2fa6142538c33ca82 Mon Sep 17 00:00:00 2001
+From: Rui Ueyama <ruiu at cs.stanford.edu>
+Date: Sat, 7 May 2022 19:55:24 +0800
+Subject: [PATCH] Retry if pthread_create fails with EAGAIN
+
+On many Unix-like systems, pthread_create can fail spuriously even if
+the running machine has enough resources to spawn a new thread.
+Therefore, if EAGAIN is returned from pthread_create, we actually have
+to try again.
+
+I observed this issue when running the mold linker
+(https://github.com/rui314/mold) under a heavy load. mold uses OneTBB
+for parallelization.
+
+As another data point, Go has the same logic to retry on EAGAIN:
+https://go-review.googlesource.com/c/go/+/33894/
+
+nanosleep is defined in POSIX 2001, so I believe that all Unix-like
+systems support it.
+
+Signed-off-by: Rui Ueyama <ruiu at cs.stanford.edu>
+---
+ src/tbb/rml_thread_monitor.h | 19 ++++++++++++++++++-
+ 1 file changed, 18 insertions(+), 1 deletion(-)
+
+diff --git a/src/tbb/rml_thread_monitor.h b/src/tbb/rml_thread_monitor.h
+index 13b556380..5b844b232 100644
+--- a/src/tbb/rml_thread_monitor.h
++++ b/src/tbb/rml_thread_monitor.h
+@@ -31,6 +31,7 @@
+ #include <pthread.h>
+ #include <cstring>
+ #include <cstdlib>
++#include <time.h>
+ #else
+ #error Unsupported platform
+ #endif
+@@ -191,8 +192,24 @@ inline thread_monitor::handle_type thread_monitor::launch( void* (*thread_routin
+     check(pthread_attr_init( &s ), "pthread_attr_init has failed");
+     if( stack_size>0 )
+         check(pthread_attr_setstacksize( &s, stack_size ), "pthread_attr_setstack_size has failed" );
++
+     pthread_t handle;
+-    check( pthread_create( &handle, &s, thread_routine, arg ), "pthread_create has failed" );
++    int tries = 0;
++    for (;;) {
++      int error_code = pthread_create(&handle, &s, thread_routine, arg);
++      if (!error_code)
++        break;
++      if (error_code != EAGAIN || tries++ > 20) {
++        handle_perror(error_code, "pthread_create has failed");
++        break;
++      }
++
++      // pthreaed_create can spuriously fail on many Unix-like systems.
++      // Retry after tries * 1 millisecond.
++      struct timespec ts = {0, tries * 1000 * 1000};
++      nanosleep(&ts, NULL);
++    }
++
+     check( pthread_attr_destroy( &s ), "pthread_attr_destroy has failed" );
+     return handle;
+ }
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/tbb.git/commitdiff/000cede3a37bfa9f872cd1d9dc3059626420288f



More information about the pld-cvs-commit mailing list