Skip to content

Commit a9c6892

Browse files
zhaomaosuKornevNikita
authored andcommitted
[DevSanitizer] Fix event and usm leak in sanitizer layer (#18194)
* Release local & private shadow memory * Release events after call urEnqueueEventsWait --------- Signed-off-by: Zhao, Maosu <[email protected]>
1 parent bc5ad27 commit a9c6892

File tree

6 files changed

+43
-27
lines changed

6 files changed

+43
-27
lines changed

unified-runtime/source/loader/layers/sanitizer/asan/asan_buffer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ ur_result_t EnqueueMemCopyRectHelper(
6666
UR_CALL(getContext()->urDdiTable.Enqueue.pfnEventsWait(Queue, Events.size(),
6767
Events.data(), Event));
6868

69+
for (const auto &E : Events)
70+
UR_CALL(getContext()->urDdiTable.Event.pfnRelease(E));
71+
6972
return UR_RESULT_SUCCESS;
7073
}
7174

unified-runtime/source/loader/layers/sanitizer/msan/msan_buffer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ ur_result_t EnqueueMemCopyRectHelper(
106106
&Events[0], Event));
107107
}
108108

109+
for (const auto &E : Events)
110+
UR_CALL(getContext()->urDdiTable.Event.pfnRelease(E));
111+
109112
return UR_RESULT_SUCCESS;
110113
}
111114

unified-runtime/source/loader/layers/sanitizer/msan/msan_ddi.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,9 @@ ur_result_t urEnqueueMemBufferWrite(
812812
UR_CALL(getContext()->urDdiTable.Enqueue.pfnEventsWait(
813813
hQueue, Events.size(), Events.data(), phEvent));
814814
}
815+
816+
for (const auto &E : Events)
817+
UR_CALL(getContext()->urDdiTable.Event.pfnRelease(E));
815818
} else {
816819
UR_CALL(pfnMemBufferWrite(hQueue, hBuffer, blockingWrite, offset, size,
817820
pSrc, numEventsInWaitList, phEventWaitList,
@@ -1010,6 +1013,9 @@ ur_result_t urEnqueueMemBufferCopy(
10101013
UR_CALL(getContext()->urDdiTable.Enqueue.pfnEventsWait(
10111014
hQueue, Events.size(), Events.data(), phEvent));
10121015
}
1016+
1017+
for (const auto &E : Events)
1018+
UR_CALL(getContext()->urDdiTable.Event.pfnRelease(E));
10131019
} else {
10141020
UR_CALL(pfnMemBufferCopy(hQueue, hBufferSrc, hBufferDst, srcOffset,
10151021
dstOffset, size, numEventsInWaitList,
@@ -1140,6 +1146,9 @@ ur_result_t urEnqueueMemBufferFill(
11401146
UR_CALL(getContext()->urDdiTable.Enqueue.pfnEventsWait(
11411147
hQueue, Events.size(), Events.data(), phEvent));
11421148
}
1149+
1150+
for (const auto &E : Events)
1151+
UR_CALL(getContext()->urDdiTable.Event.pfnRelease(E));
11431152
} else {
11441153
UR_CALL(pfnMemBufferFill(hQueue, hBuffer, pPattern, patternSize, offset,
11451154
size, numEventsInWaitList, phEventWaitList,
@@ -1468,6 +1477,9 @@ ur_result_t UR_APICALL urEnqueueUSMFill(
14681477
hQueue, Events.size(), Events.data(), phEvent));
14691478
}
14701479

1480+
for (const auto &E : Events)
1481+
UR_CALL(getContext()->urDdiTable.Event.pfnRelease(E));
1482+
14711483
return UR_RESULT_SUCCESS;
14721484
}
14731485

@@ -1539,6 +1551,9 @@ ur_result_t UR_APICALL urEnqueueUSMMemcpy(
15391551
hQueue, Events.size(), Events.data(), phEvent));
15401552
}
15411553

1554+
for (const auto &E : Events)
1555+
UR_CALL(getContext()->urDdiTable.Event.pfnRelease(E));
1556+
15421557
return UR_RESULT_SUCCESS;
15431558
}
15441559

@@ -1602,6 +1617,9 @@ ur_result_t UR_APICALL urEnqueueUSMFill2D(
16021617
hQueue, Events.size(), Events.data(), phEvent));
16031618
}
16041619

1620+
for (const auto &E : Events)
1621+
UR_CALL(getContext()->urDdiTable.Event.pfnRelease(E));
1622+
16051623
return UR_RESULT_SUCCESS;
16061624
}
16071625

@@ -1684,6 +1702,9 @@ ur_result_t UR_APICALL urEnqueueUSMMemcpy2D(
16841702
hQueue, Events.size(), Events.data(), phEvent));
16851703
}
16861704

1705+
for (const auto &E : Events)
1706+
UR_CALL(getContext()->urDdiTable.Event.pfnRelease(E));
1707+
16871708
return UR_RESULT_SUCCESS;
16881709
}
16891710

