11.01.2021 16:00, Mikko Perttunen пишет:
> -void host1x_intr_put_ref(struct host1x *host, unsigned int id, void *ref)
> +void host1x_intr_put_ref(struct host1x *host, unsigned int id, void *ref,
> +                      bool flush)
>  {
>       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);
> +
> +     if (flush) {
> +             /* Wait until any concurrently executing handler has finished. 
> */
> +             while (atomic_read(&waiter->state) != WLS_HANDLED)
> +                     cpu_relax();
> +     }

A busy-loop shouldn't be used in kernel unless there is a very good
reason. The wait_event() should be used instead.

But please don't hurry to update this patch, we may need or want to
retire the host1x-waiter and then these all waiter-related patches won't
be needed.
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to