Skip to content

Commit 180f435

Browse files
committed
Fixed bug of lock in piQueueRelease
Signed-off-by: Byoungro So <[email protected]>
1 parent 9e3b287 commit 180f435

File tree

1 file changed

+47
-38
lines changed

1 file changed

+47
-38
lines changed

sycl/plugins/level_zero/pi_level_zero.cpp

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -419,10 +419,10 @@ inline static void piQueueRetainNoLock(pi_queue Queue) { Queue->RefCount++; }
419419
// \param Event a pointer to hold the newly created pi_event
420420
// \param CommandType various command type determined by the caller
421421
// \param ZeCommandList the handle to associate with the newly created event
422-
// \param ZeEvent the ZeEvent handle to be associated with the event
423-
inline static pi_result createEventAndAssociateQueue(
424-
pi_queue Queue, pi_event *Event, pi_command_type CommandType,
425-
ze_command_list_handle_t ZeCommandList, ze_event_handle_t *ZeEvent) {
422+
inline static pi_result
423+
createEventAndAssociateQueue(pi_queue Queue, pi_event *Event,
424+
pi_command_type CommandType,
425+
ze_command_list_handle_t ZeCommandList) {
426426
pi_result Res = piEventCreate(Queue->Context, Event);
427427
if (Res != PI_SUCCESS)
428428
return Res;
@@ -431,7 +431,6 @@ inline static pi_result createEventAndAssociateQueue(
431431
(*Event)->CommandType = CommandType;
432432
(*Event)->ZeCommandList = ZeCommandList;
433433

434-
*ZeEvent = (*Event)->ZeEvent;
435434
// We need to increment the reference counter here to avoid pi_queue
436435
// being released before the associated pi_event is released because
437436
// piEventRelease requires access to the associated pi_queue.
@@ -2038,28 +2037,29 @@ pi_result piQueueRelease(pi_queue Queue) {
20382037
Queue->RefCount--;
20392038
if (Queue->RefCount == 0)
20402039
RefCountZero = true;
2041-
}
20422040

2043-
if (RefCountZero) {
2044-
// It is possible to get to here and still have an open command list
2045-
// if no wait or finish ever occurred for this queue. But still need
2046-
// to make sure commands get executed.
2047-
if (auto Res = Queue->executeOpenCommandList())
2048-
return Res;
2041+
if (RefCountZero) {
2042+
// It is possible to get to here and still have an open command list
2043+
// if no wait or finish ever occurred for this queue. But still need
2044+
// // TODO: o make sure commands get executed.
2045+
if (auto Res = Queue->executeOpenCommandList())
2046+
return Res;
20492047

2050-
// Destroy all the fences created associated with this queue.
2051-
for (const auto &MapEntry : Queue->ZeCommandListFenceMap) {
2052-
ZE_CALL(zeFenceDestroy(MapEntry.second));
2048+
// Destroy all the fences created associated with this queue.
2049+
for (const auto &MapEntry : Queue->ZeCommandListFenceMap) {
2050+
ZE_CALL(zeFenceDestroy(MapEntry.second));
2051+
}
2052+
Queue->ZeCommandListFenceMap.clear();
2053+
ZE_CALL(zeCommandQueueDestroy(Queue->ZeCommandQueue));
2054+
Queue->ZeCommandQueue = nullptr;
2055+
2056+
zePrint("piQueueRelease NumTimesClosedFull %d, NumTimesClosedEarly %d\n",
2057+
Queue->NumTimesClosedFull, Queue->NumTimesClosedEarly);
20532058
}
2054-
Queue->ZeCommandListFenceMap.clear();
2055-
ZE_CALL(zeCommandQueueDestroy(Queue->ZeCommandQueue));
2056-
Queue->ZeCommandQueue = nullptr;
2059+
}
20572060

2058-
zePrint("piQueueRelease NumTimesClosedFull %d, NumTimesClosedEarly %d\n",
2059-
Queue->NumTimesClosedFull, Queue->NumTimesClosedEarly);
2060-
Queue->PiQueueMutex.unlock();
2061+
if (RefCountZero)
20612062
delete Queue;
2062-
}
20632063
return PI_SUCCESS;
20642064
}
20652065

@@ -3442,9 +3442,10 @@ piEnqueueKernelLaunch(pi_queue Queue, pi_kernel Kernel, pi_uint32 WorkDim,
34423442

34433443
ze_event_handle_t ZeEvent = nullptr;
34443444
pi_result Res = createEventAndAssociateQueue(
3445-
Queue, Event, PI_COMMAND_TYPE_NDRANGE_KERNEL, ZeCommandList, &ZeEvent);
3445+
Queue, Event, PI_COMMAND_TYPE_NDRANGE_KERNEL, ZeCommandList);
34463446
if (Res != PI_SUCCESS)
34473447
return Res;
3448+
ZeEvent = (*Event)->ZeEvent;
34483449

34493450
// Save the kernel in the event, so that when the event is signalled
34503451
// the code can do a piKernelRelease on this kernel.
@@ -3916,9 +3917,10 @@ pi_result piEnqueueEventsWaitWithBarrier(pi_queue Queue,
39163917
ze_event_handle_t ZeEvent = nullptr;
39173918
if (Event) {
39183919
auto Res = createEventAndAssociateQueue(Queue, Event, PI_COMMAND_TYPE_USER,
3919-
ZeCommandList, &ZeEvent);
3920+
ZeCommandList);
39203921
if (Res != PI_SUCCESS)
39213922
return Res;
3923+
ZeEvent = (*Event)->ZeEvent;
39223924
}
39233925

39243926
// TODO: use unique_ptr with custom deleter in the whole Level Zero plugin for
@@ -3994,10 +3996,11 @@ enqueueMemCopyHelper(pi_command_type CommandType, pi_queue Queue, void *Dst,
39943996

39953997
ze_event_handle_t ZeEvent = nullptr;
39963998
if (Event) {
3997-
auto Res = createEventAndAssociateQueue(Queue, Event, CommandType,
3998-
ZeCommandList, &ZeEvent);
3999+
auto Res =
4000+
createEventAndAssociateQueue(Queue, Event, CommandType, ZeCommandList);
39994001
if (Res != PI_SUCCESS)
40004002
return Res;
4003+
ZeEvent = (*Event)->ZeEvent;
40014004
}
40024005

40034006
ze_event_handle_t *ZeEventWaitList =
@@ -4050,10 +4053,11 @@ static pi_result enqueueMemCopyRectHelper(
40504053

40514054
ze_event_handle_t ZeEvent = nullptr;
40524055
if (Event) {
4053-
auto Res = createEventAndAssociateQueue(Queue, Event, CommandType,
4054-
ZeCommandList, &ZeEvent);
4056+
auto Res =
4057+
createEventAndAssociateQueue(Queue, Event, CommandType, ZeCommandList);
40554058
if (Res != PI_SUCCESS)
40564059
return Res;
4060+
ZeEvent = (*Event)->ZeEvent;
40574061
}
40584062

40594063
ze_event_handle_t *ZeEventWaitList =
@@ -4227,10 +4231,11 @@ enqueueMemFillHelper(pi_command_type CommandType, pi_queue Queue, void *Ptr,
42274231

42284232
ze_event_handle_t ZeEvent = nullptr;
42294233
if (Event) {
4230-
auto Res = createEventAndAssociateQueue(Queue, Event, CommandType,
4231-
ZeCommandList, &ZeEvent);
4234+
auto Res =
4235+
createEventAndAssociateQueue(Queue, Event, CommandType, ZeCommandList);
42324236
if (Res != PI_SUCCESS)
42334237
return Res;
4238+
ZeEvent = (*Event)->ZeEvent;
42344239
}
42354240

42364241
ze_event_handle_t *ZeEventWaitList =
@@ -4311,9 +4316,10 @@ pi_result piEnqueueMemBufferMap(pi_queue Queue, pi_mem Buffer,
43114316

43124317
if (Event) {
43134318
auto Res = createEventAndAssociateQueue(
4314-
Queue, Event, PI_COMMAND_TYPE_MEM_BUFFER_MAP, ZeCommandList, &ZeEvent);
4319+
Queue, Event, PI_COMMAND_TYPE_MEM_BUFFER_MAP, ZeCommandList);
43154320
if (Res != PI_SUCCESS)
43164321
return Res;
4322+
ZeEvent = (*Event)->ZeEvent;
43174323
}
43184324

43194325
// TODO: Level Zero is missing the memory "mapping" capabilities, so we are
@@ -4404,11 +4410,11 @@ pi_result piEnqueueMemUnmap(pi_queue Queue, pi_mem MemObj, void *MappedPtr,
44044410
std::lock_guard<std::mutex> lock(Queue->PiQueueMutex);
44054411

44064412
if (Event) {
4407-
auto Res = createEventAndAssociateQueue(Queue, Event,
4408-
PI_COMMAND_TYPE_MEM_BUFFER_UNMAP,
4409-
ZeCommandList, &ZeEvent);
4413+
auto Res = createEventAndAssociateQueue(
4414+
Queue, Event, PI_COMMAND_TYPE_MEM_BUFFER_UNMAP, ZeCommandList);
44104415
if (Res != PI_SUCCESS)
44114416
return Res;
4417+
ZeEvent = (*Event)->ZeEvent;
44124418
}
44134419

44144420
_pi_mem::Mapping MapInfo = {};
@@ -4547,10 +4553,11 @@ enqueueMemImageCommandHelper(pi_command_type CommandType, pi_queue Queue,
45474553

45484554
ze_event_handle_t ZeEvent = nullptr;
45494555
if (Event) {
4550-
auto Res = createEventAndAssociateQueue(Queue, Event, CommandType,
4551-
ZeCommandList, &ZeEvent);
4556+
auto Res =
4557+
createEventAndAssociateQueue(Queue, Event, CommandType, ZeCommandList);
45524558
if (Res != PI_SUCCESS)
45534559
return Res;
4560+
ZeEvent = (*Event)->ZeEvent;
45544561
}
45554562

45564563
ze_event_handle_t *ZeEventWaitList =
@@ -5150,9 +5157,10 @@ pi_result piextUSMEnqueuePrefetch(pi_queue Queue, const void *Ptr, size_t Size,
51505157
ze_event_handle_t ZeEvent = nullptr;
51515158
if (Event) {
51525159
auto Res = createEventAndAssociateQueue(Queue, Event, PI_COMMAND_TYPE_USER,
5153-
ZeCommandList, &ZeEvent);
5160+
ZeCommandList);
51545161
if (Res != PI_SUCCESS)
51555162
return Res;
5163+
ZeEvent = (*Event)->ZeEvent;
51565164
}
51575165

51585166
ze_event_handle_t *ZeEventWaitList =
@@ -5205,9 +5213,10 @@ pi_result piextUSMEnqueueMemAdvise(pi_queue Queue, const void *Ptr,
52055213
ze_event_handle_t ZeEvent = nullptr;
52065214
if (Event) {
52075215
auto Res = createEventAndAssociateQueue(Queue, Event, PI_COMMAND_TYPE_USER,
5208-
ZeCommandList, &ZeEvent);
5216+
ZeCommandList);
52095217
if (Res != PI_SUCCESS)
52105218
return Res;
5219+
ZeEvent = (*Event)->ZeEvent;
52115220
}
52125221

52135222
ZE_CALL(zeCommandListAppendMemAdvise(ZeCommandList, Queue->Device->ZeDevice,

0 commit comments

Comments
 (0)