From 66581a0a1d105d69e96a2a46ed4d74745864dd16 Mon Sep 17 00:00:00 2001 From: "Yates, Brandon" Date: Mon, 12 Dec 2022 22:18:52 +0000 Subject: [PATCH] L0 Debug - Avoid SSAH lookup when no threads are stopped During async thread event processing, it was possible to read SSAH before any threads stopped and before it was resident resulting in an assert. This is both a fix for assertion and minor optimization. Signed-off-by: Yates, Brandon --- .../tools/source/debug/debug_session_imp.cpp | 3 +++ .../sources/debug/debug_session_tests.cpp | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/level_zero/tools/source/debug/debug_session_imp.cpp b/level_zero/tools/source/debug/debug_session_imp.cpp index a0546e0588..68822856db 100644 --- a/level_zero/tools/source/debug/debug_session_imp.cpp +++ b/level_zero/tools/source/debug/debug_session_imp.cpp @@ -745,6 +745,9 @@ bool DebugSessionImp::isForceExceptionOrForceExternalHaltOnlyExceptionReason(uin void DebugSessionImp::fillResumeAndStoppedThreadsFromNewlyStopped(std::vector &resumeThreads, std::vector &stoppedThreadsToReport) { + if (newlyStoppedThreads.empty()) { + return; + } const auto regSize = std::max(getRegisterSize(ZET_DEBUG_REGSET_TYPE_CR_INTEL_GPU), 64u); auto reg = std::make_unique(regSize / sizeof(uint32_t)); diff --git a/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp b/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp index b018dec79a..433976ed2c 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp +++ b/level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp @@ -501,6 +501,23 @@ TEST(DebugSessionTest, givenStoppedThreadsWhenFillingResumeAndStoppedThreadsFrom } } +TEST(DebugSessionTest, givenNoThreadsStoppedWhenCallingfillResumeAndStoppedThreadsFromNewlyStoppedThenReadStateSaveAreaNotCalled) { + zet_debug_config_t config = {}; + config.pid = 0x1234; + auto hwInfo = *NEO::defaultHwInfo.get(); + + NEO::MockDevice *neoDevice(NEO::MockDevice::createWithNewExecutionEnvironment(&hwInfo, 0)); + Mock deviceImp(neoDevice, neoDevice->getExecutionEnvironment()); + + auto sessionMock = std::make_unique(config, &deviceImp); + std::vector resumeThreads; + std::vector stoppedThreads; + + sessionMock->fillResumeAndStoppedThreadsFromNewlyStopped(resumeThreads, stoppedThreads); + + EXPECT_EQ(0u, sessionMock->readStateSaveAreaHeaderCalled); +} + TEST(DebugSessionTest, givenThreadsToResumeWhenResumeAccidentallyStoppedThreadsCalledThenThreadsResumed) { class InternalMockDebugSession : public MockDebugSession { public: