From 6de2f1a9c931db09f7aea6f6e473fc178f32cce6 Mon Sep 17 00:00:00 2001 From: Brandon Yates Date: Tue, 15 Oct 2024 14:14:15 +0000 Subject: [PATCH] fix: Remove stopped Threads query Related-to: NEO-12929 Signed-off-by: Brandon Yates --- .../gfx_core_helpers/l0_gfx_core_helper.h | 2 + .../l0_gfx_core_helper_base.inl | 5 +++ .../test_l0_gfx_core_helper_xe2_hpg_core.cpp | 5 +++ .../source/debug/linux/debug_session.cpp | 4 +- .../sources/debug/debug_session_common.h | 6 +++ .../linux/prelim/test_debug_api_linux.cpp | 40 ++++++++++++++----- .../linux/xe/test_debug_api_linux_xe.cpp | 9 ++++- 7 files changed, 59 insertions(+), 12 deletions(-) diff --git a/level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper.h b/level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper.h index 97eb2d66b6..5c30f8052c 100644 --- a/level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper.h +++ b/level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper.h @@ -88,6 +88,7 @@ class L0GfxCoreHelper : public NEO::ApiGfxCoreHelper { virtual void getAttentionBitmaskForSingleThreads(const std::vector &threads, const NEO::HardwareInfo &hwInfo, std::unique_ptr &bitmask, size_t &bitmaskSize) const = 0; virtual std::vector getThreadsFromAttentionBitmask(const NEO::HardwareInfo &hwInfo, uint32_t tile, const uint8_t *bitmask, const size_t bitmaskSize) const = 0; virtual bool threadResumeRequiresUnlock() const = 0; + virtual bool isThreadControlStoppedSupported() const = 0; virtual bool alwaysAllocateEventInLocalMem() const = 0; virtual bool platformSupportsCmdListHeapSharing() const = 0; virtual bool platformSupportsStateComputeModeTracking() const = 0; @@ -140,6 +141,7 @@ class L0GfxCoreHelperHw : public L0GfxCoreHelper { void getAttentionBitmaskForSingleThreads(const std::vector &threads, const NEO::HardwareInfo &hwInfo, std::unique_ptr &bitmask, size_t &bitmaskSize) const override; std::vector getThreadsFromAttentionBitmask(const NEO::HardwareInfo &hwInfo, uint32_t tile, const uint8_t *bitmask, const size_t bitmaskSize) const override; bool threadResumeRequiresUnlock() const override; + bool isThreadControlStoppedSupported() const override; bool alwaysAllocateEventInLocalMem() const override; bool platformSupportsCmdListHeapSharing() const override; bool platformSupportsStateComputeModeTracking() const override; diff --git a/level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper_base.inl b/level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper_base.inl index 4b1d0d70fb..c5d3b759ab 100644 --- a/level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper_base.inl +++ b/level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper_base.inl @@ -79,6 +79,11 @@ std::unique_ptr L0GfxCoreHelperHw::getInOrderTime return std::make_unique>(rootDeviceIndices, memoryManager, initialTagCount, tagAlignment, size, false, false, deviceBitfield); } +template +bool L0GfxCoreHelperHw::isThreadControlStoppedSupported() const { + return true; +} + template bool L0GfxCoreHelperHw::threadResumeRequiresUnlock() const { return false; diff --git a/level_zero/core/test/unit_tests/xe2_hpg_core/test_l0_gfx_core_helper_xe2_hpg_core.cpp b/level_zero/core/test/unit_tests/xe2_hpg_core/test_l0_gfx_core_helper_xe2_hpg_core.cpp index b72a514982..38fa11c729 100644 --- a/level_zero/core/test/unit_tests/xe2_hpg_core/test_l0_gfx_core_helper_xe2_hpg_core.cpp +++ b/level_zero/core/test/unit_tests/xe2_hpg_core/test_l0_gfx_core_helper_xe2_hpg_core.cpp @@ -127,6 +127,11 @@ XE2_HPG_CORETEST_F(L0GfxCoreHelperTestXe2Hpg, GivenXe2HpgWhenCallingThreadResume EXPECT_FALSE(l0GfxCoreHelper.threadResumeRequiresUnlock()); } +XE2_HPG_CORETEST_F(L0GfxCoreHelperTestXe2Hpg, GivenXe3pWhenCallingisThreadControlStoppedSupportedThenReturnTrue) { + const auto &l0GfxCoreHelper = getHelper(); + EXPECT_TRUE(l0GfxCoreHelper.isThreadControlStoppedSupported()); +} + XE2_HPG_CORETEST_F(L0GfxCoreHelperTestXe2Hpg, GivenXe2HpgWhenCheckingL0HelperForDeletingIpSamplingEntryWithNullValuesThenMapRemainstheSameSize) { auto &l0GfxCoreHelper = getHelper(); std::map stallSumIpDataMap; diff --git a/level_zero/tools/source/debug/linux/debug_session.cpp b/level_zero/tools/source/debug/linux/debug_session.cpp index 046bc22318..2e07c50209 100644 --- a/level_zero/tools/source/debug/linux/debug_session.cpp +++ b/level_zero/tools/source/debug/linux/debug_session.cpp @@ -7,6 +7,7 @@ #include "level_zero/tools/source/debug/debug_session.h" +#include "shared/source/execution_environment/root_device_environment.h" #include "shared/source/gmm_helper/gmm_helper.h" #include "shared/source/helpers/aligned_memory.h" #include "shared/source/helpers/basic_math.h" @@ -228,8 +229,9 @@ void DebugSessionLinux::checkStoppedThreadsAndGenerateEvents(const std::vector threadsWithAttention; std::vector stoppedThreadsToReport; NEO::sleep(std::chrono::microseconds(1)); + auto &l0GfxCoreHelper = connectedDevice->getNEODevice()->getRootDeviceEnvironment().getHelper(); - if (threads.size() > 1) { + if (threads.size() > 1 && l0GfxCoreHelper.isThreadControlStoppedSupported()) { auto hwInfo = connectedDevice->getHwInfo(); auto &l0GfxCoreHelper = connectedDevice->getL0GfxCoreHelper(); diff --git a/level_zero/tools/test/unit_tests/sources/debug/debug_session_common.h b/level_zero/tools/test/unit_tests/sources/debug/debug_session_common.h index 54a0c02617..5f8f11fe33 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/debug_session_common.h +++ b/level_zero/tools/test/unit_tests/sources/debug/debug_session_common.h @@ -12,6 +12,7 @@ #include "shared/test/common/mocks/mock_device.h" #include "shared/test/common/mocks/mock_sip.h" +#include "level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper.h" #include "level_zero/core/test/unit_tests/fixtures/device_fixture.h" #include "level_zero/core/test/unit_tests/mocks/mock_built_ins.h" #include "level_zero/core/test/unit_tests/mocks/mock_device.h" @@ -52,5 +53,10 @@ size_t regOffsetInThreadSlot(const SIP::regset_desc *regdesc, uint32_t start); void initStateSaveArea(std::vector &stateSaveArea, SIP::version version, L0::Device *device); +template +struct MockL0GfxCoreHelperSupportsThreadControlStopped : L0::L0GfxCoreHelperHw { + bool isThreadControlStoppedSupported() const override { return true; } +}; + } // namespace ult } // namespace L0 diff --git a/level_zero/tools/test/unit_tests/sources/debug/linux/prelim/test_debug_api_linux.cpp b/level_zero/tools/test/unit_tests/sources/debug/linux/prelim/test_debug_api_linux.cpp index 0b29860ea4..586d72edcb 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/linux/prelim/test_debug_api_linux.cpp +++ b/level_zero/tools/test/unit_tests/sources/debug/linux/prelim/test_debug_api_linux.cpp @@ -25,6 +25,7 @@ #include "shared/test/common/mocks/mock_sip.h" #include "shared/test/common/mocks/ult_device_factory.h" #include "shared/test/common/os_interface/linux/sys_calls_linux_ult.h" +#include "shared/test/common/test_macros/hw_test.h" #include "shared/test/common/test_macros/test.h" #include "level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper.h" @@ -5499,16 +5500,23 @@ TEST_F(DebugApiLinuxTest, GivenStoppedAndRunningThreadWhenCheckStoppedThreadsAnd handler->outputBitmask = std::move(bitmask); sessionMock->checkStoppedThreadsAndGenerateEvents(threads, memoryHandle, 0); - - EXPECT_EQ(3, handler->ioctlCalled); - EXPECT_EQ(1u, handler->euControlArgs.size()); - EXPECT_EQ(2u, sessionMock->numThreadsPassedToThreadControl); - EXPECT_EQ(uint32_t(PRELIM_I915_DEBUG_EU_THREADS_CMD_STOPPED), handler->euControlArgs[0].euControl.cmd); - EXPECT_NE(0u, handler->euControlArgs[0].euControl.bitmask_size); - EXPECT_NE(0u, handler->euControlArgs[0].euControl.bitmask_ptr); + if (l0GfxCoreHelper.isThreadControlStoppedSupported()) { + EXPECT_EQ(3, handler->ioctlCalled); + EXPECT_EQ(1u, handler->euControlArgs.size()); + EXPECT_EQ(2u, sessionMock->numThreadsPassedToThreadControl); + EXPECT_EQ(uint32_t(PRELIM_I915_DEBUG_EU_THREADS_CMD_STOPPED), handler->euControlArgs[0].euControl.cmd); + EXPECT_NE(0u, handler->euControlArgs[0].euControl.bitmask_size); + EXPECT_NE(0u, handler->euControlArgs[0].euControl.bitmask_ptr); + } else { + EXPECT_EQ(2, handler->ioctlCalled); + EXPECT_EQ(0u, handler->euControlArgs.size()); + EXPECT_EQ(0u, sessionMock->numThreadsPassedToThreadControl); + } l0GfxCoreHelper.getAttentionBitmaskForSingleThreads(threads, hwInfo, bitmask, bitmaskSize); - EXPECT_EQ(0, memcmp(handler->euControlArgs[0].euControlBitmask.get(), bitmask.get(), bitmaskSize)); + if (l0GfxCoreHelper.isThreadControlStoppedSupported()) { + EXPECT_EQ(0, memcmp(handler->euControlArgs[0].euControlBitmask.get(), bitmask.get(), bitmaskSize)); + } EXPECT_TRUE(sessionMock->allThreads[thread.packed]->isStopped()); EXPECT_TRUE(sessionMock->allThreads[thread1.packed]->isStopped()); @@ -5577,7 +5585,11 @@ TEST_F(DebugApiLinuxTest, GivenStoppedThreadResumeCausingPageFaultAndFEBitSetWhe EXPECT_EQ(0u, sessionMock->apiEvents.size()); } -TEST_F(DebugApiLinuxTest, GivenNoAttentionBitsWhenMultipleThreadsPassedToCheckStoppedThreadsAndGenerateEventsThenThreadsStateNotCheckedAndEventsNotGenerated) { +HWTEST2_F(DebugApiLinuxTest, GivenNoAttentionBitsWhenMultipleThreadsPassedToCheckStoppedThreadsAndGenerateEventsThenThreadsStateNotCheckedAndEventsNotGenerated, MatchAny) { + MockL0GfxCoreHelperSupportsThreadControlStopped mockL0GfxCoreHelper; + std::unique_ptr l0GfxCoreHelperBackup(static_cast(&mockL0GfxCoreHelper)); + device->getNEODevice()->getExecutionEnvironment()->rootDeviceEnvironments[0]->apiGfxCoreHelper.swap(l0GfxCoreHelperBackup); + zet_debug_config_t config = {}; config.pid = 0x1234; @@ -5624,6 +5636,8 @@ TEST_F(DebugApiLinuxTest, GivenNoAttentionBitsWhenMultipleThreadsPassedToCheckSt EXPECT_FALSE(sessionMock->allThreads[thread2.packed]->isStopped()); EXPECT_EQ(0u, sessionMock->apiEvents.size()); + device->getNEODevice()->getExecutionEnvironment()->rootDeviceEnvironments[0]->apiGfxCoreHelper.swap(l0GfxCoreHelperBackup); + l0GfxCoreHelperBackup.release(); } TEST_F(DebugApiLinuxTest, GivenNoAttentionBitsWhenSingleThreadPassedToCheckStoppedThreadsAndGenerateEventsThenThreadStoppedEventsGeneratedOnlyForNewlyStoppedThreadFromPassedVector) { @@ -5682,7 +5696,11 @@ TEST_F(DebugApiLinuxTest, GivenNoAttentionBitsWhenSingleThreadPassedToCheckStopp EXPECT_EQ(0u, sessionMock->apiEvents.size()); } -TEST_F(DebugApiLinuxTest, GivenErrorFromSynchronousAttScanWhenMultipleThreadsPassedToCheckStoppedThreadsAndGenerateEventsThenThreadsStateNotChecked) { +HWTEST2_F(DebugApiLinuxTest, GivenErrorFromSynchronousAttScanWhenMultipleThreadsPassedToCheckStoppedThreadsAndGenerateEventsThenThreadsStateNotChecked, MatchAny) { + MockL0GfxCoreHelperSupportsThreadControlStopped mockL0GfxCoreHelper; + std::unique_ptr l0GfxCoreHelperBackup(static_cast(&mockL0GfxCoreHelper)); + device->getNEODevice()->getExecutionEnvironment()->rootDeviceEnvironments[0]->apiGfxCoreHelper.swap(l0GfxCoreHelperBackup); + zet_debug_config_t config = {}; config.pid = 0x1234; @@ -5727,6 +5745,8 @@ TEST_F(DebugApiLinuxTest, GivenErrorFromSynchronousAttScanWhenMultipleThreadsPas EXPECT_FALSE(sessionMock->allThreads[thread1.packed]->isStopped()); EXPECT_EQ(0u, sessionMock->apiEvents.size()); + device->getNEODevice()->getExecutionEnvironment()->rootDeviceEnvironments[0]->apiGfxCoreHelper.swap(l0GfxCoreHelperBackup); + l0GfxCoreHelperBackup.release(); } TEST_F(DebugApiLinuxTest, GivenResumeWARequiredWhenCallingResumeThenWaIsAppliedToBitmask) { diff --git a/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp b/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp index 3debe42521..8d6c382906 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp +++ b/level_zero/tools/test/unit_tests/sources/debug/linux/xe/test_debug_api_linux_xe.cpp @@ -20,6 +20,7 @@ #include "shared/test/common/mocks/mock_sip.h" #include "shared/test/common/mocks/ult_device_factory.h" #include "shared/test/common/os_interface/linux/sys_calls_linux_ult.h" +#include "shared/test/common/test_macros/hw_test.h" #include "shared/test/common/test_macros/test.h" #include "level_zero/core/source/gfx_core_helpers/l0_gfx_core_helper.h" @@ -1892,7 +1893,11 @@ TEST_F(DebugApiLinuxTestXe, WhenCallingThreadControlForResumeThenProperIoctlsIsC EXPECT_EQ(nullptr, bitmaskOut.get()); } -TEST_F(DebugApiLinuxTestXe, GivenNoAttentionBitsWhenMultipleThreadsPassedToCheckStoppedThreadsAndGenerateEventsThenThreadsStateNotCheckedAndEventsNotGenerated) { +HWTEST2_F(DebugApiLinuxTestXe, GivenNoAttentionBitsWhenMultipleThreadsPassedToCheckStoppedThreadsAndGenerateEventsThenThreadsStateNotCheckedAndEventsNotGenerated, MatchAny) { + MockL0GfxCoreHelperSupportsThreadControlStopped mockL0GfxCoreHelper; + std::unique_ptr l0GfxCoreHelperBackup(static_cast(&mockL0GfxCoreHelper)); + device->getNEODevice()->getExecutionEnvironment()->rootDeviceEnvironments[0]->apiGfxCoreHelper.swap(l0GfxCoreHelperBackup); + zet_debug_config_t config = {}; config.pid = 0x1234; @@ -1943,6 +1948,8 @@ TEST_F(DebugApiLinuxTestXe, GivenNoAttentionBitsWhenMultipleThreadsPassedToCheck EXPECT_FALSE(sessionMock->allThreads[thread2.packed]->isStopped()); EXPECT_EQ(0u, sessionMock->apiEvents.size()); + device->getNEODevice()->getExecutionEnvironment()->rootDeviceEnvironments[0]->apiGfxCoreHelper.swap(l0GfxCoreHelperBackup); + l0GfxCoreHelperBackup.release(); } TEST_F(DebugApiLinuxTestXe, GivenEventSeqnoLowerEqualThanSentInterruptWhenHandlingAttentionEventThenEventIsNotProcessed) {