diff --git a/shared/source/memory_manager/memory_manager.cpp b/shared/source/memory_manager/memory_manager.cpp index 21fe59a39d..0750be2d8b 100644 --- a/shared/source/memory_manager/memory_manager.cpp +++ b/shared/source/memory_manager/memory_manager.cpp @@ -81,11 +81,12 @@ MemoryManager::MemoryManager(ExecutionEnvironment &executionEnvironment) : execu localMemAllocsSize[rootDeviceIndex].store(0u); } - if (anyLocalMemorySupported || debugManager.isTbxPageFaultManagerEnabled()) { - pageFaultManager = CpuPageFaultManager::create(); - if (anyLocalMemorySupported) { - prefetchManager = PrefetchManager::create(); - } + if (debugManager.isTbxPageFaultManagerEnabled()) { + initPageFaultManager(); + } + + if (anyLocalMemorySupported) { + prefetchManager = PrefetchManager::create(); } if (debugManager.flags.EnableMultiStorageResources.get() != -1) { @@ -399,6 +400,21 @@ bool MemoryManager::isLimitedRange(uint32_t rootDeviceIndex) { return getGfxPartition(rootDeviceIndex)->isLimitedRange(); } +void MemoryManager::initPageFaultManager() { + if (pageFaultManager) { + return; + } + + static std::mutex pfMtx; + std::lock_guard lock(pfMtx); + + if (pageFaultManager) { + return; + } + + pageFaultManager = CpuPageFaultManager::create(); +} + void MemoryManager::waitForDeletions() { if (deferredDeleter) { deferredDeleter->drain(false, false); diff --git a/shared/source/memory_manager/memory_manager.h b/shared/source/memory_manager/memory_manager.h index eba25ef469..748db794ff 100644 --- a/shared/source/memory_manager/memory_manager.h +++ b/shared/source/memory_manager/memory_manager.h @@ -203,6 +203,8 @@ class MemoryManager { return pageFaultManager.get(); } + void initPageFaultManager(); + PrefetchManager *getPrefetchManager() const { return prefetchManager.get(); } diff --git a/shared/source/memory_manager/unified_memory_manager.cpp b/shared/source/memory_manager/unified_memory_manager.cpp index 4d4dcf8f1b..5e7143b481 100644 --- a/shared/source/memory_manager/unified_memory_manager.cpp +++ b/shared/source/memory_manager/unified_memory_manager.cpp @@ -853,6 +853,8 @@ void *SVMAllocsManager::createZeroCopySvmAllocation(size_t size, const SvmAlloca } void *SVMAllocsManager::createUnifiedAllocationWithDeviceStorage(size_t size, const SvmAllocationProperties &svmProperties, const UnifiedMemoryProperties &unifiedMemoryProperties) { + memoryManager->initPageFaultManager(); + auto rootDeviceIndex = unifiedMemoryProperties.getRootDeviceIndex(); auto externalPtr = reinterpret_cast(unifiedMemoryProperties.allocationFlags.hostptr); bool useExternalHostPtrForCpu = externalPtr != nullptr;