From dab5469f81b76ebd1d448edba61b505b29db6ea1 Mon Sep 17 00:00:00 2001 From: Young Jin Yoon Date: Thu, 14 Mar 2024 21:41:44 +0000 Subject: [PATCH] feature: disable scratch page by default Modified default values for disableScratch and gpuPageFault to true and 10 respectively in drm_nep.cpp, in order to disable scratch pages by default. Related-To: GSD-5673 Signed-off-by: Young Jin Yoon --- shared/source/os_interface/linux/drm_neo.h | 4 +- .../linux/drm_query_prelim_tests.cpp | 6 +-- .../os_interface/linux/drm_tests.cpp | 44 ++++++++++++++++++- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index cbe3882054..d7274c6476 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -344,9 +344,9 @@ class Drm : public DriverModel { bool pageFaultSupported = false; bool completionFenceSupported = false; bool vmBindPatIndexProgrammingSupported = false; - bool disableScratch = false; + bool disableScratch = true; - uint32_t gpuFaultCheckThreshold = 0u; + uint32_t gpuFaultCheckThreshold = 10u; std::atomic gpuFaultCheckCounter{0u}; private: 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 3d5b6ad267..8321606d0a 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 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022-2023 Intel Corporation + * Copyright (C) 2022-2024 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -306,7 +306,7 @@ TEST(DrmBufferObjectTestPrelim, givenDisableScratchPagesWhenCreateDrmVirtualMemo EXPECT_TRUE(drm.receivedGemVmControl.flags & DrmPrelimHelper::getDisableScratchVmCreateFlag()); } -TEST(DrmBufferObjectTestPrelim, givenDebuggingEnabledWithoutDisableScratchPagesFlagSetWhenCreateDrmVirtualMemoryThenDisableScratchPagesFlagIsNotSet) { +TEST(DrmBufferObjectTestPrelim, givenDebuggingEnabledWithoutDisableScratchPagesFlagSetWhenCreateDrmVirtualMemoryThenDisableScratchPagesFlagIsSet) { DebugManagerStateRestore restorer; debugManager.flags.UseTileMemoryBankInVirtualMemoryCreation.set(0u); @@ -317,7 +317,7 @@ TEST(DrmBufferObjectTestPrelim, givenDebuggingEnabledWithoutDisableScratchPagesF uint32_t vmId = 0; drm.createDrmVirtualMemory(vmId); - EXPECT_FALSE(drm.receivedGemVmControl.flags & DrmPrelimHelper::getDisableScratchVmCreateFlag()); + EXPECT_TRUE(drm.receivedGemVmControl.flags & DrmPrelimHelper::getDisableScratchVmCreateFlag()); } TEST(DrmBufferObjectTestPrelim, givenDisableScratchPagesAndDebuggingEnabledWhenCreateDrmVirtualMemoryThenEnvVariableIsPriority) { 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 a029a495cc..2c5889737a 100644 --- a/shared/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_tests.cpp @@ -1447,17 +1447,22 @@ TEST(DrmTest, givenDisableScratchPagesWhenSettingGpuFaultCheckThresholdThenThesh debugManager.flags.DisableScratchPages.set(false); debugManager.flags.GpuFaultCheckThreshold.set(threshold); DrmMockCheckPageFault drm1{*executionEnvironment->rootDeviceEnvironments[0]}; - EXPECT_EQ(0u, drm1.gpuFaultCheckThreshold); + EXPECT_EQ(10u, drm1.gpuFaultCheckThreshold); debugManager.flags.DisableScratchPages.set(true); debugManager.flags.GpuFaultCheckThreshold.set(-1); DrmMockCheckPageFault drm2{*executionEnvironment->rootDeviceEnvironments[0]}; - EXPECT_EQ(0u, drm2.gpuFaultCheckThreshold); + EXPECT_EQ(10u, drm2.gpuFaultCheckThreshold); debugManager.flags.DisableScratchPages.set(true); debugManager.flags.GpuFaultCheckThreshold.set(threshold); DrmMockCheckPageFault drm3{*executionEnvironment->rootDeviceEnvironments[0]}; EXPECT_EQ(threshold, drm3.gpuFaultCheckThreshold); + + debugManager.flags.DisableScratchPages.set(true); + debugManager.flags.GpuFaultCheckThreshold.set(0u); + DrmMockCheckPageFault drm4{*executionEnvironment->rootDeviceEnvironments[0]}; + EXPECT_EQ(0u, drm4.gpuFaultCheckThreshold); } struct MockDrmMemoryManagerCheckPageFault : public MockDrmMemoryManager { @@ -1511,6 +1516,41 @@ TEST(DrmTest, givenDisableScratchPagesSetWhenSettingGpuFaultCheckThresholdThenFa } } +TEST(DrmTest, givenDisableScratchPagesSetWhenSettingGpuFaultCheckThresholdToZeroThenFaultCheckingDoesNotHappen) { + constexpr unsigned int iteration = 20u; + ASSERT_NE(0u, iteration); + DebugManagerStateRestore restore; + debugManager.flags.DisableScratchPages.set(true); + debugManager.flags.GpuFaultCheckThreshold.set(0u); + + auto executionEnvironment = std::make_unique(); + auto rootDeviceEnvironment = executionEnvironment->rootDeviceEnvironments[0].get(); + rootDeviceEnvironment->setHwInfoAndInitHelpers(defaultHwInfo.get()); + rootDeviceEnvironment->osInterface = std::make_unique(); + rootDeviceEnvironment->osInterface->setDriverModel(std::unique_ptr(new DrmMock(*rootDeviceEnvironment))); + + auto memoryManager = new MockDrmMemoryManagerCheckPageFault(GemCloseWorkerMode::gemCloseWorkerInactive, false, false, *executionEnvironment); + executionEnvironment->memoryManager.reset(memoryManager); + auto &drm = *executionEnvironment->rootDeviceEnvironments[0]->osInterface->getDriverModel()->as(); + + uint32_t contextId{0}; + EngineDescriptor engineDescriptor{EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_BCS, EngineUsage::regular})}; + + MockOsContextLinux mockOsContextLinux{drm, 0, contextId, engineDescriptor}; + mockOsContextLinux.drmContextIds.push_back(0); + + ResetStats resetStats{}; + resetStats.contextId = 0; + drm.resetStatsToReturn.push_back(resetStats); + + bool isGpuHangDetected{}; + for (auto i = 0u; i < iteration; i++) { + EXPECT_NO_THROW(isGpuHangDetected = drm.isGpuHangDetected(mockOsContextLinux)); + EXPECT_FALSE(isGpuHangDetected); + } + EXPECT_EQ(0u, memoryManager->checkUnexpectedGpuPageFaultCalled); +} + TEST(DrmTest, givenSetupIoctlHelperWhenCalledTwiceThenIoctlHelperIsSetOnlyOnce) { auto executionEnvironment = std::make_unique(); DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]};