I think others should weigh in on the higher level abstractions you're
adding for vhost_user_blk_force_stop() - I don't have a strong
perspective on them. I'm ok with this for vhost-user-blk.

Acked-by: Raphael Norwitz <raph...@enfabrica.net>

On Mon, Jun 9, 2025 at 5:26 PM Daniil Tatianin
<d-tatia...@yandex-team.ru> wrote:
>
> If we have a server running disk requests that is for whatever reason
> hanging or not able to process any more IO requests but still has some
> in-flight requests previously issued by the guest OS, QEMU will still
> try to drain the vring before shutting down even if it was explicitly
> asked to do a "force shutdown" via SIGTERM or QMP quit. This is not
> useful since the guest is no longer running at this point since it was
> killed by QEMU earlier in the process. At this point, we don't care
> about whatever in-flight IO it might have pending, we just want QEMU
> to shut down.
>
> Add an option called "skip-get-vring-base-on-force-shutdown" to allow
> SIGTERM/QMP quit() to actually act like a "force shutdown" at least
> for vhost-user-blk devices since those require the drain operation
> to shut down gracefully unlike, for example, network devices.
>
> Signed-off-by: Daniil Tatianin <d-tatia...@yandex-team.ru>
> ---
>  hw/block/vhost-user-blk.c          | 9 ++++++++-
>  include/hw/virtio/vhost-user-blk.h | 2 ++
>  2 files changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c
> index 0eebbcd80d..c0cc5f6942 100644
> --- a/hw/block/vhost-user-blk.c
> +++ b/hw/block/vhost-user-blk.c
> @@ -210,6 +210,7 @@ static int vhost_user_blk_stop(VirtIODevice *vdev)
>      BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
>      VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
>      int ret;
> +    bool force_stop = false;
>
>      if (!s->started_vu) {
>          return 0;
> @@ -220,7 +221,11 @@ static int vhost_user_blk_stop(VirtIODevice *vdev)
>          return 0;
>      }
>
> -    ret = vhost_dev_stop(&s->dev, vdev, true);
> +    force_stop = s->skip_get_vring_base_on_force_shutdown &&
> +                 qemu_force_shutdown_requested();
> +
> +    ret = force_stop ? vhost_dev_force_stop(&s->dev, vdev, true) :
> +                       vhost_dev_stop(&s->dev, vdev, true);
>
>      if (k->set_guest_notifiers(qbus->parent, s->dev.nvqs, false) < 0) {
>          error_report("vhost guest notifier cleanup failed: %d", ret);
> @@ -584,6 +589,8 @@ static const Property vhost_user_blk_properties[] = {
>                        VIRTIO_BLK_F_DISCARD, true),
>      DEFINE_PROP_BIT64("write-zeroes", VHostUserBlk, parent_obj.host_features,
>                        VIRTIO_BLK_F_WRITE_ZEROES, true),
> +    DEFINE_PROP_BOOL("skip-get-vring-base-on-force-shutdown", VHostUserBlk,
> +                     skip_get_vring_base_on_force_shutdown, false),
>  };
>
>  static void vhost_user_blk_class_init(ObjectClass *klass, const void *data)
> diff --git a/include/hw/virtio/vhost-user-blk.h 
> b/include/hw/virtio/vhost-user-blk.h
> index ea085ee1ed..a10f785672 100644
> --- a/include/hw/virtio/vhost-user-blk.h
> +++ b/include/hw/virtio/vhost-user-blk.h
> @@ -50,6 +50,8 @@ struct VHostUserBlk {
>      bool connected;
>      /* vhost_user_blk_start/vhost_user_blk_stop */
>      bool started_vu;
> +
> +    bool skip_get_vring_base_on_force_shutdown;
>  };
>
>  #endif
> --
> 2.34.1
>

Reply via email to