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:
Alexey Skidanov
2014-11-27 16:24:06 +02:00
işlemeyi yapan: Oded Gabbay
ebeveyn d7196d4122
işleme c3b51fd827
3 değiştirilmiş dosya ile 34 ekleme ve 5 silme
+19 -5
Dosyayı Görüntüle
@@ -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;
}
+1
Dosyayı Görüntüle
@@ -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);
+14
Dosyayı Görüntüle
@@ -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(