diff options
author | Alexey Skidanov <Alexey.Skidanov@amd.com> | 2014-11-27 16:24:06 +0200 |
---|---|---|
committer | Oded Gabbay <oded.gabbay@gmail.com> | 2015-05-19 15:22:11 +0300 |
commit | 8825677e488717915221ac73ea4b0ec24a901b09 (patch) | |
tree | 29e5e2cf0c015f1f29536acb6d2265a6a7694f68 | |
parent | c33cf534436f19ab1fb770cc9b66002305a564bf (diff) |
Add memory exception notification
Signed-off-by: Alexey Skidanov <Alexey.Skidanov@amd.com>
Signed-off-by: Oded Gabbay <oded.gabbay@amd.com>
-rw-r--r-- | src/events.c | 24 | ||||
-rw-r--r-- | src/libhsakmt.h | 1 | ||||
-rw-r--r-- | src/topology.c | 14 |
3 files changed, 34 insertions, 5 deletions
diff --git a/src/events.c b/src/events.c index be58253..5d6835e 100644 --- a/src/events.c +++ b/src/events.c @@ -89,6 +89,7 @@ hsaKmtCreateEvent( e->EventData.HWData2 = (HSAuint64)&events_page[args.event_slot_index]; e->EventId = args.event_id; + e->EventData.EventType = EventDesc->EventType; e->EventData.HWData1 = args.event_id; e->EventData.HWData3 = args.event_trigger_data; @@ -224,9 +225,10 @@ hsaKmtWaitOnMultipleEvents( if (!Events) return HSAKMT_STATUS_INVALID_HANDLE; - 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; @@ -235,7 +237,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; @@ -247,9 +249,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 fa8dc0e..0d73c8f 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 864be2b..903b6f7 100644 --- a/src/topology.c +++ b/src/topology.c @@ -698,6 +698,20 @@ validate_nodeid(uint32_t nodeid, uint32_t *gpu_id) } 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( HsaSystemProperties* SystemProperties //OUT |