Skip to content

Commit

Permalink
Move event resets from SignalCommandList to ComputeCommandList
Browse files Browse the repository at this point in the history
Moves the call to event reset for the WaitEvent and AllResetEvent
to the ComputeCommandList.

This fixes a potential race condition where, if the SignalCommandList
executes before the ComputeCommandList, the WaitEvent could be reset
before the ComputeCommandList can wait on it and, consequently,
create a deadlock.
  • Loading branch information
fabiomestre committed Dec 18, 2024
1 parent 39df031 commit 1743ecf
Showing 1 changed file with 10 additions and 9 deletions.
19 changes: 10 additions & 9 deletions source/adapters/level_zero/command_buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -834,6 +834,16 @@ finalizeWaitEventPath(ur_exp_command_buffer_handle_t CommandBuffer) {
(CommandBuffer->ZeCommandListResetEvents,
CommandBuffer->ExecutionFinishedEvent->ZeEvent));

// Reset the wait-event for the UR command-buffer that is signaled when its
// submission dependencies have been satisfied.
ZE2UR_CALL(zeCommandListAppendEventReset,
(CommandBuffer->ZeComputeCommandList, CommandBuffer->WaitEvent->ZeEvent));

// Reset the all-reset-event for the UR command-buffer that is signaled when
// all events of the main command-list have been reset.
ZE2UR_CALL(zeCommandListAppendEventReset,
(CommandBuffer->ZeComputeCommandList, CommandBuffer->AllResetEvent->ZeEvent));

if (CommandBuffer->IsInOrderCmdList) {
ZE2UR_CALL(zeCommandListAppendSignalEvent,
(CommandBuffer->ZeComputeCommandList,
Expand Down Expand Up @@ -1683,15 +1693,6 @@ ur_result_t enqueueWaitEventPath(ur_exp_command_buffer_handle_t CommandBuffer,
(ZeCopyCommandQueue, 1, &CommandBuffer->ZeCopyCommandList, nullptr));
}

// Reset the wait-event for the UR command-buffer that is signaled when its
// submission dependencies have been satisfied.
ZE2UR_CALL(zeCommandListAppendEventReset,
(SignalCommandList->first, CommandBuffer->WaitEvent->ZeEvent));
// Reset the all-reset-event for the UR command-buffer that is signaled when
// all events of the main command-list have been reset.
ZE2UR_CALL(zeCommandListAppendEventReset,
(SignalCommandList->first, CommandBuffer->AllResetEvent->ZeEvent));

if (DoProfiling) {
UR_CALL(appendProfilingQueries(CommandBuffer, SignalCommandList->first,
*Event,
Expand Down

0 comments on commit 1743ecf

Please sign in to comment.