On Mon, 29 Jan 2024 at 03:54, Yi Sun <yi.sun@xxxxxxxxxx> wrote: > > Ensure no remaining requests in virtqueues before resetting vdev and > deleting virtqueues. Otherwise these requests will never be completed. > It may cause the system to become unresponsive. > > Function blk_mq_quiesce_queue() can ensure that requests have become > in_flight status, but it cannot guarantee that requests have been > processed by the device. Virtqueues should never be deleted before > all requests become complete status. > > Function blk_mq_freeze_queue() ensure that all requests in virtqueues > become complete status. And no requests can enter in virtqueues. > > Signed-off-by: Yi Sun <yi.sun@xxxxxxxxxx> > --- > drivers/block/virtio_blk.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) Reviewed-by: Stefan Hajnoczi <stefanha@xxxxxxxxxx> > > diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c > index 3b6b9abb8ce1..14ecc14ce8db 100644 > --- a/drivers/block/virtio_blk.c > +++ b/drivers/block/virtio_blk.c > @@ -1595,14 +1595,15 @@ static int virtblk_freeze(struct virtio_device *vdev) > { > struct virtio_blk *vblk = vdev->priv; > > + /* Ensure no requests in virtqueues before deleting vqs. */ > + blk_mq_freeze_queue(vblk->disk->queue); > + > /* Ensure we don't receive any more interrupts */ > virtio_reset_device(vdev); > > /* Make sure no work handler is accessing the device. */ > flush_work(&vblk->config_work); > > - blk_mq_quiesce_queue(vblk->disk->queue); > - > vdev->config->del_vqs(vdev); > kfree(vblk->vqs); > > @@ -1620,7 +1621,7 @@ static int virtblk_restore(struct virtio_device *vdev) > > virtio_device_ready(vdev); > > - blk_mq_unquiesce_queue(vblk->disk->queue); > + blk_mq_unfreeze_queue(vblk->disk->queue); > return 0; > } > #endif > -- > 2.25.1 > >