refactor: Move debugger IsaAllocation to common linux code

-replace i915 event with generic EventToAck type
-Move isamap to common Client Connection
-Move isa memory access functions to common linux imp

Related-to: NEO-9669

Signed-off-by: Brandon Yates <brandon.yates@intel.com>
This commit is contained in:
Brandon Yates
2024-02-20 23:23:02 +00:00
committed by Compute-Runtime-Automation
parent 607b7a7a0e
commit 0f817d1db4
6 changed files with 113 additions and 116 deletions

View File

@@ -714,7 +714,6 @@ void DebugSessionLinux::updateStoppedThreadsAndCheckTriggerEvents(AttentionEvent
}
}
}
if (tileSessionsEnabled) {
checkTriggerEventsForAttentionForTileSession(tileIndex);
} else {
@@ -722,4 +721,79 @@ void DebugSessionLinux::updateStoppedThreadsAndCheckTriggerEvents(AttentionEvent
}
}
ze_result_t DebugSessionLinux::getISAVMHandle(uint32_t deviceIndex, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t &vmHandle) {
auto gmmHelper = connectedDevice->getNEODevice()->getGmmHelper();
auto accessVA = gmmHelper->decanonize(desc->address);
auto &isaMap = getClientConnection(clientHandle)->isaMap[deviceIndex];
ze_result_t status = ZE_RESULT_ERROR_UNINITIALIZED;
vmHandle = invalidHandle;
if (isaMap.size() > 0) {
uint64_t baseVa;
uint64_t ceilVa;
for (const auto &isa : isaMap) {
baseVa = isa.second->bindInfo.gpuVa;
ceilVa = isa.second->bindInfo.gpuVa + isa.second->bindInfo.size;
if (accessVA >= baseVa && accessVA < ceilVa) {
if (accessVA + size > ceilVa) {
status = ZE_RESULT_ERROR_INVALID_ARGUMENT;
} else {
vmHandle = isa.second->vmHandle;
status = ZE_RESULT_SUCCESS;
}
break;
}
}
}
return status;
}
bool DebugSessionLinux::getIsaInfoForAllInstances(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t vmHandles[], ze_result_t &status) {
auto gmmHelper = connectedDevice->getNEODevice()->getGmmHelper();
auto accessVA = gmmHelper->decanonize(desc->address);
status = ZE_RESULT_ERROR_UNINITIALIZED;
bool tileInstancedIsa = false;
bool invalidIsaRange = false;
uint32_t isaFound = 0;
for (uint32_t i = 0; i < NEO::EngineLimits::maxHandleCount; i++) {
vmHandles[i] = invalidHandle;
if (deviceBitfield.test(i)) {
auto &isaMap = getClientConnection(clientHandle)->isaMap[i];
if (isaMap.size() > 0) {
uint64_t baseVa;
uint64_t ceilVa;
for (const auto &isa : isaMap) {
baseVa = isa.second->bindInfo.gpuVa;
ceilVa = isa.second->bindInfo.gpuVa + isa.second->bindInfo.size;
if (accessVA >= baseVa && accessVA < ceilVa) {
isaFound++;
if (accessVA + size > ceilVa) {
invalidIsaRange = true;
} else {
vmHandles[i] = isa.second->vmHandle;
}
tileInstancedIsa = isa.second->tileInstanced;
break;
}
}
}
}
}
if (invalidIsaRange) {
status = ZE_RESULT_ERROR_INVALID_ARGUMENT;
} else if (isaFound > 0) {
if ((tileInstancedIsa && deviceBitfield.count() == isaFound) ||
!tileInstancedIsa) {
status = ZE_RESULT_SUCCESS;
}
}
return isaFound > 0;
}
} // namespace L0

View File

