fix: Dont directly use gtId as TileId

gtId is not same as tileId. instead use gtIdToTileId
to retrieve tileId based on gtId.

Related-To: NEO-11104
Signed-off-by: Jitendra Sharma <jitendra.sharma@intel.com>
This commit is contained in:
Jitendra Sharma
2025-01-17 13:10:57 +00:00
committed by Compute-Runtime-Automation
parent 1ce795c265
commit 8f5a0995e0
8 changed files with 100 additions and 16 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2022-2024 Intel Corporation
* Copyright (C) 2022-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@ -20,6 +20,11 @@ int DrmHelper::ioctl(Device *device, NEO::DrmIoctl request, void *arg) {
return drm->getIoctlHelper()->ioctl(request, arg);
}
int DrmHelper::getTileIdFromGtId(Device *device, int gtId) {
auto drm = device->getOsInterface().getDriverModel()->as<NEO::Drm>();
return drm->getIoctlHelper()->getTileIdFromGtId(gtId);
}
std::string DrmHelper::getSysFsPciPath(Device *device) {
auto drm = device->getOsInterface().getDriverModel()->as<NEO::Drm>();
return drm->getSysFsPciPath();

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2022-2024 Intel Corporation
* Copyright (C) 2022-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@ -26,6 +26,7 @@ struct DrmHelper {
static int getErrno(Device *device);
static uint32_t getEngineTileIndex(Device *device, const NEO::EngineClassInstance &engine);
static const NEO::EngineClassInstance *getEngineInstance(Device *device, uint32_t tile, aub_stream::EngineType engineType);
static int getTileIdFromGtId(Device *device, int gtId);
};
} // namespace L0

View File

@ -363,18 +363,19 @@ void DebugSessionLinuxXe::handleEvent(NEO::EuDebugEvent *event) {
UNRECOVERABLE_IF(execQueuePlacements->numPlacements == 0);
auto engine = reinterpret_cast<NEO::XeEngineClassInstance *>(&(execQueuePlacements->instances[0]));
auto tileIndex = engine->gtId;
auto tileIndex = DrmHelper::getTileIdFromGtId(connectedDevice, engine->gtId);
UNRECOVERABLE_IF(tileIndex < 0);
auto &vmToTile = clientHandleToConnection[execQueuePlacements->clientHandle]->vmToTile;
if (vmToTile.find(execQueuePlacements->vmHandle) != vmToTile.end()) {
if (vmToTile[execQueuePlacements->vmHandle] != tileIndex) {
PRINT_DEBUGGER_ERROR_LOG("vmToTile map: For vm_handle = %lu tileIndex = %u already present. Attempt to overwrite with tileIndex = %u\n",
if (vmToTile[execQueuePlacements->vmHandle] != static_cast<uint32_t>(tileIndex)) {
PRINT_DEBUGGER_ERROR_LOG("vmToTile map: For vm_handle = %lu tileIndex = %u already present. Attempt to overwrite with tileIndex = %d\n",
static_cast<uint64_t>(execQueuePlacements->vmHandle), vmToTile[execQueuePlacements->vmHandle], tileIndex);
DEBUG_BREAK_IF(true);
}
} else {
clientHandleToConnection[execQueuePlacements->clientHandle]->vmToTile[execQueuePlacements->vmHandle] = tileIndex;
PRINT_DEBUGGER_INFO_LOG("clientHandleToConnection[%" SCNx64 "]->vmToTile[%" SCNx64 "] = %u\n",
PRINT_DEBUGGER_INFO_LOG("clientHandleToConnection[%" SCNx64 "]->vmToTile[%" SCNx64 "] = %d\n",
static_cast<uint64_t>(execQueuePlacements->clientHandle), static_cast<uint64_t>(execQueuePlacements->vmHandle), tileIndex);
}
} else if (type == euDebugInterface->getParamValue(NEO::EuDebugParam::eventTypePagefault)) {

View File

@ -1468,7 +1468,7 @@ TEST_F(DebugApiLinuxTestXe, GivenEventTypeExecQueuePlacementsAndClientHandleIsIn
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;
engineClassInstance[0].gt_id = 2;
auto memory = std::make_unique<uint64_t[]>(size / sizeof(uint64_t));
memcpy(memory.get(), memoryExecQueuePlacements, size);
@ -1515,7 +1515,7 @@ TEST_F(DebugApiLinuxTestXe, GivenEventTypeExecQueuePlacementsWhenHandleInternalE
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;
engineClassInstance[0].gt_id = 2;
auto memory = std::make_unique<uint64_t[]>(size / sizeof(uint64_t));
memcpy(memory.get(), memoryExecQueuePlacements, size);
@ -2864,7 +2864,7 @@ TEST_F(DebugApiLinuxTestXe, GivenExecQueuePlacementEventWhenHandlingThenVmToTile
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;
engineClassInstance[0].gt_id = 2;
session->handleEvent(&execQueuePlacements->base);
alignedFree(memory);
@ -2894,7 +2894,7 @@ TEST_F(DebugApiLinuxTestXe, GivenMultipleExecQueuePlacementEventForSameVmHandleW
constexpr uint64_t vmHandle = 10;
session->clientHandleToConnection[client1.clientHandle]->vmToTile[vmHandle] = 1;
// Allocate memory for the structure including the flexible array member
constexpr auto size = sizeof(NEO::EuDebugEventExecQueuePlacements) + sizeof(drm_xe_engine_class_instance) * 1;
constexpr auto size = sizeof(NEO::EuDebugEventExecQueuePlacements) + sizeof(NEO::XeEngineClassInstance) * 1;
auto memory = alignedMalloc(size, sizeof(NEO::EuDebugEventExecQueuePlacements));
auto execQueuePlacements = static_cast<NEO::EuDebugEventExecQueuePlacements *>(memory);
memset(execQueuePlacements, 0, size);
@ -2906,10 +2906,10 @@ TEST_F(DebugApiLinuxTestXe, GivenMultipleExecQueuePlacementEventForSameVmHandleW
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 = 0;
auto engineClassInstance = reinterpret_cast<NEO::XeEngineClassInstance *>(&(execQueuePlacements->instances[0]));
engineClassInstance[0].engineClass = 0;
engineClassInstance[0].engineInstance = 1;
engineClassInstance[0].gtId = 0;
::testing::internal::CaptureStderr();
session->handleEvent(&execQueuePlacements->base);