On 23/02/2017 10:18, Fam Zheng wrote:
> +    for (i = 0; i < s->nr_queues; ++i) {
> +        s->queues[i]->free_req_queue_bh =
> +            aio_bh_new(new_context, nvme_free_req_queue_cb, s->queues[i]);
> +    }

aio_bh_new has the issue that you can complete two requests in one
nvme_process_completion call, but you would only invoke the bottom half
once.  Because this is a rare event, I think it's enough to use
aio_bh_schedule_oneshot instead of aio_bh_new.

> +static coroutine_fn int nvme_cmd_unmap_qiov(BlockDriverState *bs,
> +                                            QEMUIOVector *qiov)
> +{
> +    int r = 0;
> +    BDRVNVMeState *s = bs->opaque;
> +
> +    if (!s->inflight && !qemu_co_queue_empty(&s->dma_flush_queue)) {
> +        r = nvme_vfio_dma_reset_temporary(s->vfio);
> +        qemu_co_queue_next(&s->dma_flush_queue);
> +    }
> +    return r;
> +}

Should this be qemu_co_queue_restart_all instead?

Paolo

Reply via email to