unified-runtime/source/loader/layers/sanitizer/msan/msan_shadow.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,16 @@ ur_result_t MsanShadowMemoryGPU::Destory() {
166166
static ur_result_t Result = [this]() {
167167
auto Result = getContext()->urDdiTable.VirtualMem.pfnFree(
168168
Context, (const void *)ShadowBegin, GetShadowSize());
169+
if (PrivateShadowOffset != 0) {
170+
UR_CALL(getContext()->urDdiTable.USM.pfnFree(
171+
Context, (void *)PrivateShadowOffset));
172+
PrivateShadowOffset = 0;
173+
}
174+
if (LocalShadowOffset != 0) {
175+
UR_CALL(getContext()->urDdiTable.USM.pfnFree(Context,
176+
(void *)LocalShadowOffset));
177+
LocalShadowOffset = 0;
178+
}
169179
getContext()->urDdiTable.Context.pfnRelease(Context);
170180
return Result;
171181
}();

unified-runtime/source/loader/layers/sanitizer/tsan/tsan_buffer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ ur_result_t EnqueueMemCopyRectHelper(
7474
&Events[0], Event));
7575
}
7676

77+
for (const auto &E : Events)
78+
UR_CALL(getContext()->urDdiTable.Event.pfnRelease(E));
79+
7780
return UR_RESULT_SUCCESS;
7881
}
7982

unified-runtime/source/loader/layers/sanitizer/tsan/tsan_ddi.cpp

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -467,18 +467,10 @@ ur_result_t urEnqueueMemBufferWrite(
467467
if (auto MemBuffer = getTsanInterceptor()->getMemBuffer(hBuffer)) {
468468
ur_device_handle_t Device = GetDevice(hQueue);
469469
char *pDst = nullptr;
470-
std::vector<ur_event_handle_t> Events;
471-
ur_event_handle_t Event{};
472470
UR_CALL(MemBuffer->getHandle(Device, pDst));
473471
UR_CALL(getContext()->urDdiTable.Enqueue.pfnUSMMemcpy(
474472
hQueue, blockingWrite, pDst + offset, pSrc, size, numEventsInWaitList,
475-
phEventWaitList, &Event));
476-
Events.push_back(Event);
477-
478-
if (phEvent) {
479-
UR_CALL(getContext()->urDdiTable.Enqueue.pfnEventsWait(
480-
hQueue, Events.size(), Events.data(), phEvent));
481-
}
473+
phEventWaitList, phEvent));
482474
} else {
483475
UR_CALL(getContext()->urDdiTable.Enqueue.pfnMemBufferWrite(
484476
hQueue, hBuffer, blockingWrite, offset, size, pSrc, numEventsInWaitList,
@@ -647,17 +639,9 @@ ur_result_t urEnqueueMemBufferCopy(
647639
char *DstHandle = nullptr;
648640
UR_CALL(DstBuffer->getHandle(Device, DstHandle));
649641

650-
std::vector<ur_event_handle_t> Events;
651-
ur_event_handle_t Event{};
652642
UR_CALL(getContext()->urDdiTable.Enqueue.pfnUSMMemcpy(
653643
hQueue, false, DstHandle + dstOffset, SrcHandle + srcOffset, size,
654-
numEventsInWaitList, phEventWaitList, &Event));
655-
Events.push_back(Event);
656-
657-
if (phEvent) {
658-
UR_CALL(getContext()->urDdiTable.Enqueue.pfnEventsWait(
659-
hQueue, Events.size(), Events.data(), phEvent));
660-
}
644+
numEventsInWaitList, phEventWaitList, phEvent));
661645
} else {
662646
UR_CALL(getContext()->urDdiTable.Enqueue.pfnMemBufferCopy(
663647
hQueue, hBufferSrc, hBufferDst, srcOffset, dstOffset, size,
@@ -759,19 +743,11 @@ ur_result_t urEnqueueMemBufferFill(
759743

760744
if (auto MemBuffer = getTsanInterceptor()->getMemBuffer(hBuffer)) {
761745
char *Handle = nullptr;
762-
std::vector<ur_event_handle_t> Events;
763-
ur_event_handle_t Event{};
764746
ur_device_handle_t Device = GetDevice(hQueue);
765747
UR_CALL(MemBuffer->getHandle(Device, Handle));
766748
UR_CALL(getContext()->urDdiTable.Enqueue.pfnUSMFill(
767749
hQueue, Handle + offset, patternSize, pPattern, size,
768-
numEventsInWaitList, phEventWaitList, &Event));
769-
Events.push_back(Event);
770-
771-
if (phEvent) {
772-
UR_CALL(getContext()->urDdiTable.Enqueue.pfnEventsWait(
773-
hQueue, Events.size(), Events.data(), phEvent));
774-
}
750+
numEventsInWaitList, phEventWaitList, phEvent));
775751
} else {
776752
UR_CALL(getContext()->urDdiTable.Enqueue.pfnMemBufferFill(
777753
hQueue, hBuffer, pPattern, patternSize, offset, size,

0 commit comments

Comments
 (0)