On Tue, 08/02 08:46, Paolo Bonzini wrote: > > > On 29/07/2016 12:22, Fam Zheng wrote: > > At system_reset, there is no point in retrying the queued request, > > because the driver that issued the request won't be around any more. > > > > Analyzed-by: Laszlo Ersek <ler...@redhat.com> > > Reported-by: Laszlo Ersek <ler...@redhat.com> > > Signed-off-by: Fam Zheng <f...@redhat.com> > > --- > > hw/block/virtio-blk.c | 6 ++++++ > > 1 file changed, 6 insertions(+) > > > > diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c > > index 475a822..89eca65 100644 > > --- a/hw/block/virtio-blk.c > > +++ b/hw/block/virtio-blk.c > > @@ -654,6 +654,7 @@ static void virtio_blk_reset(VirtIODevice *vdev) > > { > > VirtIOBlock *s = VIRTIO_BLK(vdev); > > AioContext *ctx; > > + VirtIOBlockReq *req; > > > > /* > > * This should cancel pending requests, but can't do nicely until there > > @@ -661,6 +662,11 @@ static void virtio_blk_reset(VirtIODevice *vdev) > > */ > > ctx = blk_get_aio_context(s->blk); > > aio_context_acquire(ctx); > > + while (s->rq) { > > + req = s->rq; > > + s->rq = req->next; > > + virtio_blk_free_request(req); > > + } > > blk_drain(s->blk); > > blk_drain can consume requests too, so I think it should be the other > way round: first drain, then drop any failed request that's been left in > s->rq.
I don't think there is any difference in this, blk_drain cannot trigger virtio_blk_dma_restart_cb, because it is only hooked to vm state change. Fam