[PATCH v5 04/21] gpu: host1x: Remove cancelled waiters immediately
Dmitry Osipenko
digetx at gmail.com
Tue Jan 12 22:07:42 UTC 2021
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.
More information about the dri-devel
mailing list