From c643dd9c8dfab2166ca0d201729174f028804dbc Mon Sep 17 00:00:00 2001 From: Andrew Lewycky Date: Wed, 2 Jul 2014 13:48:55 -0400 Subject: [PATCH] hsa/radeon: Fix Auto-reset events behavior This patch changes the behavior of the auto-reset functionallity in the events code. The new behavior is that only after the events have been consumed by a waiter, they are being reset, if the auto-reset property is enabled. Signed-off-by: Andrew Lewycky Signed-off-by: Oded Gabbay --- drivers/gpu/hsa/radeon/kfd_events.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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);