Il 12/03/2012 16:25, Zhi Yong Wu ha scritto:
> > > -    qemu_aio_flush();
> > > +    QTAILQ_FOREACH(bs, &bdrv_states, list) {
> > > +        do {
> > > +            qemu_co_queue_restart_all(&bs->throttled_reqs);
> > > +            qemu_aio_flush();
> > > +        } while (!qemu_co_queue_empty(&bs->throttled_reqs));
> > > +    }
> >
> > Even this is not enough.  Block device 2 could start a throttled request
> > on block device 1.
>
> I think that this should be allowed here. It does not affect the final
> result. All throttled requests for all disks are drained.

Unfortunately, that depends on the order of block devices.  It needs to
be something like this:

    do {
        qemu_aio_flush();
        busy = false;
        QTAILQ_FOREACH(bs, &bdrv_states, list) {
            if (!qemu_co_queue_empty(&bs->throttled_reqs)) {
                qemu_co_queue_restart_all(&bs->throttled_reqs);
                busy = true;
            }
        }
    } while (busy);


This means that bdrv_drain() cannot be implemented.  The device models
can "drain themselves", but for example monitor commands must still rely
on bdrv_drain_all().

Paolo

Reply via email to