[PATCH v6 4/6] vhost-user-blk: make inflight-migration prop mutable on running vm
Alexandr Moshkov <[email protected]> Mon, 3 Aug 2026 12:28:51 +0500
| Newsgroups | dev.linux.lists.virtio-fs,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
The inflight-migration property currently can only be set before the device is realized. This makes it impossible to disable inflight migration at runtime without restarting the VM. Make the property mutable, but only while the VM is running. Blocking changes when the VM is not running ensures that the value at stop time reliably reflects the intent set on a live VM, which allows vhost_user_blk_stop() to use skip_drain unconditionally based on the property value without inspecting migration runstate. Signed-off-by: Alexandr Moshkov <[email protected]> --- hw/block/vhost-user-blk.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c index e3b873af7c..1aec3004de 100644 --- a/hw/block/vhost-user-blk.c +++ b/hw/block/vhost-user-blk.c @@ -619,6 +619,8 @@ static const VMStateDescription vmstate_vhost_user_blk = { } }; +static PropertyInfo vhost_user_blk_inflight_migration_prop; + static const Property vhost_user_blk_properties[] = { DEFINE_PROP_CHR("chardev", VHostUserBlk, chardev), DEFINE_PROP_UINT16("num-queues", VHostUserBlk, num_queues, @@ -632,8 +634,9 @@ 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), + DEFINE_PROP("inflight-migration", VHostUserBlk, inflight_migration, + vhost_user_blk_inflight_migration_prop, bool, + .set_default = true, .defval.u = false), }; static void vhost_user_blk_class_init(ObjectClass *klass, const void *data) @@ -663,8 +666,29 @@ static const TypeInfo vhost_user_blk_info = { .class_init = vhost_user_blk_class_init, }; +static void vhost_user_blk_set_inflight_migration(Object *obj, Visitor *v, + const char *name, + void *opaque, Error **errp) +{ + DeviceState *dev = DEVICE(obj); + + if (dev->realized && !runstate_is_running()) { + error_setg(errp, "Property '%s' cannot be changed " + "while VM is not running", name); + return; + } + + qdev_prop_bool.set(obj, v, name, opaque, errp); +} + + static void virtio_register_types(void) { + vhost_user_blk_inflight_migration_prop = qdev_prop_bool; + vhost_user_blk_inflight_migration_prop.realized_set_allowed = true; + vhost_user_blk_inflight_migration_prop.set = + vhost_user_blk_set_inflight_migration; + type_register_static(&vhost_user_blk_info); } -- 2.34.1