Sounds good, thanks!

On Mon, Dec 15, 2025, 6:43 AM Paolo Bonzini <[email protected]> wrote:

> On 12/13/25 01:14, Marc Morcos wrote:
> >
> >           req->ret = ret;
>
> Better use qatomic_set here---will fix it myself, thanks!
>
> Paolo
>
> > -        /* Write ret before state.  */
> > -        smp_wmb();
> > -        req->state = THREAD_DONE;
> > +        /* _release to write ret before state.  */
> > +        qatomic_store_release(&req->state, THREAD_DONE);
> >
> >           qemu_bh_schedule(pool->completion_bh);
> >           qemu_mutex_lock(&pool->lock);
> > @@ -180,7 +184,8 @@ static void thread_pool_completion_bh(void *opaque)
> >
> >   restart:
> >       QLIST_FOREACH_SAFE(elem, &pool->head, all, next) {
> > -        if (elem->state != THREAD_DONE) {
> > +        /* _acquire to read state before ret.  */
> > +        if (qatomic_load_acquire(&elem->state) != THREAD_DONE) {
> >               continue;
> >           }
> >
> > @@ -189,9 +194,6 @@ restart:
> >           QLIST_REMOVE(elem, all);
> >
> >           if (elem->common.cb) {
> > -            /* Read state before ret.  */
> > -            smp_rmb();
> > -
> >               /* Schedule ourselves in case elem->common.cb() calls
> aio_poll() to
> >                * wait for another request that completed at the same
> time.
> >                */
> > @@ -223,12 +225,12 @@ static void thread_pool_cancel(BlockAIOCB *acb)
> >       trace_thread_pool_cancel_aio(elem, elem->common.opaque);
> >
> >       QEMU_LOCK_GUARD(&pool->lock);
> > -    if (elem->state == THREAD_QUEUED) {
> > +    if (qatomic_read(&elem->state) == THREAD_QUEUED) {
> >           QTAILQ_REMOVE(&pool->request_list, elem, reqs);
> >           qemu_bh_schedule(pool->completion_bh);
> >
> > -        elem->state = THREAD_DONE;
> > -        elem->ret = -ECANCELED;
> > +        qatomic_set(&elem->ret, -ECANCELED);
> > +        qatomic_store_release(&elem->state, THREAD_DONE);
> >       }
> >
> >   }
>
>

Reply via email to