fix: modify vmBind event handling conditions

handleVmBind only if all the num_binds and num_extension events
and UFENCE events have arrived.

Related-To: NEO-11083
Signed-off-by: Jitendra Sharma <jitendra.sharma@intel.com>
This commit is contained in:
Jitendra Sharma
2024-04-08 15:14:55 +00:00
committed by Compute-Runtime-Automation
parent 89b3e7209d
commit 19130dda29
3 changed files with 33 additions and 19 deletions

View File

@@ -318,7 +318,7 @@ void DebugSessionLinuxXe::handleEvent(drm_xe_eudebug_event *event) {
vmBindOpData.vmBindOp = *vmBindOp;
vmBindData.pendingNumBinds--;
clientHandleToConnection[clientHandle]->vmBindIdentifierMap[vmBindOp->base.seqno] = vmBindOp->vm_bind_ref_seqno;
handleVmBindWithoutUfence(vmBindData, vmBindOpData);
handleVmBind(vmBindData);
} break;
case DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE: {
@@ -331,7 +331,8 @@ void DebugSessionLinuxXe::handleEvent(drm_xe_eudebug_event *event) {
UNRECOVERABLE_IF(vmBindMap.find(vmBindUfence->vm_bind_ref_seqno) == vmBindMap.end());
uint32_t uFenceRequired = vmBindMap[vmBindUfence->vm_bind_ref_seqno].vmBind.flags & DRM_XE_EUDEBUG_EVENT_VM_BIND_FLAG_UFENCE;
UNRECOVERABLE_IF(!uFenceRequired);
UNRECOVERABLE_IF(vmBindMap[vmBindUfence->vm_bind_ref_seqno].pendingNumBinds);
UNRECOVERABLE_IF(vmBindMap[vmBindUfence->vm_bind_ref_seqno].uFenceReceived); // Dont expect multiple UFENCE for same vm_bind
vmBindMap[vmBindUfence->vm_bind_ref_seqno].uFenceReceived = true;
vmBindMap[vmBindUfence->vm_bind_ref_seqno].vmBindUfence = *vmBindUfence;
handleVmBind(vmBindMap[vmBindUfence->vm_bind_ref_seqno]);
} break;
@@ -361,7 +362,7 @@ void DebugSessionLinuxXe::handleEvent(drm_xe_eudebug_event *event) {
UNRECOVERABLE_IF(!vmBindOpData.pendingNumExtensions);
vmBindOpData.vmBindOpMetadataVec.push_back(*vmBindOpMetadata);
vmBindOpData.pendingNumExtensions--;
handleVmBindWithoutUfence(vmBindMap[vmBindSeqNo], vmBindOpData);
handleVmBind(vmBindMap[vmBindSeqNo]);
} break;
default:
@@ -370,18 +371,29 @@ void DebugSessionLinuxXe::handleEvent(drm_xe_eudebug_event *event) {
}
}
void DebugSessionLinuxXe::handleVmBindWithoutUfence(VmBindData &vmBindData, VmBindOpData &vmBindOpData) {
bool DebugSessionLinuxXe::canHandleVmBind(VmBindData &vmBindData) const {
if (vmBindData.pendingNumBinds) {
return false;
}
for (const auto &vmBindOpData : vmBindData.vmBindOpMap) {
if (vmBindOpData.second.pendingNumExtensions) {
return false;
}
}
uint32_t uFenceRequired = vmBindData.vmBind.flags & DRM_XE_EUDEBUG_EVENT_VM_BIND_FLAG_UFENCE;
if (uFenceRequired) {
return;
if (!vmBindData.uFenceReceived) {
return false;
}
}
if (vmBindData.pendingNumBinds || vmBindOpData.pendingNumExtensions) {
return;
}
handleVmBind(vmBindData);
return true;
}
void DebugSessionLinuxXe::handleVmBind(VmBindData &vmBindData) {
if (!canHandleVmBind(vmBindData)) {
return;
}
bool shouldAckEvent = vmBindData.vmBind.flags & DRM_XE_EUDEBUG_EVENT_VM_BIND_FLAG_UFENCE;
auto connection = clientHandleToConnection[clientHandle].get();
auto elfHandleInVmBind = invalidHandle;
@@ -390,7 +402,6 @@ void DebugSessionLinuxXe::handleVmBind(VmBindData &vmBindData) {
bool triggerModuleLoadEvent = false;
for (auto &vmBindOpData : vmBindData.vmBindOpMap) {
UNRECOVERABLE_IF(vmBindOpData.second.pendingNumExtensions);
for (const auto &vmBindOpMetadata : vmBindOpData.second.vmBindOpMetadataVec) {
auto &vmBindOp = vmBindOpData.second.vmBindOp;
auto &metaDataEntry = connection->metaDataMap[vmBindOpMetadata.metadata_handle];

View File

@@ -115,6 +115,7 @@ struct DebugSessionLinuxXe : DebugSessionLinux {
struct VmBindData {
uint64_t pendingNumBinds = 0;
drm_xe_eudebug_event_vm_bind vmBind;
bool uFenceReceived = false;
drm_xe_eudebug_event_vm_bind_ufence vmBindUfence;
std::unordered_map<VmBindOpSeqNo, VmBindOpData> vmBindOpMap;
};
@@ -132,6 +133,7 @@ struct DebugSessionLinuxXe : DebugSessionLinux {
std::unordered_map<VmBindOpSeqNo, VmBindSeqNo> vmBindIdentifierMap;
};
std::unordered_map<uint64_t, std::shared_ptr<ClientConnectionXe>> clientHandleToConnection;
bool canHandleVmBind(VmBindData &vmBindData) const;
void handleVmBind(VmBindData &vmBindData);
void handleVmBindWithoutUfence(VmBindData &vmBindData, VmBindOpData &vmBindOpData);

View File

@@ -1359,30 +1359,31 @@ TEST_F(DebugApiLinuxTestXe, GivenVmBindOpMetadataCreateEventAndUfenceForProgramM
vmBindOp.vm_bind_ref_seqno = vmBind.base.seqno;
session->handleEvent(reinterpret_cast<drm_xe_eudebug_event *>(&vmBindOp.base));
drm_xe_eudebug_event_vm_bind_ufence vmBindUfence{};
vmBindUfence.base.type = DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE;
vmBindUfence.base.flags = DRM_XE_EUDEBUG_EVENT_CREATE | DRM_XE_EUDEBUG_EVENT_NEED_ACK;
vmBindUfence.base.len = sizeof(drm_xe_eudebug_event_vm_bind_ufence);
vmBindUfence.base.seqno = 3;
vmBindUfence.vm_bind_ref_seqno = vmBind.base.seqno;
session->handleEvent(reinterpret_cast<drm_xe_eudebug_event *>(&vmBindUfence.base));
auto &vmBindOpData = vmBindMap[vmBindOp.vm_bind_ref_seqno].vmBindOpMap[vmBindOp.base.seqno];
drm_xe_eudebug_event_vm_bind_op_metadata vmBindOpMetadata{};
vmBindOpMetadata.base.type = DRM_XE_EUDEBUG_EVENT_VM_BIND_OP_METADATA;
vmBindOpMetadata.base.flags = DRM_XE_EUDEBUG_EVENT_CREATE;
vmBindOpMetadata.base.len = sizeof(drm_xe_eudebug_event_vm_bind_op_metadata);
vmBindOpMetadata.base.seqno = 3;
vmBindOpMetadata.base.seqno = 4;
vmBindOpMetadata.vm_bind_op_ref_seqno = vmBindOp.base.seqno;
vmBindOpMetadata.metadata_handle = 10;
session->handleEvent(reinterpret_cast<drm_xe_eudebug_event *>(&vmBindOpMetadata.base));
vmBindOpMetadata.base.seqno = 4;
vmBindOpMetadata.base.seqno = 5;
vmBindOpMetadata.metadata_handle = 11;
session->handleEvent(reinterpret_cast<drm_xe_eudebug_event *>(&vmBindOpMetadata.base));
EXPECT_EQ(vmBindOpData.pendingNumExtensions, 0ull);
EXPECT_EQ(vmBindOpData.vmBindOpMetadataVec.size(), 2ull);
drm_xe_eudebug_event_vm_bind_ufence vmBindUfence{};
vmBindUfence.base.type = DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE;
vmBindUfence.base.flags = DRM_XE_EUDEBUG_EVENT_CREATE | DRM_XE_EUDEBUG_EVENT_NEED_ACK;
vmBindUfence.base.len = sizeof(drm_xe_eudebug_event_vm_bind_ufence);
vmBindUfence.base.seqno = 5;
vmBindUfence.vm_bind_ref_seqno = vmBind.base.seqno;
session->handleEvent(reinterpret_cast<drm_xe_eudebug_event *>(&vmBindUfence.base));
EXPECT_EQ(connection->metaDataToModule[10].ackEvents->size(), 1ull);
EXPECT_EQ(connection->metaDataToModule[10].ackEvents[0][0].seqno, vmBindUfence.base.seqno);
EXPECT_EQ(connection->metaDataToModule[10].ackEvents[0][0].type, vmBindUfence.base.type);