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 >