From c3b51fd8270f0536cc8f0899aea95ebaa52003d3 Mon Sep 17 00:00:00 2001 From: Alexey Skidanov Date: Thu, 27 Nov 2014 16:24:06 +0200 Subject: [PATCH] Adding memory exception notification through hsaKmtWaitOnMultipleEvents Signed-off-by: Alexey Skidanov Reviewed-by: Oded Gabbay --- src/events.c | 24 +++++++++++++++++++----- src/libhsakmt.h | 1 + src/topology.c | 14 ++++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/events.c b/src/events.c index c62f4a4a20..5d674bcd5f 100644 --- a/src/events.c +++ b/src/events.c @@ -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; } diff --git a/src/libhsakmt.h b/src/libhsakmt.h index fa8dc0e24a..0d73c8fa8b 100644 --- a/src/libhsakmt.h +++ b/src/libhsakmt.h @@ -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); diff --git a/src/topology.c b/src/topology.c index e50b7458d8..3275aba9c2 100644 --- a/src/topology.c +++ b/src/topology.c @@ -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(