From: hujian <hu.j...@zte.com.cn> During the stop of dataplane for virtio-blk, virtio_bus_cleanup_host_notifier() is be called to clean up notifier at the end, if polled ioeventfd, virtio_blk_handle_output() is used to handle io request. But due to s->dataplane_disabled is false, it will be returned directly, which drops io request. Backtrace: ->virtio_blk_data_plane_stop ->virtio_bus_cleanup_host_notifier ->virtio_queue_host_notifier_read ->virtio_queue_notify_vq ->vq->handle_output ->virtio_blk_handle_output ->if (s->dataplane && !s->dataplane_stoped) ->if (!s->dataplane_disabled) ->return * ->virtio_blk_handle_output_do The above problem can occur when using "virsh reset" cmdline to reset guest, while guest does io. To fix this problem, don't try to start dataplane if s->stopping is true, and io would be handled by virtio_blk_handle_vq().
Signed-off-by: hujian <hu.j...@zte.com.cn> Message-id: 202310111414266586...@zte.com.cn Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> --- hw/block/virtio-blk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index 39e7f23fab..c2d59389cb 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -1166,7 +1166,7 @@ static void virtio_blk_handle_output(VirtIODevice *vdev, VirtQueue *vq) { VirtIOBlock *s = (VirtIOBlock *)vdev; - if (s->dataplane && !s->dataplane_started) { + if (s->dataplane && !s->dataplane_started && !s->stopping) { /* Some guests kick before setting VIRTIO_CONFIG_S_DRIVER_OK so start * dataplane here instead of waiting for .set_status(). */ -- 2.41.0