diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 055bcecbc5..cc898b6aa2 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -426,6 +426,7 @@ DECLARE_DEBUG_VARIABLE(bool, DirectSubmissionPrintBuffers, false, "Print address /*FEATURE FLAGS*/ DECLARE_DEBUG_VARIABLE(bool, USMEvictAfterMigration, false, "Evict USM allocation after implicit migration to GPU") +DECLARE_DEBUG_VARIABLE(bool, RegisterPageFaultHandlerOnMigration, true, "Register handler on migration to GPU when current is not from pagefault manager") DECLARE_DEBUG_VARIABLE(bool, EnableNV12, true, "Enables NV12 extension") DECLARE_DEBUG_VARIABLE(bool, EnablePackedYuv, true, "Enables cl_packed_yuv extension") DECLARE_DEBUG_VARIABLE(bool, EnableDeferredDeleter, true, "Enables async deleter") diff --git a/shared/source/page_fault_manager/cpu_page_fault_manager.cpp b/shared/source/page_fault_manager/cpu_page_fault_manager.cpp index 5c72c941b2..4434f76c84 100644 --- a/shared/source/page_fault_manager/cpu_page_fault_manager.cpp +++ b/shared/source/page_fault_manager/cpu_page_fault_manager.cpp @@ -77,9 +77,12 @@ inline void PageFaultManager::migrateStorageToGpuDomain(void *ptr, PageFaultData std::chrono::steady_clock::time_point start; std::chrono::steady_clock::time_point end; - if (this->checkFaultHandlerFromPageFaultManager() == false) { - this->registerFaultHandler(); + if (debugManager.flags.RegisterPageFaultHandlerOnMigration.get()) { + if (this->checkFaultHandlerFromPageFaultManager() == false) { + this->registerFaultHandler(); + } } + start = std::chrono::steady_clock::now(); this->transferToGpu(ptr, pageFaultData.cmdQ); end = std::chrono::steady_clock::now(); diff --git a/shared/test/common/test_files/igdrcl.config b/shared/test/common/test_files/igdrcl.config index 525cbb1458..b8b6639c7f 100644 --- a/shared/test/common/test_files/igdrcl.config +++ b/shared/test/common/test_files/igdrcl.config @@ -26,6 +26,7 @@ SetCommandStreamReceiver = -1 TbxPort = 4321 TbxFrontdoorMode = 0 FlattenBatchBufferForAUBDump = 0 +RegisterPageFaultHandlerOnMigration = 1 AddPatchInfoCommentsForAUBDump = 0 UseAubStream = 1 AUBDumpAllocsOnEnqueueReadOnly = 0 diff --git a/shared/test/unit_test/page_fault_manager/cpu_page_fault_manager_tests.cpp b/shared/test/unit_test/page_fault_manager/cpu_page_fault_manager_tests.cpp index e2bd45bc28..2ebd232f76 100644 --- a/shared/test/unit_test/page_fault_manager/cpu_page_fault_manager_tests.cpp +++ b/shared/test/unit_test/page_fault_manager/cpu_page_fault_manager_tests.cpp @@ -289,6 +289,32 @@ TEST_F(PageFaultManagerTest, givenUnifiedMemoryAllocWhenMoveToGpuDomainTwiceThen EXPECT_TRUE(pageFaultManager->checkFaultHandlerFromPageFaultManager()); } +TEST_F(PageFaultManagerTest, givenRegisterPageFaultHandlerOnMigrationDisabledWhenMoveToGpuDomainThenDoNotRegisterHandler) { + DebugManagerStateRestore restorer; + debugManager.flags.RegisterPageFaultHandlerOnMigration.set(false); + + void *cmdQ = reinterpret_cast(0xFFFF); + void *alloc1 = reinterpret_cast(0x1); + + pageFaultManager->insertAllocation(alloc1, 10u, unifiedMemoryManager.get(), cmdQ, {}); + EXPECT_EQ(pageFaultManager->memoryData.size(), 1u); + EXPECT_EQ(pageFaultManager->transferToCpuCalled, 0); + + EXPECT_FALSE(pageFaultManager->checkFaultHandlerFromPageFaultManager()); + + pageFaultManager->moveAllocationToGpuDomain(alloc1); + EXPECT_EQ(pageFaultManager->allowMemoryAccessCalled, 0); + EXPECT_EQ(pageFaultManager->protectMemoryCalled, 1); + EXPECT_EQ(pageFaultManager->transferToCpuCalled, 0); + EXPECT_EQ(pageFaultManager->transferToGpuCalled, 1); + EXPECT_EQ(pageFaultManager->registerFaultHandlerCalled, 0); + EXPECT_EQ(pageFaultManager->protectedMemoryAccessAddress, alloc1); + EXPECT_EQ(pageFaultManager->protectedSize, 10u); + EXPECT_EQ(pageFaultManager->transferToGpuAddress, alloc1); + + EXPECT_FALSE(pageFaultManager->checkFaultHandlerFromPageFaultManager()); +} + TEST_F(PageFaultManagerTest, givenUnifiedMemoryAllocWhenMovingToGpuDomainThenUpdateNonGpuAllocsContainer) { void *alloc1 = reinterpret_cast(0x1); void *alloc2 = reinterpret_cast(0x2);