drm/amdkfd: update user space last_event_age
authorJames Zhu <James.Zhu@amd.com>
Thu, 8 Jun 2023 15:22:03 +0000 (11:22 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 15 Jun 2023 15:37:55 +0000 (11:37 -0400)
Update user space last_event_age when event age is enabled.
It is only for KFD_EVENT_TYPE_SIGNAL which is checked by user space.

Signed-off-by: James Zhu <James.Zhu@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_events.c

index 545179535d21a4698e76ca92dc24fed226f6688c..8081a9408006e388d4ea5dc3ebad422159717983 100644 (file)
@@ -865,22 +865,29 @@ static int copy_signaled_event_data(uint32_t num_events,
                struct kfd_event_waiter *event_waiters,
                struct kfd_event_data __user *data)
 {
-       struct kfd_hsa_memory_exception_data *src;
-       struct kfd_hsa_memory_exception_data __user *dst;
+       void *src;
+       void __user *dst;
        struct kfd_event_waiter *waiter;
        struct kfd_event *event;
-       uint32_t i;
+       uint32_t i, size = 0;
 
        for (i = 0; i < num_events; i++) {
                waiter = &event_waiters[i];
                event = waiter->event;
                if (!event)
                        return -EINVAL; /* event was destroyed */
-               if (waiter->activated && event->type == KFD_EVENT_TYPE_MEMORY) {
-                       dst = &data[i].memory_exception_data;
-                       src = &event->memory_exception_data;
-                       if (copy_to_user(dst, src,
-                               sizeof(struct kfd_hsa_memory_exception_data)))
+               if (waiter->activated) {
+                       if (event->type == KFD_EVENT_TYPE_MEMORY) {
+                               dst = &data[i].memory_exception_data;
+                               src = &event->memory_exception_data;
+                               size = sizeof(struct kfd_hsa_memory_exception_data);
+                       } else if (event->type == KFD_EVENT_TYPE_SIGNAL &&
+                               waiter->event_age_enabled) {
+                               dst = &data[i].signal_event_data.last_event_age;
+                               src = &event->event_age;
+                               size = sizeof(u64);
+                       }
+                       if (size && copy_to_user(dst, src, size))
                                return -EFAULT;
                }
        }