diff --git a/projects/rocr-runtime/include/hsakmt.h b/projects/rocr-runtime/include/hsakmt.h index ff71d0c068..5a7e2f4c37 100644 --- a/projects/rocr-runtime/include/hsakmt.h +++ b/projects/rocr-runtime/include/hsakmt.h @@ -243,6 +243,25 @@ hsaKmtWaitOnEvent( HSAuint32 Milliseconds //IN ); +/** + Checks the current state of the event object. If the object's state is + nonsignaled, the calling thread enters the wait state. event_age can + help avoiding race conditions. + + The function returns when one of the following occurs: +- The specified event object is in the signaled state. +- The time-out interval elapses. +- Tracking event age +*/ + +HSAKMT_STATUS +HSAKMTAPI +hsaKmtWaitOnEvent_Ext( + HsaEvent* Event, //IN + HSAuint32 Milliseconds, //IN + uint64_t *event_age //IN/OUT + ); + /** Checks the current state of multiple event objects. @@ -264,6 +283,30 @@ hsaKmtWaitOnMultipleEvents( HSAuint32 Milliseconds //IN ); +/** + Checks the current state of multiple event objects. + event_age can help avoiding race conditions. + + The function returns when one of the following occurs: +- Either any one or all of the specified objects are in the signaled state + - if "WaitOnAll" is "true" the function returns when the state of all + objects in array is signaled + - if "WaitOnAll" is "false" the function returns when the state of any + one of the objects is set to signaled +- The time-out interval elapses. +- Tracking event age +*/ + +HSAKMT_STATUS +HSAKMTAPI +hsaKmtWaitOnMultipleEvents_Ext( + HsaEvent* Events[], //IN + HSAuint32 NumEvents, //IN + bool WaitOnAll, //IN + HSAuint32 Milliseconds, //IN + uint64_t *event_age //IN/OUT + ); + /** new TEMPORARY function definition - to be used only on "Triniti + Southern Islands" platform If used on other platforms the function will return HSAKMT_STATUS_ERROR diff --git a/projects/rocr-runtime/include/linux/kfd_ioctl.h b/projects/rocr-runtime/include/linux/kfd_ioctl.h index 6c030a065e..9080505614 100644 --- a/projects/rocr-runtime/include/linux/kfd_ioctl.h +++ b/projects/rocr-runtime/include/linux/kfd_ioctl.h @@ -39,9 +39,10 @@ * - 1.11 - Add unified memory for ctx save/restore area * - 1.12 - Add DMA buf export ioctl * - 1.13 - Add debugger API + * - 1.14 - Update kfd_event_data */ #define KFD_IOCTL_MAJOR_VERSION 1 -#define KFD_IOCTL_MINOR_VERSION 13 +#define KFD_IOCTL_MINOR_VERSION 14 /* * Debug revision change log @@ -979,12 +980,20 @@ struct kfd_hsa_hw_exception_data { __u32 gpu_id; }; +/* hsa signal event data */ +struct kfd_hsa_signal_event_data { + __u64 last_event_age; /* to and from KFD */ +}; + /* Event data */ struct kfd_event_data { union { + /* From KFD */ struct kfd_hsa_memory_exception_data memory_exception_data; struct kfd_hsa_hw_exception_data hw_exception_data; - }; /* From KFD */ + /* To and From KFD */ + struct kfd_hsa_signal_event_data signal_event_data; + }; __u64 kfd_event_data_ext; /* pointer to an extension structure for future exception types */ __u32 event_id; /* to KFD */ diff --git a/projects/rocr-runtime/src/events.c b/projects/rocr-runtime/src/events.c index 512abc2be0..6d3cd70805 100644 --- a/projects/rocr-runtime/src/events.c +++ b/projects/rocr-runtime/src/events.c @@ -213,11 +213,17 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtQueryEventState(HsaEvent *Event) HSAKMT_STATUS HSAKMTAPI hsaKmtWaitOnEvent(HsaEvent *Event, HSAuint32 Milliseconds) +{ + return hsaKmtWaitOnEvent_Ext(Event, Milliseconds, NULL); +} + +HSAKMT_STATUS HSAKMTAPI hsaKmtWaitOnEvent_Ext(HsaEvent *Event, + HSAuint32 Milliseconds, uint64_t *event_age) { if (!Event) return HSAKMT_STATUS_INVALID_HANDLE; - return hsaKmtWaitOnMultipleEvents(&Event, 1, true, Milliseconds); + return hsaKmtWaitOnMultipleEvents_Ext(&Event, 1, true, Milliseconds, event_age); } static HSAKMT_STATUS get_mem_info_svm_api(uint64_t address, uint32_t gpu_id) @@ -365,6 +371,15 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtWaitOnMultipleEvents(HsaEvent *Events[], HSAuint32 NumEvents, bool WaitOnAll, HSAuint32 Milliseconds) +{ + return hsaKmtWaitOnMultipleEvents_Ext(Events, NumEvents, WaitOnAll, Milliseconds, NULL); +} + +HSAKMT_STATUS HSAKMTAPI hsaKmtWaitOnMultipleEvents_Ext(HsaEvent *Events[], + HSAuint32 NumEvents, + bool WaitOnAll, + HSAuint32 Milliseconds, + uint64_t *event_age) { CHECK_KFD_OPEN(); @@ -376,6 +391,8 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtWaitOnMultipleEvents(HsaEvent *Events[], for (HSAuint32 i = 0; i < NumEvents; i++) { event_data[i].event_id = Events[i]->EventId; event_data[i].kfd_event_data_ext = (uint64_t)(uintptr_t)NULL; + if (event_age && Events[i]->EventData.EventType == HSA_EVENTTYPE_SIGNAL) + event_data[i].signal_event_data.last_event_age = event_age[i]; } struct kfd_ioctl_wait_events_args args = {0}; @@ -413,6 +430,12 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtWaitOnMultipleEvents(HsaEvent *Events[], } } out: + + for (HSAuint32 i = 0; i < NumEvents; i++) { + if (event_age && Events[i]->EventData.EventType == HSA_EVENTTYPE_SIGNAL) + event_age[i] = event_data[i].signal_event_data.last_event_age; + } + free(event_data); return result;