fix: Dont process vmBind if clientHandle is Invalid

Related-To: NEO-11104
Signed-off-by: Jitendra Sharma <jitendra.sharma@intel.com>
This commit is contained in:
Jitendra Sharma
2025-01-13 15:20:55 +00:00
committed by Compute-Runtime-Automation
parent e95c7aac92
commit cf8551ca06
4 changed files with 57 additions and 1 deletions

View File

@@ -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<EuThread::ThreadId> &threads, uint32_t tile, ThreadControlCmd threadCmd, std::unique_ptr<uint8_t[]> &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;

View File

@@ -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<MockDebugSessionLinuxXe>(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<NEO::EuDebugEventExecQueuePlacements *>(memoryExecQueuePlacements);
memset(execQueuePlacements, 0, size);
execQueuePlacements->base.type = static_cast<uint16_t>(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<drm_xe_engine_class_instance *>(&(execQueuePlacements->instances[0]));
engineClassInstance[0].engine_class = 0;
engineClassInstance[0].engine_instance = 1;
engineClassInstance[0].gt_id = 1;
auto memory = std::make_unique<uint64_t[]>(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;