@@ -89,6 +89,29 @@ struct DebugSessionLinux : DebugSessionImp {
uint64_t gpuVa = 0;
uint64_t size = 0;
};
struct EventToAck {
EventToAck(uint64_t seqno, uint32_t type) : seqno(seqno), type(type){};
uint64_t seqno;
uint32_t type;
};
struct IsaAllocation {
BindInfo bindInfo;
uint64_t elfUuidHandle;
uint64_t vmHandle;
bool tileInstanced = false;
bool perKernelModule = true;
NEO::DeviceBitfield deviceBitfield;
uint64_t moduleBegin;
uint64_t moduleEnd;
std::unordered_set<uint64_t> cookies;
int vmBindCounter = 0;
bool moduleLoadEventAck = false;
std::vector<EventToAck> ackEvents;
};
struct ClientConnection {
virtual ~ClientConnection() = default;
virtual size_t getElfSize(uint64_t elfHandle) = 0;
@@ -102,6 +125,7 @@ struct DebugSessionLinux : DebugSessionImp {
std::unordered_map<uint64_t, uint32_t> vmToTile;
std::unordered_map<uint64_t, uint64_t> elfMap;
std::unordered_map<uint64_t, std::unique_ptr<IsaAllocation>> isaMap[NEO::EngineLimits::maxHandleCount];
uint64_t moduleDebugAreaGpuVa = 0;
uint64_t contextStateSaveAreaGpuVa = 0;
@@ -160,8 +184,8 @@ struct DebugSessionLinux : DebugSessionImp {
ze_result_t writeDefaultMemory(ze_device_thread_t thread, const zet_debug_memory_space_desc_t *desc,
size_t size, const void *buffer);
virtual bool tryAccessIsa(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, void *buffer, bool write, ze_result_t &status);
virtual ze_result_t getISAVMHandle(uint32_t deviceIndex, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t &vmHandle) = 0;
virtual bool getIsaInfoForAllInstances(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t vmHandles[], ze_result_t &status) = 0;
ze_result_t getISAVMHandle(uint32_t deviceIndex, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t &vmHandle);
bool getIsaInfoForAllInstances(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t vmHandles[], ze_result_t &status);
virtual std::vector<uint64_t> getAllMemoryHandles();

View File

@@ -810,7 +810,8 @@ bool DebugSessionLinuxi915::handleVmBindEvent(prelim_drm_i915_debug_event_vm_bin
if (doNotAutoAckEvent) {
PRINT_DEBUGGER_INFO_LOG("Add event to ack, seqno = %llu", (uint64_t)vmBind->base.seqno);
connection->isaMap[tileIndex][vmBind->va_start]->ackEvents.push_back(vmBind->base);
EventToAck ackEvent(vmBind->base.seqno, vmBind->base.type);
connection->isaMap[tileIndex][vmBind->va_start]->ackEvents.push_back(ackEvent);
shouldAckEvent = false;
}
}
@@ -892,7 +893,8 @@ bool DebugSessionLinuxi915::handleVmBindEvent(prelim_drm_i915_debug_event_vm_bin
if (allInstancesEventsReceived) {
if (vmBind->base.flags & PRELIM_DRM_I915_DEBUG_EVENT_NEED_ACK) {
debugEvent.flags = ZET_DEBUG_EVENT_FLAG_NEED_ACK;
module.ackEvents[tileIndex].push_back(vmBind->base);
EventToAck ackEvent(vmBind->base.seqno, vmBind->base.type);
module.ackEvents[tileIndex].push_back(ackEvent);
}
pushApiEvent(debugEvent, vmBind->uuids[uuidIter]);
shouldAckEvent = false;
@@ -903,7 +905,8 @@ bool DebugSessionLinuxi915::handleVmBindEvent(prelim_drm_i915_debug_event_vm_bin
if (tileAttached) {
if (vmBind->base.flags & PRELIM_DRM_I915_DEBUG_EVENT_NEED_ACK) {
debugEvent.flags = ZET_DEBUG_EVENT_FLAG_NEED_ACK;
module.ackEvents[tileIndex].push_back(vmBind->base);
EventToAck ackEvent(vmBind->base.seqno, vmBind->base.type);
module.ackEvents[tileIndex].push_back(ackEvent);
}
static_cast<TileDebugSessionLinuxi915 *>(tileSessions[tileIndex].first)->pushApiEvent(debugEvent, vmBind->uuids[uuidIter]);
shouldAckEvent = false;
@@ -955,7 +958,8 @@ bool DebugSessionLinuxi915::handleVmBindEvent(prelim_drm_i915_debug_event_vm_bin
shouldAckEvent = true;
}
if (!shouldAckEvent && (vmBind->base.flags & PRELIM_DRM_I915_DEBUG_EVENT_NEED_ACK)) {
module.ackEvents[tileIndex].push_back(vmBind->base);
EventToAck ackEvent(vmBind->base.seqno, vmBind->base.type);
module.ackEvents[tileIndex].push_back(ackEvent);
}
}
}
@@ -1307,83 +1311,6 @@ int DebugSessionLinuxi915::euControlIoctl(ThreadControlCmd threadCmd,
return euControlRetVal;
}
ze_result_t DebugSessionLinuxi915::getISAVMHandle(uint32_t deviceIndex, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t &vmHandle) {
auto gmmHelper = connectedDevice->getNEODevice()->getGmmHelper();
auto accessVA = gmmHelper->decanonize(desc->address);
auto &isaMap = clientHandleToConnection[clientHandle]->isaMap[deviceIndex];
ze_result_t status = ZE_RESULT_ERROR_UNINITIALIZED;
vmHandle = invalidHandle;
if (isaMap.size() > 0) {
uint64_t baseVa;
uint64_t ceilVa;
for (const auto &isa : isaMap) {
baseVa = isa.second->bindInfo.gpuVa;
ceilVa = isa.second->bindInfo.gpuVa + isa.second->bindInfo.size;
if (accessVA >= baseVa && accessVA < ceilVa) {
if (accessVA + size > ceilVa) {
status = ZE_RESULT_ERROR_INVALID_ARGUMENT;
} else {
vmHandle = isa.second->vmHandle;
status = ZE_RESULT_SUCCESS;
}
break;
}
}
}
return status;
}
bool DebugSessionLinuxi915::getIsaInfoForAllInstances(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t vmHandles[], ze_result_t &status) {
auto gmmHelper = connectedDevice->getNEODevice()->getGmmHelper();
auto accessVA = gmmHelper->decanonize(desc->address);
status = ZE_RESULT_ERROR_UNINITIALIZED;
bool tileInstancedIsa = false;
bool invalidIsaRange = false;
uint32_t isaFound = 0;
for (uint32_t i = 0; i < NEO::EngineLimits::maxHandleCount; i++) {
vmHandles[i] = invalidHandle;
if (deviceBitfield.test(i)) {
auto &isaMap = clientHandleToConnection[clientHandle]->isaMap[i];
if (isaMap.size() > 0) {
uint64_t baseVa;
uint64_t ceilVa;
for (const auto &isa : isaMap) {
baseVa = isa.second->bindInfo.gpuVa;
ceilVa = isa.second->bindInfo.gpuVa + isa.second->bindInfo.size;
if (accessVA >= baseVa && accessVA < ceilVa) {
isaFound++;
if (accessVA + size > ceilVa) {
invalidIsaRange = true;
} else {
vmHandles[i] = isa.second->vmHandle;
}
tileInstancedIsa = isa.second->tileInstanced;
break;
}
}
}
}
}
if (invalidIsaRange) {
status = ZE_RESULT_ERROR_INVALID_ARGUMENT;
} else if (isaFound > 0) {
if ((tileInstancedIsa && deviceBitfield.count() == isaFound) ||
!tileInstancedIsa) {
status = ZE_RESULT_SUCCESS;
}
}
return isaFound > 0;
}
void DebugSessionLinuxi915::printContextVms() {
if (NEO::debugManager.flags.DebuggerLogBitmask.get() & NEO::DebugVariables::DEBUGGER_LOG_BITMASK::LOG_INFO) {
PRINT_DEBUGGER_LOG(stdout, "\nINFO: Context - VM map: ", "");

View File

@@ -83,22 +83,6 @@ struct DebugSessionLinuxi915 : DebugSessionLinux {
uint64_t ptr = 0;
};
struct IsaAllocation {
BindInfo bindInfo;
uint64_t elfUuidHandle;
uint64_t vmHandle;
bool tileInstanced = false;
bool perKernelModule = true;
NEO::DeviceBitfield deviceBitfield;
uint64_t moduleBegin;
uint64_t moduleEnd;
std::unordered_set<uint64_t> cookies;
int vmBindCounter = 0;
bool moduleLoadEventAck = false;
std::vector<prelim_drm_i915_debug_event> ackEvents;
};
struct Module {
std::unordered_set<uint64_t> loadAddresses[NEO::EngineLimits::maxHandleCount];
@@ -108,7 +92,7 @@ struct DebugSessionLinuxi915 : DebugSessionLinux {
NEO::DeviceBitfield deviceBitfield;
int segmentVmBindCounter[NEO::EngineLimits::maxHandleCount];
std::vector<prelim_drm_i915_debug_event> ackEvents[NEO::EngineLimits::maxHandleCount];
std::vector<EventToAck> ackEvents[NEO::EngineLimits::maxHandleCount];
bool moduleLoadEventAcked[NEO::EngineLimits::maxHandleCount];
};
@@ -126,7 +110,6 @@ struct DebugSessionLinuxi915 : DebugSessionLinux {
std::unordered_map<uint64_t, std::pair<std::string, uint32_t>> classHandleToIndex;
std::unordered_map<uint64_t, UuidData> uuidMap;
std::unordered_map<uint64_t, std::unique_ptr<IsaAllocation>> isaMap[NEO::EngineLimits::maxHandleCount];
std::unordered_map<uint64_t, ContextHandle> lrcToContextHandle;
std::unordered_map<uint64_t, Module> uuidToModule;
@@ -206,9 +189,6 @@ struct DebugSessionLinuxi915 : DebugSessionLinux {
void readStateSaveAreaHeader() override;
int openVmFd(uint64_t vmHandle, bool readOnly) override;
ze_result_t getISAVMHandle(uint32_t deviceIndex, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t &vmHandle) override;
bool getIsaInfoForAllInstances(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t vmHandles[], ze_result_t &status) override;
int euControlIoctl(ThreadControlCmd threadCmd,
const NEO::EngineClassInstance *classInstance,
std::unique_ptr<uint8_t[]> &bitmask,

View File

@@ -157,9 +157,6 @@ struct DebugSessionLinuxXe : DebugSessionLinux {
MOCKABLE_VIRTUAL void handleEvent(drm_xe_eudebug_event *event);
void readInternalEventsAsync() override;
void pushApiEvent(zet_debug_event_t &debugEvent);
ze_result_t getISAVMHandle(uint32_t deviceIndex, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t &vmHandle) override { return ZE_RESULT_ERROR_UNKNOWN; };
bool getIsaInfoForAllInstances(NEO::DeviceBitfield deviceBitfield, const zet_debug_memory_space_desc_t *desc, size_t size, uint64_t vmHandles[], ze_result_t &status) override { return false; };
std::atomic<bool> detached{false};
uint64_t getVmHandleFromClientAndlrcHandle(uint64_t clientHandle, uint64_t lrcHandle) override;

View File

@@ -35,6 +35,7 @@
#include "level_zero/core/test/unit_tests/mocks/mock_device.h"
#include "level_zero/include/zet_intel_gpu_debug.h"
#include "level_zero/tools/source/debug/debug_handlers.h"
#include "level_zero/tools/source/debug/linux/debug_session.h"
#include "level_zero/tools/source/debug/linux/prelim/debug_session.h"
#include "level_zero/tools/test/unit_tests/sources/debug/debug_session_common.h"
#include "level_zero/tools/test/unit_tests/sources/debug/linux/prelim/debug_session_fixtures_linux.h"
@@ -591,11 +592,7 @@ TEST_F(DebugApiLinuxTest, GivenEventRequiringAckWhenAcknowledgeEventCalledThenSu
debugEvent.info.module.load = isaGpuVa;
debugEvent.type = ZET_DEBUG_EVENT_TYPE_MODULE_LOAD;
prelim_drm_i915_debug_event eventToAck = {};
eventToAck.type = 500;
eventToAck.seqno = 10;
eventToAck.flags = PRELIM_DRM_I915_DEBUG_EVENT_NEED_ACK;
eventToAck.size = sizeof(prelim_drm_i915_debug_event);
DebugSessionLinux::EventToAck ackEvent(10, 500);
auto isa = std::make_unique<DebugSessionLinuxi915::IsaAllocation>();
isa->bindInfo = {isaGpuVa, isaSize};
@@ -607,7 +604,7 @@ TEST_F(DebugApiLinuxTest, GivenEventRequiringAckWhenAcknowledgeEventCalledThenSu
auto &isaMap = sessionMock->clientHandleToConnection[sessionMock->clientHandle]->isaMap[0];
isaMap[isaGpuVa] = std::move(isa);
isaMap[isaGpuVa]->vmBindCounter = 5;
isaMap[isaGpuVa]->ackEvents.push_back(eventToAck);
isaMap[isaGpuVa]->ackEvents.push_back(ackEvent);
sessionMock->pushApiEvent(debugEvent);
@@ -615,7 +612,6 @@ TEST_F(DebugApiLinuxTest, GivenEventRequiringAckWhenAcknowledgeEventCalledThenSu
EXPECT_EQ(result, ZE_RESULT_SUCCESS);
EXPECT_EQ(500u, handler->debugEventAcked.type);
EXPECT_EQ(0u, handler->debugEventAcked.flags);
EXPECT_EQ(10u, handler->debugEventAcked.seqno);
}
@@ -3751,7 +3747,6 @@ TEST_F(DebugApiLinuxVmBindTest, GivenEventWithAckFlagWhenHandlingEventForISAThen
EXPECT_EQ(1u, isaIter->second->ackEvents.size());
auto ackedEvent = isaIter->second->ackEvents[0];
EXPECT_EQ(vmBindIsa->base.flags, ackedEvent.flags);
EXPECT_EQ(vmBindIsa->base.seqno, ackedEvent.seqno);
EXPECT_EQ(vmBindIsa->base.type, ackedEvent.type);
}