Re: [PATCH v6 5/5] vhost-user-blk: support inter-host inflight migration
Peter Xu <[email protected]> Wed, 14 Jan 2026 07:26:24 -0500
| Newsgroups | dev.linux.lists.virtio-fs,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
On Tue, Jan 13, 2026 at 02:58:19PM +0500, Alexandr Moshkov wrote: > During inter-host migration, waiting for disk requests to be drained > in the vhost-user backend can incur significant downtime. > > This can be avoided if QEMU migrates the inflight region in > vhost-user-blk. > Thus, during the qemu migration, with feature flag the vhost-user > back-end can immediately stop vrings, so all in-flight requests will be > migrated to another host. > > Signed-off-by: Alexandr Moshkov <[email protected]> > --- > hw/block/vhost-user-blk.c | 28 ++++++++++++++++++++++++++++ > include/hw/virtio/vhost-user-blk.h | 1 + > 2 files changed, 29 insertions(+) > > diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c > index a8fd90480a..9093e98841 100644 > --- a/hw/block/vhost-user-blk.c > +++ b/hw/block/vhost-user-blk.c > @@ -377,6 +377,7 @@ static int vhost_user_blk_init(DeviceState *dev, bool connect, Error **errp) > vhost_dev_set_config_notifier(&s->dev, &blk_ops); > > s->vhost_user.supports_config = true; > + s->vhost_user.supports_inflight_migration = s->inflight_migration; > ret = vhost_dev_init(&s->dev, &s->vhost_user, VHOST_BACKEND_TYPE_USER, 0, > false, errp); > if (ret < 0) { > @@ -656,6 +657,27 @@ static struct vhost_dev *vhost_user_blk_get_vhost(VirtIODevice *vdev) > return &s->dev; > } > > +static bool vhost_user_blk_inflight_needed(void *opaque) > +{ > + struct VHostUserBlk *s = opaque; > + > + bool inflight_migration = vhost_dev_has_feature(&s->dev, > + VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT); > + > + return inflight_migration && > + !migrate_local_vhost_user_blk(); Here's the spot that should depend on migrate_local_vhost_user_blk() from Vladimilr's RFC patch (again, likely to be renamed..). Btw, is this check correct against "!migrate_local_vhost_user_blk()"? I was expecting the feature off only if local=on, so I expect it to be: return inflight_migration && migrate_local_vhost_user_blk(); ? > +} > + > +static const VMStateDescription vmstate_vhost_user_blk_inflight = { > + .name = "vhost-user-blk/inflight", > + .version_id = 1, > + .needed = vhost_user_blk_inflight_needed, > + .fields = (const VMStateField[]) { > + VMSTATE_VHOST_INFLIGHT_REGION(inflight, VHostUserBlk), One other trivial nitpick while glimpsing over the patch: should we move the macro definition from previous patch to this one, where it is used? > + VMSTATE_END_OF_LIST() > + }, > +}; > + > static bool vhost_user_blk_pre_incoming(void *opaque, Error **errp) > { > VHostUserBlk *s = VHOST_USER_BLK(opaque); > @@ -678,6 +700,10 @@ static const VMStateDescription vmstate_vhost_user_blk = { > VMSTATE_VIRTIO_DEVICE, > VMSTATE_END_OF_LIST() > }, > + .subsections = (const VMStateDescription * const []) { > + &vmstate_vhost_user_blk_inflight, > + NULL > + } > }; > > static bool vhost_user_needed(void *opaque) > @@ -751,6 +777,8 @@ static const Property vhost_user_blk_properties[] = { > 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), > + DEFINE_PROP_BOOL("inflight-migration", VHostUserBlk, > + inflight_migration, 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 b06f55fd6f..e1466e5cf6 100644 > --- a/include/hw/virtio/vhost-user-blk.h > +++ b/include/hw/virtio/vhost-user-blk.h > @@ -52,6 +52,7 @@ struct VHostUserBlk { > bool started_vu; > > bool skip_get_vring_base_on_force_shutdown; > + bool inflight_migration; > > bool incoming_backend; > }; > -- > 2.34.1 > -- Peter Xu