mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-24 21:18:24 +08:00
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:
committed by
Compute-Runtime-Automation
parent
607b7a7a0e
commit
0f817d1db4
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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: ", "");
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user