forked from OSchip/llvm-project
[OpenMP] Fix a race in task queue reallocation
__kmp_realloc_task_deque implicitly assumes, that the task queue is full (ntasks == size), therefore tail = size in line 319. An assertion is added to document this assumption. The first check for a full queue is before the locking and might not hold when the lock is taken. So, we need to check again for this condition when we have the lock. Reviewed By: AndreyChurbanov Differential Revision: https://reviews.llvm.org/D80480
This commit is contained in:
parent
b752a2743a
commit
3895148d7c
|
@ -298,6 +298,7 @@ static bool __kmp_task_is_allowed(int gtid, const kmp_int32 is_constrained,
|
|||
static void __kmp_realloc_task_deque(kmp_info_t *thread,
|
||||
kmp_thread_data_t *thread_data) {
|
||||
kmp_int32 size = TASK_DEQUE_SIZE(thread_data->td);
|
||||
KMP_DEBUG_ASSERT(TCR_4(thread_data->td.td_deque_ntasks) == size);
|
||||
kmp_int32 new_size = 2 * size;
|
||||
|
||||
KE_TRACE(10, ("__kmp_realloc_task_deque: T#%d reallocating deque[from %d to "
|
||||
|
@ -381,8 +382,11 @@ static kmp_int32 __kmp_push_task(kmp_int32 gtid, kmp_task_t *task) {
|
|||
} else {
|
||||
__kmp_acquire_bootstrap_lock(&thread_data->td.td_deque_lock);
|
||||
locked = 1;
|
||||
// expand deque to push the task which is not allowed to execute
|
||||
__kmp_realloc_task_deque(thread, thread_data);
|
||||
if (TCR_4(thread_data->td.td_deque_ntasks) >=
|
||||
TASK_DEQUE_SIZE(thread_data->td)) {
|
||||
// expand deque to push the task which is not allowed to execute
|
||||
__kmp_realloc_task_deque(thread, thread_data);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Lock the deque for the task push operation
|
||||
|
@ -3659,7 +3663,11 @@ static bool __kmp_give_task(kmp_info_t *thread, kmp_int32 tid, kmp_task_t *task,
|
|||
return result;
|
||||
|
||||
__kmp_acquire_bootstrap_lock(&thread_data->td.td_deque_lock);
|
||||
__kmp_realloc_task_deque(thread, thread_data);
|
||||
if (TCR_4(thread_data->td.td_deque_ntasks) >=
|
||||
TASK_DEQUE_SIZE(thread_data->td)) {
|
||||
// expand deque to push the task which is not allowed to execute
|
||||
__kmp_realloc_task_deque(thread, thread_data);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
|
|
Loading…
Reference in New Issue