Before this patch, cancelled waiters would only be cleaned up
once their threshold value was reached. Make host1x_intr_put_ref
process the cancellation immediately to fix this.

Signed-off-by: Mikko Perttunen <mperttu...@nvidia.com>
---
 drivers/gpu/host1x/intr.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/host1x/intr.c b/drivers/gpu/host1x/intr.c
index 9245add23b5d..5d328d20ce6d 100644
--- a/drivers/gpu/host1x/intr.c
+++ b/drivers/gpu/host1x/intr.c
@@ -247,13 +247,17 @@ void host1x_intr_put_ref(struct host1x *host, unsigned 
int id, void *ref)
        struct host1x_waitlist *waiter = ref;
        struct host1x_syncpt *syncpt;
 
-       while (atomic_cmpxchg(&waiter->state, WLS_PENDING, WLS_CANCELLED) ==
-              WLS_REMOVED)
-               schedule();
+       atomic_cmpxchg(&waiter->state, WLS_PENDING, WLS_CANCELLED);
 
        syncpt = host->syncpt + id;
-       (void)process_wait_list(host, syncpt,
-                               host1x_syncpt_load(host->syncpt + id));
+
+       spin_lock(&syncpt->intr.lock);
+       if (atomic_cmpxchg(&waiter->state, WLS_CANCELLED, WLS_HANDLED) ==
+           WLS_CANCELLED) {
+               list_del(&waiter->list);
+               kref_put(&waiter->refcount, waiter_release);
+       }
+       spin_unlock(&syncpt->intr.lock);
 
        kref_put(&waiter->refcount, waiter_release);
 }
-- 
2.29.2

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to