Adding memory exception notification through hsaKmtWaitOnMultipleEvents
Signed-off-by: Alexey Skidanov <Alexey.Skidanov@amd.com> Reviewed-by: Oded Gabbay <oded.gabbay@amd.com>
Bu işleme şunda yer alıyor:
işlemeyi yapan:
Oded Gabbay
ebeveyn
d7196d4122
işleme
c3b51fd827
+19
-5
@@ -71,6 +71,7 @@ hsaKmtCreateEvent(
|
||||
return HSAKMT_STATUS_ERROR;
|
||||
|
||||
e->EventId = args.event_id;
|
||||
e->EventData.EventType = EventDesc->EventType;
|
||||
e->EventData.HWData1 = args.event_id;
|
||||
e->EventData.HWData2 = args.event_trigger_address;
|
||||
e->EventData.HWData3 = args.event_trigger_data;
|
||||
@@ -187,9 +188,10 @@ hsaKmtWaitOnMultipleEvents(
|
||||
{
|
||||
CHECK_KFD_OPEN();
|
||||
|
||||
uint32_t *event_ids = malloc(NumEvents * sizeof(uint32_t));
|
||||
struct kfd_event_data *event_data = malloc(NumEvents * sizeof(struct kfd_event_data));
|
||||
for (HSAuint32 i = 0; i < NumEvents; i++) {
|
||||
event_ids[i] = Events[i]->EventId;
|
||||
event_data[i].event_id = Events[i]->EventId;
|
||||
event_data[i].kfd_event_data_ext = (uint64_t)(uintptr_t)NULL;
|
||||
}
|
||||
|
||||
struct kfd_ioctl_wait_events_args args;
|
||||
@@ -198,7 +200,7 @@ hsaKmtWaitOnMultipleEvents(
|
||||
args.wait_for_all = WaitOnAll;
|
||||
args.timeout = Milliseconds;
|
||||
args.num_events = NumEvents;
|
||||
args.events_ptr = (uint64_t)(uintptr_t)event_ids;
|
||||
args.events_ptr = (uint64_t)(uintptr_t)event_data;
|
||||
|
||||
HSAKMT_STATUS result;
|
||||
|
||||
@@ -210,9 +212,21 @@ hsaKmtWaitOnMultipleEvents(
|
||||
}
|
||||
else {
|
||||
result = HSAKMT_STATUS_SUCCESS;
|
||||
for (HSAuint32 i = 0; i < NumEvents; i++) {
|
||||
if (Events[i]->EventData.EventType == HSA_EVENTTYPE_MEMORY) {
|
||||
Events[i]->EventData.EventData.MemoryAccessFault.VirtualAddress = event_data[i].memory_exception_data.va;
|
||||
result = gpuid_to_nodeid(event_data[i].memory_exception_data.gpu_id, &Events[i]->EventData.EventData.MemoryAccessFault.NodeId);
|
||||
if (result != HSAKMT_STATUS_SUCCESS)
|
||||
goto out;
|
||||
Events[i]->EventData.EventData.MemoryAccessFault.Failure.NotPresent = event_data[i].memory_exception_data.failure.NotPresent;
|
||||
Events[i]->EventData.EventData.MemoryAccessFault.Failure.ReadOnly = event_data[i].memory_exception_data.failure.ReadOnly;
|
||||
Events[i]->EventData.EventData.MemoryAccessFault.Failure.NoExecute = event_data[i].memory_exception_data.failure.NoExecute;
|
||||
Events[i]->EventData.EventData.MemoryAccessFault.Flags = HSA_EVENTID_MEMORY_FATAL_PROCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(event_ids);
|
||||
out:
|
||||
free(event_data);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ extern pthread_mutex_t hsakmt_mutex;
|
||||
#define MAX_NODES 8
|
||||
|
||||
HSAKMT_STATUS validate_nodeid(uint32_t nodeid, uint32_t *gpu_id);
|
||||
HSAKMT_STATUS gpuid_to_nodeid(uint32_t gpu_id, uint32_t* node_id);
|
||||
uint16_t get_device_id_by_node(HSAuint32 node_id);
|
||||
|
||||
extern int kmtIoctl(int fd, unsigned long request, void *arg);
|
||||
|
||||
@@ -697,6 +697,20 @@ validate_nodeid(uint32_t nodeid, uint32_t *gpu_id)
|
||||
return HSAKMT_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
HSAKMT_STATUS
|
||||
gpuid_to_nodeid(uint32_t gpu_id, uint32_t* node_id){
|
||||
uint64_t node_idx;
|
||||
for(node_idx = 0; node_idx < system->NumNodes; node_idx++){
|
||||
if (node[node_idx].gpu_id == gpu_id){
|
||||
*node_id = node_idx;
|
||||
return HSAKMT_STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return HSAKMT_STATUS_INVALID_NODE_UNIT;
|
||||
|
||||
}
|
||||
|
||||
HSAKMT_STATUS
|
||||
HSAKMTAPI
|
||||
hsaKmtAcquireSystemProperties(
|
||||
|
||||
Yeni konuda referans
Bir kullanıcı engelle