diff --git a/drivers/gpu/hsa/radeon/kfd_events.c b/drivers/gpu/hsa/radeon/kfd_events.c index 3ae6eb431e207..77980ebde16eb 100644 --- a/drivers/gpu/hsa/radeon/kfd_events.c +++ b/drivers/gpu/hsa/radeon/kfd_events.c @@ -446,7 +446,8 @@ static void set_event(struct kfd_event *ev) struct kfd_event_waiter *waiter; struct kfd_event_waiter *next; - ev->signaled = true; + /* Auto reset if the list is non-empty and we're waking someone. */ + ev->signaled = !ev->auto_reset || list_empty(&ev->waiters); list_for_each_entry_safe(waiter, next, &ev->waiters, waiters) { waiter->activated = true; @@ -456,9 +457,6 @@ static void set_event(struct kfd_event *ev) wake_up_process(waiter->sleeping_task); } - - if (ev->auto_reset) - ev->signaled = false; } /* Assumes that p is current. */ @@ -586,6 +584,7 @@ static int init_event_waiter(struct kfd_process *p, struct kfd_event_waiter *wai return -EINVAL; waiter->activated = ev->signaled; + ev->signaled = ev->signaled && !ev->auto_reset; list_add(&waiter->waiters, &ev->waiters);