From cf8551ca06323d980e993431bbfbc75300b3422c Mon Sep 17 00:00:00 2001 From: Jitendra Sharma Date: Mon, 13 Jan 2025 15:20:55 +0000 Subject: [PATCH] fix: Dont process vmBind if clientHandle is Invalid Related-To: NEO-11104 Signed-off-by: Jitendra Sharma --- .../source/debug/linux/xe/debug_session.cpp | 3 ++ .../source/debug/linux/xe/debug_session.h | 2 +- .../xe/debug_session_fixtures_linux_xe.h | 6 +++ .../linux/xe/test_debug_api_linux_xe.cpp | 47 +++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/level_zero/tools/source/debug/linux/xe/debug_session.cpp b/level_zero/tools/source/debug/linux/xe/debug_session.cpp index 66ebc8ceab..815f32df08 100644 --- a/level_zero/tools/source/debug/linux/xe/debug_session.cpp +++ b/level_zero/tools/source/debug/linux/xe/debug_session.cpp @@ -398,6 +398,9 @@ void DebugSessionLinuxXe::handleEvent(NEO::EuDebugEvent *event) { } void DebugSessionLinuxXe::processPendingVmBindEvents() { + if (clientHandle == invalidClientHandle) { + return; + } std::vectorvmBindMap)::key_type> keysToDelete; auto &vmBindMap = clientHandleToConnection[clientHandle]->vmBindMap; for (auto &pair : vmBindMap) { diff --git a/level_zero/tools/source/debug/linux/xe/debug_session.h b/level_zero/tools/source/debug/linux/xe/debug_session.h index 1dbf862b92..2f1848349e 100644 --- a/level_zero/tools/source/debug/linux/xe/debug_session.h +++ b/level_zero/tools/source/debug/linux/xe/debug_session.h @@ -132,7 +132,7 @@ struct DebugSessionLinuxXe : DebugSessionLinux { }; std::unordered_map> clientHandleToConnection; bool canHandleVmBind(VmBindData &vmBindData) const; - bool handleVmBind(VmBindData &vmBindData); + MOCKABLE_VIRTUAL bool handleVmBind(VmBindData &vmBindData); void handleVmBindWithoutUfence(VmBindData &vmBindData, VmBindOpData &vmBindOpData); void extractMetaData(uint64_t client, const MetaData &metaData); diff --git a/level_zero/tools/test/unit_tests/sources/debug/linux/xe/debug_session_fixtures_linux_xe.h b/level_zero/tools/test/unit_tests/sources/debug/linux/xe/debug_session_fixtures_linux_xe.h index 5ab053af11..5dec9f7310 100644 --- a/level_zero/tools/test/unit_tests/sources/debug/linux/xe/debug_session_fixtures_linux_xe.h +++ b/level_zero/tools/test/unit_tests/sources/debug/linux/xe/debug_session_fixtures_linux_xe.h @@ -234,6 +234,11 @@ struct MockDebugSessionLinuxXe : public L0::DebugSessionLinuxXe { return DebugSessionLinuxXe::processPendingVmBindEvents(); } + bool handleVmBind(VmBindData &vmBindData) override { + handleVmBindCallCount++; + return DebugSessionLinuxXe::handleVmBind(vmBindData); + } + int threadControl(const std::vector &threads, uint32_t tile, ThreadControlCmd threadCmd, std::unique_ptr &bitmask, size_t &bitmaskSize) override { numThreadsPassedToThreadControl = threads.size(); return L0::DebugSessionLinuxXe::threadControl(threads, tile, threadCmd, bitmask, bitmaskSize); @@ -307,6 +312,7 @@ struct MockDebugSessionLinuxXe : public L0::DebugSessionLinuxXe { uint32_t readSystemRoutineIdentCallCount = 0; uint32_t processPendingVmBindEventsCallCount = 0; + uint32_t handleVmBindCallCount = 0; uint32_t addThreadToNewlyStoppedFromRaisedAttentionCallCount = 0; uint32_t readSystemRoutineIdentFromMemoryCallCount = 0; size_t numThreadsPassedToThreadControl = 0; 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 55430963c3..9f8bfeceec 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 @@ -1440,6 +1440,53 @@ TEST_F(DebugApiLinuxTestXe, GivenNoEventRelatedToVmBindHandlingWhenHandleInterna EXPECT_TRUE(session->handleInternalEvent()); } +TEST_F(DebugApiLinuxTestXe, GivenEventTypeExecQueuePlacementsAndClientHandleIsInvalidWhenHandleInternalEventCalledThenHandleVmBindNotCalled) { + zet_debug_config_t config = {}; + config.pid = 0x1234; + + auto session = std::make_unique(config, device, 10); + ASSERT_NE(nullptr, session); + + auto &vmBindData = session->clientHandleToConnection[MockDebugSessionLinuxXe::mockClientHandle]->vmBindMap[1]; + vmBindData.pendingNumBinds = 1; + + constexpr uint64_t vmHandle = 10; + // Allocate memory for the structure including the flexible array member + constexpr auto size = sizeof(NEO::EuDebugEventExecQueuePlacements) + sizeof(drm_xe_engine_class_instance) * 1; + + uint8_t memoryExecQueuePlacements[size]; + auto execQueuePlacements = reinterpret_cast(memoryExecQueuePlacements); + memset(execQueuePlacements, 0, size); + execQueuePlacements->base.type = static_cast(NEO::EuDebugParam::eventTypeExecQueuePlacements); + execQueuePlacements->base.len = sizeof(NEO::EuDebugEventExecQueuePlacements); + execQueuePlacements->clientHandle = MockDebugSessionLinuxXe::mockClientHandle; + execQueuePlacements->vmHandle = vmHandle; + execQueuePlacements->execQueueHandle = 200; + execQueuePlacements->lrcHandle = 10; + execQueuePlacements->numPlacements = 1; + + auto engineClassInstance = reinterpret_cast(&(execQueuePlacements->instances[0])); + engineClassInstance[0].engine_class = 0; + engineClassInstance[0].engine_instance = 1; + engineClassInstance[0].gt_id = 1; + + auto memory = std::make_unique(size / sizeof(uint64_t)); + memcpy(memory.get(), memoryExecQueuePlacements, size); + + // Clear the event queue before using it + while (!session->internalEventQueue.empty()) { + session->internalEventQueue.pop(); + } + session->internalEventQueue.push(std::move(memory)); + + session->clientHandle = DebugSessionLinuxXe::invalidClientHandle; + EXPECT_EQ(session->handleVmBindCallCount, 0u); + + EXPECT_TRUE(session->handleInternalEvent()); + + EXPECT_EQ(session->handleVmBindCallCount, 0u); +} + TEST_F(DebugApiLinuxTestXe, GivenEventTypeExecQueuePlacementsWhenHandleInternalEventCalledThenProcessPendingVmBindEventsCalled) { zet_debug_config_t config = {}; config.pid = 0x1234;