summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Skidanov <Alexey.Skidanov@amd.com>2014-11-27 16:24:06 +0200
committerOded Gabbay <oded.gabbay@gmail.com>2015-05-19 15:22:11 +0300
commit8825677e488717915221ac73ea4b0ec24a901b09 (patch)
tree29e5e2cf0c015f1f29536acb6d2265a6a7694f68
parentc33cf534436f19ab1fb770cc9b66002305a564bf (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.c24
-rw-r--r--src/libhsakmt.h1
-rw-r--r--src/topology.c14
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