diff --git a/SOURCES/papi-thread_init.patch b/SOURCES/papi-thread_init.patch new file mode 100644 index 0000000..8205d95 --- /dev/null +++ b/SOURCES/papi-thread_init.patch @@ -0,0 +1,139 @@ +commit 617eeabe0bbfb5357c10b22ebd72b24a4a872e52 +Author: Anthony +Date: Mon Jan 6 15:09:42 2020 -0500 + + Updated the variables that are used in the debug messages in accordance to a previous commit that made these variables thread safe. + +diff --git a/src/papi_internal.c b/src/papi_internal.c +index f0e457bf7..69b2914d0 100644 +--- a/src/papi_internal.c ++++ b/src/papi_internal.c +@@ -114,7 +114,7 @@ _papi_hwi_free_papi_event_string() { + + void + _papi_hwi_set_papi_event_code (unsigned int event_code, int update_flag) { +- INTDBG("new event_code: %#x, update_flag: %d, previous event_code: %#x\n", event_code, update_flag, papi_event_code); ++ INTDBG("new event_code: %#x, update_flag: %d, previous event_code: %#x\n", event_code, update_flag, _papi_hwi_my_thread->tls_papi_event_code); + + // if call is just to reset and start over, set both flags to show nothing saved yet + if (update_flag < 0) { +@@ -131,7 +131,7 @@ _papi_hwi_set_papi_event_code (unsigned int event_code, int update_flag) { + } + unsigned int + _papi_hwi_get_papi_event_code () { +- INTDBG("papi_event_code: %#x\n", papi_event_code); ++ INTDBG("papi_event_code: %#x\n", _papi_hwi_my_thread->tls_papi_event_code); + return _papi_hwi_my_thread->tls_papi_event_code; + } + /* Get the index into the ESI->NativeInfoArray for the current PAPI event code */ +From 3cc3b6679e1ace7516c3037105ad16410ce7d3db Mon Sep 17 00:00:00 2001 +From: William Cohen +Date: Wed, 12 Aug 2020 10:12:59 -0400 +Subject: [PATCH] Initialize component globals before threads globals + +An earlier commit (979e80136) swapped the order of initializing +globals and threads. This caused issues with the perf_event, appio, +and stealtime components which could be observed with the +all_native_events, appio_test_pthreads, and stealtime_basic tests +respectively. The component initialization needs to be performed +before the thread initialization. + +The order of initialization has been changed back to initializing the +component then the threads. One complication is that papi_internal.c +had functions (_papi_hwi_set_papi_event_code and +_papi_hwi_get_papi_event_code) that required thread local storage that +was being setup in commit 979e80136 by the thread initialization. +This was the original reason for swapping the order of initialization +of component and thread. Using __thread on the file scope +declarations of the variables allow the original order of +initialization. +--- + src/papi.c | 10 +++++----- + src/papi_internal.c | 21 +++++++++++++-------- + 2 files changed, 18 insertions(+), 13 deletions(-) + +diff --git a/src/papi.c b/src/papi.c +index 33cc29935..107a15044 100644 +--- a/src/papi.c ++++ b/src/papi.c +@@ -1151,19 +1151,19 @@ PAPI_library_init( int version ) + papi_return( init_retval ); + } + +- /* Initialize thread globals, including the main threads */ ++ /* Initialize component globals */ + +- tmp = _papi_hwi_init_global_threads( ); ++ tmp = _papi_hwi_init_global( ); + if ( tmp ) { + init_retval = tmp; + _papi_hwi_shutdown_global_internal( ); +- _in_papi_library_init_cnt--; ++ _in_papi_library_init_cnt--; + papi_return( init_retval ); + } + +- /* Initialize component globals */ ++ /* Initialize thread globals, including the main threads */ + +- tmp = _papi_hwi_init_global( ); ++ tmp = _papi_hwi_init_global_threads( ); + if ( tmp ) { + init_retval = tmp; + _papi_hwi_shutdown_global_internal( ); +diff --git a/src/papi_internal.c b/src/papi_internal.c +index 5a1ccd433..bdf30f875 100644 +--- a/src/papi_internal.c ++++ b/src/papi_internal.c +@@ -115,27 +115,32 @@ _papi_hwi_free_papi_event_string() { + return; + } + ++// A place to keep the current papi event code so some component functions can fetch its value ++// The current event code can be stored here prior to component calls and cleared after the component returns ++static THREAD_LOCAL_STORAGE_KEYWORD unsigned int papi_event_code = -1; ++static THREAD_LOCAL_STORAGE_KEYWORD int papi_event_code_changed = -1; ++ + void + _papi_hwi_set_papi_event_code (unsigned int event_code, int update_flag) { +- INTDBG("new event_code: %#x, update_flag: %d, previous event_code: %#x\n", event_code, update_flag, _papi_hwi_my_thread->tls_papi_event_code); ++ INTDBG("new event_code: %#x, update_flag: %d, previous event_code: %#x\n", event_code, update_flag, papi_event_code); + + // if call is just to reset and start over, set both flags to show nothing saved yet + if (update_flag < 0) { +- _papi_hwi_my_thread->tls_papi_event_code_changed = -1; +- _papi_hwi_my_thread->tls_papi_event_code = -1; ++ papi_event_code_changed = -1; ++ papi_event_code = -1; + return; + } + + // if 0, it is being set prior to calling a component, if >0 it is being changed by the component +- _papi_hwi_my_thread->tls_papi_event_code_changed = update_flag; ++ papi_event_code_changed = update_flag; + // save the event code passed in +- _papi_hwi_my_thread->tls_papi_event_code = event_code; ++ papi_event_code = event_code; + return; + } + unsigned int + _papi_hwi_get_papi_event_code () { +- INTDBG("papi_event_code: %#x\n", _papi_hwi_my_thread->tls_papi_event_code); +- return _papi_hwi_my_thread->tls_papi_event_code; ++ INTDBG("papi_event_code: %#x\n", papi_event_code); ++ return papi_event_code; + } + /* Get the index into the ESI->NativeInfoArray for the current PAPI event code */ + int +@@ -560,7 +565,7 @@ _papi_hwi_native_to_eventcode(int cidx, int event_code, int ntv_idx, const char + + int result; + +- if (_papi_hwi_my_thread->tls_papi_event_code_changed > 0) { ++ if (papi_event_code_changed > 0) { + result = _papi_hwi_get_papi_event_code(); + INTDBG("EXIT: papi_event_code: %#x set by the component\n", result); + return result; +-- +2.26.2 + diff --git a/SPECS/papi.spec b/SPECS/papi.spec index 24ec00c..b81f8f8 100644 --- a/SPECS/papi.spec +++ b/SPECS/papi.spec @@ -8,7 +8,7 @@ Summary: Performance Application Programming Interface Name: papi Version: 5.6.0 -Release: 10%{?dist} +Release: 11%{?dist} License: BSD Group: Development/System Requires: papi-libs = %{version}-%{release} @@ -17,6 +17,7 @@ Source0: http://icl.cs.utk.edu/projects/papi/downloads/%{name}-%{version}.tar.gz Patch1: papi-ldflags.patch Patch2: papi-divzero.patch Patch3: papi-rhbz1807346.patch +Patch4: papi-thread_init.patch BuildRequires: autoconf BuildRequires: doxygen BuildRequires: ncurses-devel @@ -83,6 +84,7 @@ the PAPI user-space libraries and interfaces. %patch1 -p1 -b .ldflags %patch2 -p1 -b .divzero %patch3 -p1 -b .rhbz1807346 +%patch4 -p1 -b .thread_init %build %if %{without bundled_libpfm} @@ -165,6 +167,9 @@ chrpath --delete $RPM_BUILD_ROOT%{_libdir}/*.so* %{_libdir}/*.a %changelog +* Fri Aug 21 2020 William Cohen - 5.6.0-11 +- Correct the handling of multiple threads. (rhbz1807346) + * Wed May 27 2020 William Cohen - 5.6.0-10 - Rebuild with current libpfm-4.10.1.