fix: add debug key to provide alternative directory for wddm residency logs

Related-To: NEO-8211

Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
Zbigniew Zdanowicz
2023-08-31 03:45:38 +00:00
committed by Compute-Runtime-Automation
parent b77b0e487d
commit cb641226b5
6 changed files with 96 additions and 51 deletions

View File

@@ -323,7 +323,7 @@ void WddmMock::createPagingFenceLogger() {
Wddm::createPagingFenceLogger();
} else {
if (DebugManager.flags.WddmResidencyLogger.get()) {
residencyLogger = std::make_unique<MockWddmResidencyLogger>(device, pagingFenceAddress);
residencyLogger = std::make_unique<MockWddmResidencyLogger>(device, pagingFenceAddress, DebugManager.flags.WddmResidencyLoggerOutputDirectory.get());
}
}
}

View File

@@ -475,6 +475,7 @@ OverrideCmdListCmdBufferSizeInKb = -1
ForceUncachedGmmUsageType = 0
OverrideDeviceName = unk
OverridePlatformName = unk
WddmResidencyLoggerOutputDirectory = unk
EnablePrivateBO = 0
ExperimentalEnableDeviceAllocationCache = -1
OverrideL1CachePolicyInSurfaceStateAndStateless = -1

View File

@@ -1388,13 +1388,36 @@ TEST(HwDeviceId, whenHwDeviceIdIsDestroyedThenAdapterIsClosed) {
EXPECT_EQ(adapter, GdiWithMockedCloseFunc::closeAdapterCalledArgPassed);
}
TEST_F(WddmTest, WhenResidencyLoggingEnabledThenExpectLoggerCreated) {
NEO::IoFunctions::mockFopenCalled = 0;
NEO::IoFunctions::mockVfptrinfCalled = 0;
NEO::IoFunctions::mockFcloseCalled = 0;
DebugManagerStateRestore dbgRestore;
DebugManager.flags.WddmResidencyLogger.set(true);
namespace MockWddmResidencyLoggerFunctions {
std::string recordedFileName(256, 0);
FILE *testFopen(const char *filename, const char *mode) {
MockWddmResidencyLoggerFunctions::recordedFileName.assign(filename);
return NEO::IoFunctions::mockFopen(filename, mode);
}
} // namespace MockWddmResidencyLoggerFunctions
struct WddmResidencyLoggerTest : public WddmTest {
void SetUp() override {
MockWddmResidencyLoggerFunctions::recordedFileName.clear();
WddmTest::SetUp();
NEO::IoFunctions::mockFopenCalled = 0;
NEO::IoFunctions::mockVfptrinfCalled = 0;
NEO::IoFunctions::mockFcloseCalled = 0;
DebugManager.flags.WddmResidencyLogger.set(true);
mockFopenBackup = std::make_unique<VariableBackup<NEO::IoFunctions::fopenFuncPtr>>(&NEO::IoFunctions::fopenPtr);
NEO::IoFunctions::fopenPtr = &MockWddmResidencyLoggerFunctions::testFopen;
}
DebugManagerStateRestore dbgRestore;
std::unique_ptr<VariableBackup<NEO::IoFunctions::fopenFuncPtr>> mockFopenBackup;
};
TEST_F(WddmResidencyLoggerTest, WhenResidencyLoggingEnabledThenExpectLoggerCreated) {
wddm->createPagingFenceLogger();
EXPECT_NE(nullptr, wddm->residencyLogger.get());
wddm->residencyLogger.reset();
@@ -1405,16 +1428,10 @@ TEST_F(WddmTest, WhenResidencyLoggingEnabledThenExpectLoggerCreated) {
}
}
TEST_F(WddmTest, GivenResidencyLoggingEnabledWhenMakeResidentSuccessThenExpectSizeRapport) {
TEST_F(WddmResidencyLoggerTest, GivenResidencyLoggingEnabledWhenMakeResidentSuccessThenExpectSizeRapport) {
if (!NEO::wddmResidencyLoggingAvailable) {
GTEST_SKIP();
}
NEO::IoFunctions::mockFopenCalled = 0;
NEO::IoFunctions::mockVfptrinfCalled = 0;
NEO::IoFunctions::mockFcloseCalled = 0;
DebugManagerStateRestore dbgRestore;
DebugManager.flags.WddmResidencyLogger.set(true);
wddm->callBaseCreatePagingLogger = false;
wddm->callBaseMakeResident = true;
@@ -1432,16 +1449,10 @@ TEST_F(WddmTest, GivenResidencyLoggingEnabledWhenMakeResidentSuccessThenExpectSi
EXPECT_EQ(MockGdi::pagingFenceReturnValue, logger->makeResidentPagingFence);
}
TEST_F(WddmTest, GivenResidencyLoggingEnabledWhenMakeResidentFailThenExpectTrimReport) {
TEST_F(WddmResidencyLoggerTest, GivenResidencyLoggingEnabledWhenMakeResidentFailThenExpectTrimReport) {
if (!NEO::wddmResidencyLoggingAvailable) {
GTEST_SKIP();
}
NEO::IoFunctions::mockFopenCalled = 0;
NEO::IoFunctions::mockVfptrinfCalled = 0;
NEO::IoFunctions::mockFcloseCalled = 0;
DebugManagerStateRestore dbgRestore;
DebugManager.flags.WddmResidencyLogger.set(true);
wddm->callBaseCreatePagingLogger = false;
wddm->callBaseMakeResident = true;
@@ -1470,16 +1481,10 @@ TEST_F(WddmTest, GivenInvalidHandleAndCantTrimFurtherSetToTrueWhenCallingMakeRes
EXPECT_FALSE(retVal);
}
TEST_F(WddmTest, GivenResidencyLoggingEnabledWhenEnterWaitCalledThenExpectInternalFlagOn) {
TEST_F(WddmResidencyLoggerTest, GivenResidencyLoggingEnabledWhenEnterWaitCalledThenExpectInternalFlagOn) {
if (!NEO::wddmResidencyLoggingAvailable) {
GTEST_SKIP();
}
NEO::IoFunctions::mockFopenCalled = 0;
NEO::IoFunctions::mockVfptrinfCalled = 0;
NEO::IoFunctions::mockFcloseCalled = 0;
DebugManagerStateRestore dbgRestore;
DebugManager.flags.WddmResidencyLogger.set(true);
wddm->callBaseCreatePagingLogger = false;
wddm->createPagingFenceLogger();
@@ -1489,16 +1494,10 @@ TEST_F(WddmTest, GivenResidencyLoggingEnabledWhenEnterWaitCalledThenExpectIntern
EXPECT_TRUE(logger->enterWait);
}
TEST_F(WddmTest, GivenResidencyLoggingEnabledWhenMakeResidentAndWaitPagingThenExpectFlagsOff) {
TEST_F(WddmResidencyLoggerTest, GivenResidencyLoggingEnabledWhenMakeResidentAndWaitPagingThenExpectFlagsOff) {
if (!NEO::wddmResidencyLoggingAvailable) {
GTEST_SKIP();
}
NEO::IoFunctions::mockFopenCalled = 0;
NEO::IoFunctions::mockVfptrinfCalled = 0;
NEO::IoFunctions::mockFcloseCalled = 0;
DebugManagerStateRestore dbgRestore;
DebugManager.flags.WddmResidencyLogger.set(true);
wddm->callBaseCreatePagingLogger = false;
wddm->callBaseMakeResident = true;
@@ -1523,16 +1522,10 @@ TEST_F(WddmTest, GivenResidencyLoggingEnabledWhenMakeResidentAndWaitPagingThenEx
EXPECT_EQ(MockGdi::pagingFenceReturnValue, logger->startWaitPagingFenceSave);
}
TEST_F(WddmTest, GivenResidencyLoggingEnabledWhenMakeResidentAndWaitPagingOnGpuThenExpectFlagsOff) {
TEST_F(WddmResidencyLoggerTest, GivenResidencyLoggingEnabledWhenMakeResidentAndWaitPagingOnGpuThenExpectFlagsOff) {
if (!NEO::wddmResidencyLoggingAvailable) {
GTEST_SKIP();
}
NEO::IoFunctions::mockFopenCalled = 0;
NEO::IoFunctions::mockVfptrinfCalled = 0;
NEO::IoFunctions::mockFcloseCalled = 0;
DebugManagerStateRestore dbgRestore;
DebugManager.flags.WddmResidencyLogger.set(true);
wddm->callBaseCreatePagingLogger = false;
wddm->callBaseMakeResident = true;
@@ -1557,16 +1550,10 @@ TEST_F(WddmTest, GivenResidencyLoggingEnabledWhenMakeResidentAndWaitPagingOnGpuT
EXPECT_EQ(MockGdi::pagingFenceReturnValue, logger->startWaitPagingFenceSave);
}
TEST_F(WddmTest, GivenResidencyLoggingEnabledWhenMakeResidentRequiresTrimToBudgetAndWaitPagingOnGpuThenExpectProperLoggingCount) {
TEST_F(WddmResidencyLoggerTest, GivenResidencyLoggingEnabledWhenMakeResidentRequiresTrimToBudgetAndWaitPagingOnGpuThenExpectProperLoggingCount) {
if (!NEO::wddmResidencyLoggingAvailable) {
GTEST_SKIP();
}
NEO::IoFunctions::mockFopenCalled = 0;
NEO::IoFunctions::mockVfptrinfCalled = 0;
NEO::IoFunctions::mockFcloseCalled = 0;
DebugManagerStateRestore dbgRestore;
DebugManager.flags.WddmResidencyLogger.set(true);
wddm->callBaseCreatePagingLogger = false;
wddm->callBaseMakeResident = true;
@@ -1590,6 +1577,51 @@ TEST_F(WddmTest, GivenResidencyLoggingEnabledWhenMakeResidentRequiresTrimToBudge
EXPECT_FALSE(logger->enterWait);
}
TEST_F(WddmResidencyLoggerTest, givenResidencyLoggingEnabledWhenDefaultDirectorySelectedThenDoNotUseDirectoryName) {
std::string defaultDirectory("unk");
std::string filenameLead("pagingfence_device-0x");
wddm->createPagingFenceLogger();
EXPECT_NE(nullptr, wddm->residencyLogger.get());
EXPECT_EQ(std::string::npos, MockWddmResidencyLoggerFunctions::recordedFileName.find(defaultDirectory));
EXPECT_EQ(0u, MockWddmResidencyLoggerFunctions::recordedFileName.find(filenameLead));
}
TEST_F(WddmResidencyLoggerTest, givenResidencyLoggingEnabledWhenNonDefaultDirectorySelectedWithoutTrailingBackslashThenUseDirectoryNameWithAddedSlash) {
std::string nonDefaultDirectory("c:\\temp\\logs");
std::string filenameLead("pagingfence_device-0x");
DebugManager.flags.WddmResidencyLoggerOutputDirectory.set(nonDefaultDirectory);
wddm->createPagingFenceLogger();
EXPECT_NE(nullptr, wddm->residencyLogger.get());
EXPECT_EQ(0u, MockWddmResidencyLoggerFunctions::recordedFileName.find(nonDefaultDirectory));
auto backslashPos = nonDefaultDirectory.length();
auto pos = MockWddmResidencyLoggerFunctions::recordedFileName.find('\\', backslashPos);
EXPECT_EQ(backslashPos, pos);
auto filenameLeadPos = backslashPos + 1;
EXPECT_EQ(filenameLeadPos, MockWddmResidencyLoggerFunctions::recordedFileName.find(filenameLead));
}
TEST_F(WddmResidencyLoggerTest, givenResidencyLoggingEnabledWhenNonDefaultDirectorySelectedWithTrailingBackslashThenUseDirectoryNameWithoutAddingSlash) {
std::string nonDefaultDirectory("c:\\temp\\logs\\");
std::string filenameLead("pagingfence_device-0x");
DebugManager.flags.WddmResidencyLoggerOutputDirectory.set(nonDefaultDirectory);
wddm->createPagingFenceLogger();
EXPECT_NE(nullptr, wddm->residencyLogger.get());
EXPECT_EQ(0u, MockWddmResidencyLoggerFunctions::recordedFileName.find(nonDefaultDirectory));
auto filenameLeadPos = nonDefaultDirectory.length();
EXPECT_EQ(filenameLeadPos, MockWddmResidencyLoggerFunctions::recordedFileName.find(filenameLead));
}
TEST(VerifyAdapterType, whenAdapterDoesntSupportRenderThenDontCreateHwDeviceId) {
auto gdi = std::make_unique<MockGdi>();
auto osEnv = std::make_unique<OsEnvironmentWin>();