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.