diff --git a/source/loader/layers/sanitizer/asan/asan_ddi.cpp b/source/loader/layers/sanitizer/asan/asan_ddi.cpp index c11e6a77b1..7b0c2e581f 100644 --- a/source/loader/layers/sanitizer/asan/asan_ddi.cpp +++ b/source/loader/layers/sanitizer/asan/asan_ddi.cpp @@ -474,6 +474,13 @@ __urdlllocal ur_result_t UR_APICALL urEnqueueKernelLaunch( /// [out][optional] return an event object that identifies this /// particular kernel execution instance. ur_event_handle_t *phEvent) { + + // This mutex is to prevent concurrent kernel launches across different queues + // as the DeviceASAN local/private shadow memory does not support concurrent + // kernel launches now. + std::scoped_lock Guard( + getAsanInterceptor()->KernelLaunchMutex); + auto pfnKernelLaunch = getContext()->urDdiTable.Enqueue.pfnKernelLaunch; if (nullptr == pfnKernelLaunch) { diff --git a/source/loader/layers/sanitizer/asan/asan_interceptor.hpp b/source/loader/layers/sanitizer/asan/asan_interceptor.hpp index 2f1c712d8e..3f0a4642c9 100644 --- a/source/loader/layers/sanitizer/asan/asan_interceptor.hpp +++ b/source/loader/layers/sanitizer/asan/asan_interceptor.hpp @@ -354,6 +354,8 @@ class AsanInterceptor { std::shared_ptr getOrCreateShadowMemory(ur_device_handle_t Device, DeviceType Type); + ur_shared_mutex KernelLaunchMutex; + private: ur_result_t updateShadowMemory(std::shared_ptr &ContextInfo, std::shared_ptr &DeviceInfo,