From fbd879482c8bce659e98e1448a2c134e3bcc8b18 Mon Sep 17 00:00:00 2001 From: "Zhang, Winston" Date: Thu, 12 Dec 2024 00:29:32 +0000 Subject: [PATCH 1/2] [L0] Fixed event leak when outevent is given and is completed Signed-off-by: Zhang, Winston --- source/adapters/level_zero/event.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/adapters/level_zero/event.cpp b/source/adapters/level_zero/event.cpp index c1e93483b8..a0b3dcd328 100644 --- a/source/adapters/level_zero/event.cpp +++ b/source/adapters/level_zero/event.cpp @@ -145,6 +145,10 @@ ur_result_t urEnqueueEventsWait( std::unique_lock Lock(Queue->Mutex); resetCommandLists(Queue); } + if (OutEvent && (*OutEvent)->Completed) { + UR_CALL(CleanupCompletedEvent((*OutEvent), false, false)); + UR_CALL(urEventReleaseInternal((*OutEvent))); + } return UR_RESULT_SUCCESS; } @@ -955,7 +959,6 @@ ur_result_t urEventCreateWithNativeHandle( UREvent = new ur_event_handle_t_(ZeEvent, nullptr /* ZeEventPool */, Context, UR_EXT_COMMAND_TYPE_USER, Properties->isNativeHandleOwned); - UREvent->RefCountExternal++; } catch (const std::bad_alloc &) { @@ -1111,6 +1114,7 @@ ur_result_t urEventReleaseInternal(ur_event_handle_t Event) { // enabled or not, so we access properties of the queue and that's why queue // must released later. if (DisableEventsCaching || !Event->OwnNativeHandle) { + ZE_CALL_NOCHECK(zeEventDestroy, (Event->ZeEvent)); delete Event; } else { Event->Context->addEventToContextCache(Event); From 3756b45fde2732510146a5ab955baaef91d20d1b Mon Sep 17 00:00:00 2001 From: "Zhang, Winston" Date: Thu, 12 Dec 2024 23:34:38 +0000 Subject: [PATCH 2/2] [L0] Double free during urEventReleaseInternal Signed-off-by: Zhang, Winston --- source/adapters/level_zero/event.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/source/adapters/level_zero/event.cpp b/source/adapters/level_zero/event.cpp index a0b3dcd328..eae16f0c57 100644 --- a/source/adapters/level_zero/event.cpp +++ b/source/adapters/level_zero/event.cpp @@ -1114,7 +1114,6 @@ ur_result_t urEventReleaseInternal(ur_event_handle_t Event) { // enabled or not, so we access properties of the queue and that's why queue // must released later. if (DisableEventsCaching || !Event->OwnNativeHandle) { - ZE_CALL_NOCHECK(zeEventDestroy, (Event->ZeEvent)); delete Event; } else { Event->Context->addEventToContextCache(Event);