From f08b32761ead91f77c11b351003e719193f6ecca Mon Sep 17 00:00:00 2001 From: Szymon Morek Date: Thu, 6 Mar 2025 17:04:43 +0000 Subject: [PATCH] fix: avoid race when evicting resources Related-To: NEO-13843 DrmMemoryOperationsHandler::mutex is used for residency handling. However, this mutex is not being locked during eviction when vm bind failed. This is causing races for example when ULLS controller wants to make resources resident, and user thread wants to evict them. Fix is to explicitly obtain lock in problematic path. Signed-off-by: Szymon Morek --- shared/source/os_interface/linux/drm_buffer_object.cpp | 2 ++ .../os_interface/linux/drm_memory_operations_handler_bind.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/shared/source/os_interface/linux/drm_buffer_object.cpp b/shared/source/os_interface/linux/drm_buffer_object.cpp index 91886f94cc..707feb1000 100644 --- a/shared/source/os_interface/linux/drm_buffer_object.cpp +++ b/shared/source/os_interface/linux/drm_buffer_object.cpp @@ -326,6 +326,7 @@ int BufferObject::pin(BufferObject *const boToPin[], size_t numberOfBos, OsConte auto retVal = 0; if (this->drm->isVmBindAvailable()) { + auto lock = static_cast(this->drm->getRootDeviceEnvironment().memoryOperationsInterface.get())->lockHandlerIfUsed(); retVal = bindBOsWithinContext(boToPin, numberOfBos, osContext, vmHandleId, false); } else { StackVec execObject(numberOfBos + 1); @@ -339,6 +340,7 @@ int BufferObject::validateHostPtr(BufferObject *const boToPin[], size_t numberOf auto retVal = 0; if (this->drm->isVmBindAvailable()) { + auto lock = static_cast(this->drm->getRootDeviceEnvironment().memoryOperationsInterface.get())->lockHandlerIfUsed(); for (size_t i = 0; i < numberOfBos; i++) { retVal = boToPin[i]->bind(osContext, vmHandleId, false); if (retVal) { diff --git a/shared/source/os_interface/linux/drm_memory_operations_handler_bind.cpp b/shared/source/os_interface/linux/drm_memory_operations_handler_bind.cpp index 74cbe41709..5174cd0595 100644 --- a/shared/source/os_interface/linux/drm_memory_operations_handler_bind.cpp +++ b/shared/source/os_interface/linux/drm_memory_operations_handler_bind.cpp @@ -157,7 +157,7 @@ MemoryOperationsStatus DrmMemoryOperationsHandlerBind::mergeWithResidencyContain } std::unique_lock DrmMemoryOperationsHandlerBind::lockHandlerIfUsed() { - return std::unique_lock(); + return std::unique_lock(mutex); } MemoryOperationsStatus DrmMemoryOperationsHandlerBind::evictUnusedAllocations(bool waitForCompletion, bool isLockNeeded) {