Add event_age tracking when receiving interrupt.

Signed-off-by: James Zhu <james....@amd.com>
---
 drivers/gpu/drm/amd/amdkfd/kfd_events.c | 6 ++++++
 drivers/gpu/drm/amd/amdkfd/kfd_events.h | 1 +
 2 files changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
index 7ff5c4e1b7e2..c7689181cc22 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c
@@ -431,6 +431,7 @@ int kfd_event_create(struct file *devkfd, struct 
kfd_process *p,
        if (!ret) {
                *event_id = ev->event_id;
                *event_trigger_data = ev->event_id;
+               ev->event_age = 1;
        } else {
                kfree(ev);
        }
@@ -629,6 +630,11 @@ static void set_event(struct kfd_event *ev)
         * updating the wait queues in kfd_wait_on_events.
         */
        ev->signaled = !ev->auto_reset || !waitqueue_active(&ev->wq);
+       if (!(++ev->event_age)) {
+               /* Never wrap back to reserved/default event age 0/1 */
+               ev->event_age = 2;
+               WARN_ONCE(1, "event_age wrap back!");
+       }
 
        list_for_each_entry(waiter, &ev->wq.head, wait.entry)
                WRITE_ONCE(waiter->activated, true);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.h 
b/drivers/gpu/drm/amd/amdkfd/kfd_events.h
index 1c62c8dd6460..52ccfd397c2b 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.h
@@ -53,6 +53,7 @@ struct signal_page;
 
 struct kfd_event {
        u32 event_id;
+       u64 event_age;
 
        bool signaled;
        bool auto_reset;
-- 
2.34.1

Reply via email to