[OpenMP] Fix distributed barrier hang for OMP_WAIT_POLICY=passive (#83058)

The resume thread logic inside __kmp_free_team() is faulty. Only
checking b_go for sleep status doesn't wake up distributed barrier.
Change to generic check for th_sleep_loc and calling
__kmp_null_resume_wrapper().

Fixes: #80664
This commit is contained in:
Jonathan Peyton 2024-02-27 14:15:48 -06:00 committed by GitHub
parent d2a9df2c8f
commit 0e0bee26e7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 39 additions and 3 deletions

View File

@ -5708,9 +5708,8 @@ void __kmp_free_team(kmp_root_t *root,
}
#endif
// first check if thread is sleeping
kmp_flag_64<> fl(&th->th.th_bar[bs_forkjoin_barrier].bb.b_go, th);
if (fl.is_sleeping())
fl.resume(__kmp_gtid_from_thread(th));
if (th->th.th_sleep_loc)
__kmp_null_resume_wrapper(th);
KMP_CPU_PAUSE();
}
}

View File

@ -0,0 +1,37 @@
// RUN: %libomp-compile
// RUN: env OMP_WAIT_POLICY=passive \
// RUN: KMP_FORKJOIN_BARRIER_PATTERN='linear,linear' %libomp-run
// RUN: env OMP_WAIT_POLICY=passive \
// RUN: KMP_FORKJOIN_BARRIER_PATTERN='tree,tree' %libomp-run
// RUN: env OMP_WAIT_POLICY=passive \
// RUN: KMP_FORKJOIN_BARRIER_PATTERN='hyper,hyper' %libomp-run
// RUN: env OMP_WAIT_POLICY=passive \
// RUN: KMP_FORKJOIN_BARRIER_PATTERN='dist,dist' %libomp-run
//
// LLVM ISSUE 80664: https://github.com/llvm/llvm-project/issues/80664
//
// Distributed barrier + OMP_WAIT_POLICY=passive hangs in library termination
// Reason: the resume logic in __kmp_free_team() was faulty and, when checking
// for sleep status, didn't look at correct location for distributed barrier.
#include <stdio.h>
#include <stdlib.h>
int a = 0;
void test_omp_barrier() {
#pragma omp parallel
{
#pragma omp task
{
#pragma omp atomic
a++;
}
}
}
int main() {
test_omp_barrier();
printf("a = %d\n", a);
return EXIT_SUCCESS;
}