diff --git a/shared/source/dll/linux/drm_neo_create.cpp b/shared/source/dll/linux/drm_neo_create.cpp index da54a1464e..76c3284e40 100644 --- a/shared/source/dll/linux/drm_neo_create.cpp +++ b/shared/source/dll/linux/drm_neo_create.cpp @@ -106,6 +106,9 @@ Drm *Drm::create(std::unique_ptr &&hwDeviceId, RootDeviceEnvironm drm->queryAdapterBDF(); + drm->configureScratchPagePolicy(); + drm->configureGpuFaultCheckThreshold(); + return drm.release(); } diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index a5935168dc..9d9771cb4b 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -1043,24 +1043,20 @@ bool Drm::hasKmdMigrationSupport() const { return kmdMigrationSupported; } -bool Drm::checkToDisableScratchPage() { - std::call_once(checkToDisableScratchPageOnce, [this]() { - if (debugManager.flags.DisableScratchPages.get() != -1) { - disableScratch = !!debugManager.flags.DisableScratchPages.get(); - return; - } - const auto &productHelper = this->getRootDeviceEnvironment().getHelper(); - disableScratch = (productHelper.isDisableScratchPagesSupported() && - !rootDeviceEnvironment.executionEnvironment.isDebuggingEnabled()); - }); - return disableScratch; +void Drm::configureScratchPagePolicy() { + if (debugManager.flags.DisableScratchPages.get() != -1) { + disableScratch = !!debugManager.flags.DisableScratchPages.get(); + return; + } + const auto &productHelper = this->getRootDeviceEnvironment().getHelper(); + disableScratch = (productHelper.isDisableScratchPagesSupported() && + !rootDeviceEnvironment.executionEnvironment.isDebuggingEnabled()); } -unsigned int Drm::getGpuFaultCheckThreshold() const { +void Drm::configureGpuFaultCheckThreshold() { if (debugManager.flags.GpuFaultCheckThreshold.get() != -1) { - return debugManager.flags.GpuFaultCheckThreshold.get(); + gpuFaultCheckThreshold = debugManager.flags.GpuFaultCheckThreshold.get(); } - return 10u; } unsigned int Drm::bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, aub_stream::EngineType engineType, bool engineInstancedDevice) { diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index c3d59e00a3..561a7f67f9 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -167,8 +167,10 @@ class Drm : public DriverModel { MOCKABLE_VIRTUAL void queryPageFaultSupport(); bool hasPageFaultSupport() const; bool hasKmdMigrationSupport() const; - bool checkToDisableScratchPage(); - unsigned int getGpuFaultCheckThreshold() const; + bool checkToDisableScratchPage() { return disableScratch; } + unsigned int getGpuFaultCheckThreshold() const { return gpuFaultCheckThreshold; } + void configureScratchPagePolicy(); + void configureGpuFaultCheckThreshold(); bool checkGpuPageFaultRequired() { return (checkToDisableScratchPage() && getGpuFaultCheckThreshold() != 0); @@ -338,7 +340,6 @@ class Drm : public DriverModel { std::once_flag checkSetPairOnce; std::once_flag checkChunkingOnce; std::once_flag checkCompletionFenceOnce; - std::once_flag checkToDisableScratchPageOnce; RootDeviceEnvironment &rootDeviceEnvironment; @@ -357,6 +358,7 @@ class Drm : public DriverModel { bool completionFenceSupported = false; bool vmBindPatIndexProgrammingSupported = false; bool disableScratch = false; + uint32_t gpuFaultCheckThreshold = 10u; std::atomic gpuFaultCheckCounter{0u}; diff --git a/shared/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp index 1eae82c197..7cb37d7903 100644 --- a/shared/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_command_stream_tests.cpp @@ -1155,7 +1155,8 @@ HWTEST_TEMPLATED_F(DrmCommandStreamEnhancedTest, for (int gpuFaultCheckThreshold : {0, 10}) { debugManager.flags.DisableScratchPages.set(disableScratchPage); debugManager.flags.GpuFaultCheckThreshold.set(gpuFaultCheckThreshold); - mock->disableScratch = disableScratchPage; + mock->configureScratchPagePolicy(); + mock->configureGpuFaultCheckThreshold(); TestedDrmCommandStreamReceiver *testedCsr = new TestedDrmCommandStreamReceiver(GemCloseWorkerMode::gemCloseWorkerInactive, diff --git a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp index 62d76069c5..f0c8d26e88 100644 --- a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp @@ -7372,7 +7372,9 @@ TEST_F(DrmMemoryManagerTest, givenDrmAllocationWithDifferentScratchPageOptionsWh for (int gpuFaultCheckThreshold : {0, 10}) { debugManager.flags.DisableScratchPages.set(disableScratchPage); debugManager.flags.GpuFaultCheckThreshold.set(gpuFaultCheckThreshold); - mock->disableScratch = disableScratchPage; + + mock->configureScratchPagePolicy(); + mock->configureGpuFaultCheckThreshold(); mock->ioctlCnt.reset(); mock->waitUserFenceCall.called = 0u; diff --git a/shared/test/unit_test/os_interface/linux/drm_query_prelim_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_query_prelim_tests.cpp index c5cf2c04c6..62b35625ab 100644 --- a/shared/test/unit_test/os_interface/linux/drm_query_prelim_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_query_prelim_tests.cpp @@ -300,6 +300,8 @@ TEST(DrmBufferObjectTestPrelim, givenDisableScratchPagesWhenCreateDrmVirtualMemo auto executionEnvironment = std::make_unique(); DrmQueryMock drm{*executionEnvironment->rootDeviceEnvironments[0]}; + drm.configureScratchPagePolicy(); + drm.configureGpuFaultCheckThreshold(); uint32_t vmId = 0; drm.createDrmVirtualMemory(vmId); @@ -314,6 +316,8 @@ TEST(DrmBufferObjectPrelim, givenDebuggingEnabledWithoutDisableScratchPagesFlagS auto executionEnvironment = std::make_unique(); executionEnvironment->setDebuggingMode(NEO::DebuggingMode::online); DrmQueryMock drm{*executionEnvironment->rootDeviceEnvironments[0]}; + drm.configureScratchPagePolicy(); + drm.configureGpuFaultCheckThreshold(); uint32_t vmId = 0; drm.createDrmVirtualMemory(vmId); @@ -329,6 +333,8 @@ TEST(DrmBufferObjectTestPrelim, givenDisableScratchPagesAndDebuggingEnabledWhenC auto executionEnvironment = std::make_unique(); executionEnvironment->setDebuggingMode(NEO::DebuggingMode::online); DrmQueryMock drm{*executionEnvironment->rootDeviceEnvironments[0]}; + drm.configureScratchPagePolicy(); + drm.configureGpuFaultCheckThreshold(); uint32_t vmId = 0; drm.createDrmVirtualMemory(vmId); diff --git a/shared/test/unit_test/os_interface/linux/drm_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_tests.cpp index 0f863d2370..7189d45eff 100644 --- a/shared/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_tests.cpp @@ -1430,6 +1430,8 @@ TEST(DrmDeathTest, GivenResetStatsWithValidFaultWhenIsGpuHangIsCalledThenProcess MockExecutionEnvironment executionEnvironment{}; DrmMock drm{*executionEnvironment.rootDeviceEnvironments[0]}; + drm.configureScratchPagePolicy(); + drm.configureGpuFaultCheckThreshold(); uint32_t contextId{0}; EngineDescriptor engineDescriptor{EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::regular})}; auto ioctlHelper = std::make_unique(drm); @@ -1460,6 +1462,8 @@ HWTEST2_F(DrmDisableScratchPagesDefaultTest, givenDefaultDisableScratchPagesThenCheckingGpuFaultCheckIsSetToDefaultValueAndScratchPageIsDisabled, IsPVC) { auto executionEnvironment = std::make_unique(); DrmMockCheckPageFault drm{*executionEnvironment->rootDeviceEnvironments[0]}; + drm.configureScratchPagePolicy(); + drm.configureGpuFaultCheckThreshold(); EXPECT_TRUE(drm.checkToDisableScratchPage()); EXPECT_EQ(10u, drm.getGpuFaultCheckThreshold()); } @@ -1468,6 +1472,8 @@ HWTEST2_F(DrmDisableScratchPagesDefaultTest, givenDefaultDisableScratchPagesThenCheckingGpuFaultCheckIsSetToDefaultAndScratchPageIsEnabled, IsNotPVC) { auto executionEnvironment = std::make_unique(); DrmMockCheckPageFault drm{*executionEnvironment->rootDeviceEnvironments[0]}; + drm.configureScratchPagePolicy(); + drm.configureGpuFaultCheckThreshold(); EXPECT_FALSE(drm.checkToDisableScratchPage()); EXPECT_EQ(10u, drm.getGpuFaultCheckThreshold()); } @@ -1484,24 +1490,32 @@ TEST(DrmTest, givenDisableScratchPagesWhenSettingGpuFaultCheckThresholdThenThesh debugManager.flags.DisableScratchPages.set(false); debugManager.flags.GpuFaultCheckThreshold.set(-1); DrmMockCheckPageFault drm1{*executionEnvironment->rootDeviceEnvironments[0]}; + drm1.configureScratchPagePolicy(); + drm1.configureGpuFaultCheckThreshold(); EXPECT_FALSE(drm1.checkToDisableScratchPage()); EXPECT_EQ(10u, drm1.getGpuFaultCheckThreshold()); debugManager.flags.DisableScratchPages.set(true); debugManager.flags.GpuFaultCheckThreshold.set(-1); DrmMockCheckPageFault drm2{*executionEnvironment->rootDeviceEnvironments[0]}; + drm2.configureScratchPagePolicy(); + drm2.configureGpuFaultCheckThreshold(); EXPECT_TRUE(drm2.checkToDisableScratchPage()); EXPECT_EQ(10u, drm2.getGpuFaultCheckThreshold()); debugManager.flags.DisableScratchPages.set(true); debugManager.flags.GpuFaultCheckThreshold.set(threshold); DrmMockCheckPageFault drm3{*executionEnvironment->rootDeviceEnvironments[0]}; + drm3.configureScratchPagePolicy(); + drm3.configureGpuFaultCheckThreshold(); EXPECT_TRUE(drm3.checkToDisableScratchPage()); EXPECT_EQ(threshold, drm3.getGpuFaultCheckThreshold()); debugManager.flags.DisableScratchPages.set(false); debugManager.flags.GpuFaultCheckThreshold.set(threshold); DrmMockCheckPageFault drm4{*executionEnvironment->rootDeviceEnvironments[0]}; + drm4.configureScratchPagePolicy(); + drm4.configureGpuFaultCheckThreshold(); EXPECT_FALSE(drm4.checkToDisableScratchPage()); EXPECT_EQ(threshold, drm4.getGpuFaultCheckThreshold()); } @@ -1532,6 +1546,8 @@ TEST(DrmTest, givenDisableScratchPagesSetWhenSettingGpuFaultCheckThresholdThenFa auto memoryManager = new MockDrmMemoryManagerCheckPageFault(GemCloseWorkerMode::gemCloseWorkerInactive, false, false, *executionEnvironment); executionEnvironment->memoryManager.reset(memoryManager); auto &drm = *executionEnvironment->rootDeviceEnvironments[0]->osInterface->getDriverModel()->as(); + drm.configureScratchPagePolicy(); + drm.configureGpuFaultCheckThreshold(); uint32_t contextId{0}; EngineDescriptor engineDescriptor{EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::regular})}; @@ -1573,6 +1589,8 @@ TEST(DrmTest, givenDisableScratchPagesSetWhenSettingGpuFaultCheckThresholdToZero auto memoryManager = new MockDrmMemoryManagerCheckPageFault(GemCloseWorkerMode::gemCloseWorkerInactive, false, false, *executionEnvironment); executionEnvironment->memoryManager.reset(memoryManager); auto &drm = *executionEnvironment->rootDeviceEnvironments[0]->osInterface->getDriverModel()->as(); + drm.configureScratchPagePolicy(); + drm.configureGpuFaultCheckThreshold(); uint32_t contextId{0}; EngineDescriptor engineDescriptor{EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::regular})}; @@ -1607,6 +1625,8 @@ TEST(DrmTest, whenNotDisablingScratchPagesThenFaultCheckingDoesNotHappen) { auto memoryManager = new MockDrmMemoryManagerCheckPageFault(GemCloseWorkerMode::gemCloseWorkerInactive, false, false, *executionEnvironment); executionEnvironment->memoryManager.reset(memoryManager); auto &drm = *executionEnvironment->rootDeviceEnvironments[0]->osInterface->getDriverModel()->as(); + drm.configureScratchPagePolicy(); + drm.configureGpuFaultCheckThreshold(); uint32_t contextId{0}; EngineDescriptor engineDescriptor{EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::regular})};