* [PATCH 0/4] vhost-user-blk: fix compatibility with older qemu versions
@ 2026-02-24 7:50 Alexandr Moshkov
2026-02-24 7:50 ` [PATCH 1/4] vhost-user.rst: fix typo Alexandr Moshkov
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: Alexandr Moshkov @ 2026-02-24 7:50 UTC (permalink / raw)
To: qemu-devel
Cc: Raphael Norwitz, virtio-fs, Milan Zamazal, Stefan Hajnoczi,
Michael S. Tsirkin, Jason Wang, zhenwei pi, Gonglei (Arei),
Pierrick Bouvier, Kevin Wolf, Hanna Reitz, Alex Bennée,
Paolo Bonzini, Stefano Garzarella, Fam Zheng, qemu-block,
Alexandr Moshkov
This is a small continuation of my series about inflight migration for vhost-user-blk.
This series is designed to solve the problem of compatibility with older versions of qemu, where this feature has not yet been introduced (for example, if we want to downgrade versions due to some problems).
In the current version for vhost-user-blk, this feature is enabled using the parameter and further migration of the inflight region will depend on whether the vhost-user has accepted the new protocol feature or not. This creates an inconvenient dependency, because there is no way to disable this feature without reconnecting to the backend.
This series slightly changes the semantics of the introduced protocol feature VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT. Enabling this feature adds a new parameter for GET_VRING_BASE message - skip_drain, which allows to control drain in-flight requests on the backend.
Thus, user can enable or disable inflight-migration param for vhost-user-blk to maintain compatibility with older versions of QEMU.
Alexandr Moshkov (4):
vhost-user.rst: fix typo
vhost-user: add skip_drain param to GET_VRING_BASE
vhost-user: remove supports_inflight_migration
vhost-user-blk: make inflight migration throught skip_drain
backends/cryptodev-vhost.c | 2 +-
backends/vhost-user.c | 2 +-
docs/interop/vhost-user.rst | 5 +++--
hw/block/vhost-user-blk.c | 26 ++++++++++++++------------
hw/net/vhost_net.c | 9 +++++----
hw/scsi/vhost-scsi-common.c | 2 +-
hw/virtio/vdpa-dev.c | 2 +-
hw/virtio/vhost-user-base.c | 2 +-
hw/virtio/vhost-user-fs.c | 2 +-
hw/virtio/vhost-user-scmi.c | 2 +-
hw/virtio/vhost-user.c | 3 +--
hw/virtio/vhost-vsock-common.c | 2 +-
hw/virtio/vhost.c | 24 +++++++++++++++---------
include/hw/virtio/vhost-user.h | 1 -
include/hw/virtio/vhost.h | 7 +++++--
15 files changed, 51 insertions(+), 40 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH 1/4] vhost-user.rst: fix typo 2026-02-24 7:50 [PATCH 0/4] vhost-user-blk: fix compatibility with older qemu versions Alexandr Moshkov @ 2026-02-24 7:50 ` Alexandr Moshkov 2026-02-25 13:05 ` Stefan Hajnoczi 2026-02-24 7:50 ` [PATCH 2/4] vhost-user: add skip_drain param to GET_VRING_BASE Alexandr Moshkov ` (2 subsequent siblings) 3 siblings, 1 reply; 11+ messages in thread From: Alexandr Moshkov @ 2026-02-24 7:50 UTC (permalink / raw) To: qemu-devel Cc: Raphael Norwitz, virtio-fs, Milan Zamazal, Stefan Hajnoczi, Michael S. Tsirkin, Jason Wang, zhenwei pi, Gonglei (Arei), Pierrick Bouvier, Kevin Wolf, Hanna Reitz, Alex Bennée, Paolo Bonzini, Stefano Garzarella, Fam Zheng, qemu-block, Alexandr Moshkov Signed-off-by: Alexandr Moshkov <dtalexundeer@yandex-team.ru> --- docs/interop/vhost-user.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/interop/vhost-user.rst b/docs/interop/vhost-user.rst index 137c9f3669..bfa75ff9a3 100644 --- a/docs/interop/vhost-user.rst +++ b/docs/interop/vhost-user.rst @@ -1268,7 +1268,7 @@ Front-end message types How to suspend an in-flight request depends on the implementation of the back-end but it typically can be done by aborting or cancelling the underlying I/O request. The ``VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT`` - protocol feature must only be neogotiated if + protocol feature must only be negotiated if ``VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD`` is also negotiated. ``VHOST_USER_SET_VRING_KICK`` -- 2.34.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 1/4] vhost-user.rst: fix typo 2026-02-24 7:50 ` [PATCH 1/4] vhost-user.rst: fix typo Alexandr Moshkov @ 2026-02-25 13:05 ` Stefan Hajnoczi 0 siblings, 0 replies; 11+ messages in thread From: Stefan Hajnoczi @ 2026-02-25 13:05 UTC (permalink / raw) To: Alexandr Moshkov Cc: qemu-devel, Raphael Norwitz, virtio-fs, Milan Zamazal, Michael S. Tsirkin, Jason Wang, zhenwei pi, Gonglei (Arei), Pierrick Bouvier, Kevin Wolf, Hanna Reitz, Alex Bennée, Paolo Bonzini, Stefano Garzarella, Fam Zheng, qemu-block [-- Attachment #1: Type: text/plain, Size: 275 bytes --] On Tue, Feb 24, 2026 at 12:50:52PM +0500, Alexandr Moshkov wrote: > Signed-off-by: Alexandr Moshkov <dtalexundeer@yandex-team.ru> > --- > docs/interop/vhost-user.rst | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 2/4] vhost-user: add skip_drain param to GET_VRING_BASE 2026-02-24 7:50 [PATCH 0/4] vhost-user-blk: fix compatibility with older qemu versions Alexandr Moshkov 2026-02-24 7:50 ` [PATCH 1/4] vhost-user.rst: fix typo Alexandr Moshkov @ 2026-02-24 7:50 ` Alexandr Moshkov 2026-03-01 23:34 ` Stefan Hajnoczi 2026-03-05 9:26 ` Vladimir Sementsov-Ogievskiy 2026-02-24 7:50 ` [PATCH 3/4] vhost-user: remove supports_inflight_migration Alexandr Moshkov 2026-02-24 7:50 ` [PATCH 4/4] vhost-user-blk: make inflight migration throught skip_drain Alexandr Moshkov 3 siblings, 2 replies; 11+ messages in thread From: Alexandr Moshkov @ 2026-02-24 7:50 UTC (permalink / raw) To: qemu-devel Cc: Raphael Norwitz, virtio-fs, Milan Zamazal, Stefan Hajnoczi, Michael S. Tsirkin, Jason Wang, zhenwei pi, Gonglei (Arei), Pierrick Bouvier, Kevin Wolf, Hanna Reitz, Alex Bennée, Paolo Bonzini, Stefano Garzarella, Fam Zheng, qemu-block, Alexandr Moshkov In case of migration of QEMU from the new version (where the inllight-migration parameter is present), to the old one (where it is absent) there is no way to disable this feature on the backend during runtime. This commit slightly changes the semantics of the protocol feature VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT. Enabling this feature adds a new parameter for GET_VRING_BASE, which allows to control the drain in-flight requests on the backend. Thus, QEMU will be able to turn this feature on GET_VRING_BASE off and on anytime. Signed-off-by: Alexandr Moshkov <dtalexundeer@yandex-team.ru> --- backends/cryptodev-vhost.c | 2 +- backends/vhost-user.c | 2 +- docs/interop/vhost-user.rst | 3 ++- hw/block/vhost-user-blk.c | 2 +- hw/net/vhost_net.c | 9 +++++---- hw/scsi/vhost-scsi-common.c | 2 +- hw/virtio/vdpa-dev.c | 2 +- hw/virtio/vhost-user-base.c | 2 +- hw/virtio/vhost-user-fs.c | 2 +- hw/virtio/vhost-user-scmi.c | 2 +- hw/virtio/vhost-vsock-common.c | 2 +- hw/virtio/vhost.c | 24 +++++++++++++++--------- include/hw/virtio/vhost.h | 7 +++++-- 13 files changed, 36 insertions(+), 25 deletions(-) diff --git a/backends/cryptodev-vhost.c b/backends/cryptodev-vhost.c index 943680a23a..7a457380d0 100644 --- a/backends/cryptodev-vhost.c +++ b/backends/cryptodev-vhost.c @@ -110,7 +110,7 @@ static void cryptodev_vhost_stop_one(CryptoDevBackendVhost *crypto, VirtIODevice *dev) { - vhost_dev_stop(&crypto->dev, dev, false); + vhost_dev_stop(&crypto->dev, dev, false, false); vhost_dev_disable_notifiers(&crypto->dev, dev); } diff --git a/backends/vhost-user.c b/backends/vhost-user.c index 42845329e7..10be713ebd 100644 --- a/backends/vhost-user.c +++ b/backends/vhost-user.c @@ -108,7 +108,7 @@ vhost_user_backend_stop(VhostUserBackend *b) return 0; } - ret = vhost_dev_stop(&b->dev, b->vdev, true); + ret = vhost_dev_stop(&b->dev, b->vdev, true, false); if (k->set_guest_notifiers && k->set_guest_notifiers(qbus->parent, b->dev.nvqs, false) < 0) { diff --git a/docs/interop/vhost-user.rst b/docs/interop/vhost-user.rst index bfa75ff9a3..5b944322b4 100644 --- a/docs/interop/vhost-user.rst +++ b/docs/interop/vhost-user.rst @@ -1262,7 +1262,8 @@ Front-end message types specified vring before stopping it. If the ``VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT`` protocol - feature has been negotiated, the back-end may suspend in-flight I/O + feature has been negotiated, using request payload's *num* field, + when num is set to 1, QEMU can tell the back-end to suspend in-flight I/O requests and record them as described in :ref:`Inflight I/O tracking <inflight_io_tracking>` instead of completing them before stopping the vring. How to suspend an in-flight request depends on the implementation of the back-end diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c index c151e83677..7f2067d6cf 100644 --- a/hw/block/vhost-user-blk.c +++ b/hw/block/vhost-user-blk.c @@ -225,7 +225,7 @@ static int vhost_user_blk_stop(VirtIODevice *vdev) qemu_force_shutdown_requested(); ret = force_stop ? vhost_dev_force_stop(&s->dev, vdev, true) : - vhost_dev_stop(&s->dev, vdev, true); + vhost_dev_stop(&s->dev, vdev, true, false); if (k->set_guest_notifiers(qbus->parent, s->dev.nvqs, false) < 0) { error_report("vhost guest notifier cleanup failed: %d", ret); diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index a8ee18a912..604f19e03a 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -384,7 +384,7 @@ fail: if (net->nc->info->poll) { net->nc->info->poll(net->nc, true); } - vhost_dev_stop(&net->dev, dev, false); + vhost_dev_stop(&net->dev, dev, false, false); fail_start: return r; } @@ -403,7 +403,7 @@ static void vhost_net_stop_one(struct vhost_net *net, if (net->nc->info->poll) { net->nc->info->poll(net->nc, true); } - vhost_dev_stop(&net->dev, dev, false); + vhost_dev_stop(&net->dev, dev, false, false); if (net->nc->info->stop) { net->nc->info->stop(net->nc); } @@ -641,7 +641,8 @@ void vhost_net_virtqueue_reset(VirtIODevice *vdev, NetClientState *nc, vhost_virtqueue_stop(&net->dev, vdev, net->dev.vqs + idx, - net->dev.vq_index + idx); + net->dev.vq_index + idx, + false); } int vhost_net_virtqueue_restart(VirtIODevice *vdev, NetClientState *nc, @@ -691,7 +692,7 @@ err_start: assert(ret >= 0); } - vhost_dev_stop(&net->dev, vdev, false); + vhost_dev_stop(&net->dev, vdev, false, false); return r; } diff --git a/hw/scsi/vhost-scsi-common.c b/hw/scsi/vhost-scsi-common.c index 0bb4305de6..41c1e45aac 100644 --- a/hw/scsi/vhost-scsi-common.c +++ b/hw/scsi/vhost-scsi-common.c @@ -108,7 +108,7 @@ int vhost_scsi_common_stop(VHostSCSICommon *vsc) VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus); int ret = 0; - ret = vhost_dev_stop(&vsc->dev, vdev, true); + ret = vhost_dev_stop(&vsc->dev, vdev, true, false); if (k->set_guest_notifiers) { int r = k->set_guest_notifiers(qbus->parent, vsc->dev.nvqs, false); diff --git a/hw/virtio/vdpa-dev.c b/hw/virtio/vdpa-dev.c index 4532d63653..7279f18442 100644 --- a/hw/virtio/vdpa-dev.c +++ b/hw/virtio/vdpa-dev.c @@ -301,7 +301,7 @@ static void vhost_vdpa_device_stop(VirtIODevice *vdev) return; } - vhost_dev_stop(&s->dev, vdev, false); + vhost_dev_stop(&s->dev, vdev, false, false); ret = k->set_guest_notifiers(qbus->parent, s->dev.nvqs, false); if (ret < 0) { diff --git a/hw/virtio/vhost-user-base.c b/hw/virtio/vhost-user-base.c index 01ab9ca56b..9d3875a04b 100644 --- a/hw/virtio/vhost-user-base.c +++ b/hw/virtio/vhost-user-base.c @@ -77,7 +77,7 @@ static int vub_stop(VirtIODevice *vdev) return 0; } - ret = vhost_dev_stop(&vub->vhost_dev, vdev, true); + ret = vhost_dev_stop(&vub->vhost_dev, vdev, true, false); if (k->set_guest_notifiers(qbus->parent, vub->vhost_dev.nvqs, false) < 0) { error_report("vhost guest notifier cleanup failed: %d", ret); diff --git a/hw/virtio/vhost-user-fs.c b/hw/virtio/vhost-user-fs.c index ad6fcacf06..2f6f6df67f 100644 --- a/hw/virtio/vhost-user-fs.c +++ b/hw/virtio/vhost-user-fs.c @@ -111,7 +111,7 @@ static int vuf_stop(VirtIODevice *vdev) return 0; } - ret = vhost_dev_stop(&fs->vhost_dev, vdev, true); + ret = vhost_dev_stop(&fs->vhost_dev, vdev, true, false); if (k->set_guest_notifiers(qbus->parent, fs->vhost_dev.nvqs, false) < 0) { error_report("vhost guest notifier cleanup failed: %d", ret); diff --git a/hw/virtio/vhost-user-scmi.c b/hw/virtio/vhost-user-scmi.c index f9264c4374..dbde342a6e 100644 --- a/hw/virtio/vhost-user-scmi.c +++ b/hw/virtio/vhost-user-scmi.c @@ -101,7 +101,7 @@ static int vu_scmi_stop(VirtIODevice *vdev) return 0; } - ret = vhost_dev_stop(vhost_dev, vdev, true); + ret = vhost_dev_stop(vhost_dev, vdev, true, false); if (k->set_guest_notifiers(qbus->parent, vhost_dev->nvqs, false) < 0) { error_report("vhost guest notifier cleanup failed: %d", ret); diff --git a/hw/virtio/vhost-vsock-common.c b/hw/virtio/vhost-vsock-common.c index b33def900a..3d086ed825 100644 --- a/hw/virtio/vhost-vsock-common.c +++ b/hw/virtio/vhost-vsock-common.c @@ -106,7 +106,7 @@ int vhost_vsock_common_stop(VirtIODevice *vdev) return 0; } - ret = vhost_dev_stop(&vvc->vhost_dev, vdev, true); + ret = vhost_dev_stop(&vvc->vhost_dev, vdev, true, false); if (k->set_guest_notifiers(qbus->parent, vvc->vhost_dev.nvqs, false) < 0) { error_report("vhost guest notifier cleanup failed: %d", ret); diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index b4cdb7762f..c04bb53159 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -1387,11 +1387,13 @@ fail_alloc_desc: static int do_vhost_virtqueue_stop(struct vhost_dev *dev, struct VirtIODevice *vdev, struct vhost_virtqueue *vq, - unsigned idx, bool force) + unsigned idx, bool force, + bool skip_drain) { int vhost_vq_index = dev->vhost_ops->vhost_get_vq_index(dev, idx); struct vhost_vring_state state = { .index = vhost_vq_index, + .num = skip_drain, }; int r = 0; @@ -1439,9 +1441,10 @@ static int do_vhost_virtqueue_stop(struct vhost_dev *dev, int vhost_virtqueue_stop(struct vhost_dev *dev, struct VirtIODevice *vdev, struct vhost_virtqueue *vq, - unsigned idx) + unsigned idx, + bool skip_drain) { - return do_vhost_virtqueue_stop(dev, vdev, vq, idx, false); + return do_vhost_virtqueue_stop(dev, vdev, vq, idx, false, skip_drain); } static int vhost_virtqueue_set_busyloop_timeout(struct vhost_dev *dev, @@ -2220,7 +2223,8 @@ fail_vq: vhost_virtqueue_stop(hdev, vdev, hdev->vqs + i, - hdev->vq_index + i); + hdev->vq_index + i, + false); } fail_mem: @@ -2235,7 +2239,7 @@ fail_features: /* Host notifiers must be enabled at this point. */ static int do_vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, - bool vrings, bool force) + bool vrings, bool force, bool skip_drain) { int i; int rc = 0; @@ -2262,7 +2266,8 @@ static int do_vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, vdev, hdev->vqs + i, hdev->vq_index + i, - force); + force, + skip_drain); } if (hdev->vhost_ops->vhost_reset_status) { hdev->vhost_ops->vhost_reset_status(hdev); @@ -2282,15 +2287,16 @@ static int do_vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, return rc; } -int vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings) +int vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings, + bool skip_drain) { - return do_vhost_dev_stop(hdev, vdev, vrings, false); + return do_vhost_dev_stop(hdev, vdev, vrings, false, skip_drain); } int vhost_dev_force_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings) { - return do_vhost_dev_stop(hdev, vdev, vrings, true); + return do_vhost_dev_stop(hdev, vdev, vrings, true, false); } int vhost_net_set_backend(struct vhost_dev *hdev, diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h index 89817bd848..3881f6784b 100644 --- a/include/hw/virtio/vhost.h +++ b/include/hw/virtio/vhost.h @@ -233,6 +233,7 @@ int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings); * @hdev: common vhost_dev structure * @vdev: the VirtIODevice structure * @vrings: true to have vrings disabled in this call + * @skip_drain: true to notice back-end to skip draining all in-flight requests * * Stop the vhost device. After the device is stopped the notifiers * can be disabled (@vhost_dev_disable_notifiers) and the device can @@ -240,7 +241,8 @@ int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings); * * Return: 0 on success, != 0 on error when stopping dev. */ -int vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings); +int vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings, + bool skip_drain); /** * vhost_dev_force_stop() - force stop the vhost device @@ -398,7 +400,8 @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write); int vhost_virtqueue_start(struct vhost_dev *dev, struct VirtIODevice *vdev, struct vhost_virtqueue *vq, unsigned idx); int vhost_virtqueue_stop(struct vhost_dev *dev, struct VirtIODevice *vdev, - struct vhost_virtqueue *vq, unsigned idx); + struct vhost_virtqueue *vq, unsigned idx, + bool skip_drain); void vhost_dev_reset_inflight(struct vhost_inflight *inflight); void vhost_dev_free_inflight(struct vhost_inflight *inflight); -- 2.34.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 2/4] vhost-user: add skip_drain param to GET_VRING_BASE 2026-02-24 7:50 ` [PATCH 2/4] vhost-user: add skip_drain param to GET_VRING_BASE Alexandr Moshkov @ 2026-03-01 23:34 ` Stefan Hajnoczi 2026-03-02 7:12 ` Alexandr Moshkov 2026-03-05 9:26 ` Vladimir Sementsov-Ogievskiy 1 sibling, 1 reply; 11+ messages in thread From: Stefan Hajnoczi @ 2026-03-01 23:34 UTC (permalink / raw) To: Alexandr Moshkov Cc: qemu-devel, Raphael Norwitz, virtio-fs, Milan Zamazal, Michael S. Tsirkin, Jason Wang, zhenwei pi, Gonglei (Arei), Pierrick Bouvier, Kevin Wolf, Hanna Reitz, Alex Bennée, Paolo Bonzini, Stefano Garzarella, Fam Zheng, qemu-block [-- Attachment #1: Type: text/plain, Size: 14028 bytes --] On Tue, Feb 24, 2026 at 12:50:53PM +0500, Alexandr Moshkov wrote: > In case of migration of QEMU from the new version (where the > inllight-migration parameter is present), to the old one (where it is > absent) there is no way to disable this feature on the backend during > runtime. > > This commit slightly changes the semantics of the protocol feature > VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT. Enabling this feature > adds a new parameter for GET_VRING_BASE, which allows to control the > drain in-flight requests on the backend. > Thus, QEMU will be able to turn this feature on GET_VRING_BASE off and > on anytime. > > Signed-off-by: Alexandr Moshkov <dtalexundeer@yandex-team.ru> > --- > backends/cryptodev-vhost.c | 2 +- > backends/vhost-user.c | 2 +- > docs/interop/vhost-user.rst | 3 ++- > hw/block/vhost-user-blk.c | 2 +- > hw/net/vhost_net.c | 9 +++++---- > hw/scsi/vhost-scsi-common.c | 2 +- > hw/virtio/vdpa-dev.c | 2 +- > hw/virtio/vhost-user-base.c | 2 +- > hw/virtio/vhost-user-fs.c | 2 +- > hw/virtio/vhost-user-scmi.c | 2 +- > hw/virtio/vhost-vsock-common.c | 2 +- > hw/virtio/vhost.c | 24 +++++++++++++++--------- > include/hw/virtio/vhost.h | 7 +++++-- > 13 files changed, 36 insertions(+), 25 deletions(-) > > diff --git a/backends/cryptodev-vhost.c b/backends/cryptodev-vhost.c > index 943680a23a..7a457380d0 100644 > --- a/backends/cryptodev-vhost.c > +++ b/backends/cryptodev-vhost.c > @@ -110,7 +110,7 @@ static void > cryptodev_vhost_stop_one(CryptoDevBackendVhost *crypto, > VirtIODevice *dev) > { > - vhost_dev_stop(&crypto->dev, dev, false); > + vhost_dev_stop(&crypto->dev, dev, false, false); > vhost_dev_disable_notifiers(&crypto->dev, dev); > } > > diff --git a/backends/vhost-user.c b/backends/vhost-user.c > index 42845329e7..10be713ebd 100644 > --- a/backends/vhost-user.c > +++ b/backends/vhost-user.c > @@ -108,7 +108,7 @@ vhost_user_backend_stop(VhostUserBackend *b) > return 0; > } > > - ret = vhost_dev_stop(&b->dev, b->vdev, true); > + ret = vhost_dev_stop(&b->dev, b->vdev, true, false); > > if (k->set_guest_notifiers && > k->set_guest_notifiers(qbus->parent, b->dev.nvqs, false) < 0) { > diff --git a/docs/interop/vhost-user.rst b/docs/interop/vhost-user.rst > index bfa75ff9a3..5b944322b4 100644 > --- a/docs/interop/vhost-user.rst > +++ b/docs/interop/vhost-user.rst > @@ -1262,7 +1262,8 @@ Front-end message types > specified vring before stopping it. > > If the ``VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT`` protocol > - feature has been negotiated, the back-end may suspend in-flight I/O > + feature has been negotiated, using request payload's *num* field, > + when num is set to 1, QEMU can tell the back-end to suspend in-flight I/O This changes the behavior of an existing feature bit. How can the front-end detect that the back-end supports this new behavior? > requests and record them as described in :ref:`Inflight I/O tracking > <inflight_io_tracking>` instead of completing them before stopping the vring. > How to suspend an in-flight request depends on the implementation of the back-end > diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c > index c151e83677..7f2067d6cf 100644 > --- a/hw/block/vhost-user-blk.c > +++ b/hw/block/vhost-user-blk.c > @@ -225,7 +225,7 @@ static int vhost_user_blk_stop(VirtIODevice *vdev) > qemu_force_shutdown_requested(); > > ret = force_stop ? vhost_dev_force_stop(&s->dev, vdev, true) : > - vhost_dev_stop(&s->dev, vdev, true); > + vhost_dev_stop(&s->dev, vdev, true, false); > > if (k->set_guest_notifiers(qbus->parent, s->dev.nvqs, false) < 0) { > error_report("vhost guest notifier cleanup failed: %d", ret); > diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c > index a8ee18a912..604f19e03a 100644 > --- a/hw/net/vhost_net.c > +++ b/hw/net/vhost_net.c > @@ -384,7 +384,7 @@ fail: > if (net->nc->info->poll) { > net->nc->info->poll(net->nc, true); > } > - vhost_dev_stop(&net->dev, dev, false); > + vhost_dev_stop(&net->dev, dev, false, false); > fail_start: > return r; > } > @@ -403,7 +403,7 @@ static void vhost_net_stop_one(struct vhost_net *net, > if (net->nc->info->poll) { > net->nc->info->poll(net->nc, true); > } > - vhost_dev_stop(&net->dev, dev, false); > + vhost_dev_stop(&net->dev, dev, false, false); > if (net->nc->info->stop) { > net->nc->info->stop(net->nc); > } > @@ -641,7 +641,8 @@ void vhost_net_virtqueue_reset(VirtIODevice *vdev, NetClientState *nc, > vhost_virtqueue_stop(&net->dev, > vdev, > net->dev.vqs + idx, > - net->dev.vq_index + idx); > + net->dev.vq_index + idx, > + false); > } > > int vhost_net_virtqueue_restart(VirtIODevice *vdev, NetClientState *nc, > @@ -691,7 +692,7 @@ err_start: > assert(ret >= 0); > } > > - vhost_dev_stop(&net->dev, vdev, false); > + vhost_dev_stop(&net->dev, vdev, false, false); > > return r; > } > diff --git a/hw/scsi/vhost-scsi-common.c b/hw/scsi/vhost-scsi-common.c > index 0bb4305de6..41c1e45aac 100644 > --- a/hw/scsi/vhost-scsi-common.c > +++ b/hw/scsi/vhost-scsi-common.c > @@ -108,7 +108,7 @@ int vhost_scsi_common_stop(VHostSCSICommon *vsc) > VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus); > int ret = 0; > > - ret = vhost_dev_stop(&vsc->dev, vdev, true); > + ret = vhost_dev_stop(&vsc->dev, vdev, true, false); > > if (k->set_guest_notifiers) { > int r = k->set_guest_notifiers(qbus->parent, vsc->dev.nvqs, false); > diff --git a/hw/virtio/vdpa-dev.c b/hw/virtio/vdpa-dev.c > index 4532d63653..7279f18442 100644 > --- a/hw/virtio/vdpa-dev.c > +++ b/hw/virtio/vdpa-dev.c > @@ -301,7 +301,7 @@ static void vhost_vdpa_device_stop(VirtIODevice *vdev) > return; > } > > - vhost_dev_stop(&s->dev, vdev, false); > + vhost_dev_stop(&s->dev, vdev, false, false); > > ret = k->set_guest_notifiers(qbus->parent, s->dev.nvqs, false); > if (ret < 0) { > diff --git a/hw/virtio/vhost-user-base.c b/hw/virtio/vhost-user-base.c > index 01ab9ca56b..9d3875a04b 100644 > --- a/hw/virtio/vhost-user-base.c > +++ b/hw/virtio/vhost-user-base.c > @@ -77,7 +77,7 @@ static int vub_stop(VirtIODevice *vdev) > return 0; > } > > - ret = vhost_dev_stop(&vub->vhost_dev, vdev, true); > + ret = vhost_dev_stop(&vub->vhost_dev, vdev, true, false); > > if (k->set_guest_notifiers(qbus->parent, vub->vhost_dev.nvqs, false) < 0) { > error_report("vhost guest notifier cleanup failed: %d", ret); > diff --git a/hw/virtio/vhost-user-fs.c b/hw/virtio/vhost-user-fs.c > index ad6fcacf06..2f6f6df67f 100644 > --- a/hw/virtio/vhost-user-fs.c > +++ b/hw/virtio/vhost-user-fs.c > @@ -111,7 +111,7 @@ static int vuf_stop(VirtIODevice *vdev) > return 0; > } > > - ret = vhost_dev_stop(&fs->vhost_dev, vdev, true); > + ret = vhost_dev_stop(&fs->vhost_dev, vdev, true, false); > > if (k->set_guest_notifiers(qbus->parent, fs->vhost_dev.nvqs, false) < 0) { > error_report("vhost guest notifier cleanup failed: %d", ret); > diff --git a/hw/virtio/vhost-user-scmi.c b/hw/virtio/vhost-user-scmi.c > index f9264c4374..dbde342a6e 100644 > --- a/hw/virtio/vhost-user-scmi.c > +++ b/hw/virtio/vhost-user-scmi.c > @@ -101,7 +101,7 @@ static int vu_scmi_stop(VirtIODevice *vdev) > return 0; > } > > - ret = vhost_dev_stop(vhost_dev, vdev, true); > + ret = vhost_dev_stop(vhost_dev, vdev, true, false); > > if (k->set_guest_notifiers(qbus->parent, vhost_dev->nvqs, false) < 0) { > error_report("vhost guest notifier cleanup failed: %d", ret); > diff --git a/hw/virtio/vhost-vsock-common.c b/hw/virtio/vhost-vsock-common.c > index b33def900a..3d086ed825 100644 > --- a/hw/virtio/vhost-vsock-common.c > +++ b/hw/virtio/vhost-vsock-common.c > @@ -106,7 +106,7 @@ int vhost_vsock_common_stop(VirtIODevice *vdev) > return 0; > } > > - ret = vhost_dev_stop(&vvc->vhost_dev, vdev, true); > + ret = vhost_dev_stop(&vvc->vhost_dev, vdev, true, false); > > if (k->set_guest_notifiers(qbus->parent, vvc->vhost_dev.nvqs, false) < 0) { > error_report("vhost guest notifier cleanup failed: %d", ret); > diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c > index b4cdb7762f..c04bb53159 100644 > --- a/hw/virtio/vhost.c > +++ b/hw/virtio/vhost.c > @@ -1387,11 +1387,13 @@ fail_alloc_desc: > static int do_vhost_virtqueue_stop(struct vhost_dev *dev, > struct VirtIODevice *vdev, > struct vhost_virtqueue *vq, > - unsigned idx, bool force) > + unsigned idx, bool force, > + bool skip_drain) > { > int vhost_vq_index = dev->vhost_ops->vhost_get_vq_index(dev, idx); > struct vhost_vring_state state = { > .index = vhost_vq_index, > + .num = skip_drain, > }; > int r = 0; > > @@ -1439,9 +1441,10 @@ static int do_vhost_virtqueue_stop(struct vhost_dev *dev, > int vhost_virtqueue_stop(struct vhost_dev *dev, > struct VirtIODevice *vdev, > struct vhost_virtqueue *vq, > - unsigned idx) > + unsigned idx, > + bool skip_drain) > { > - return do_vhost_virtqueue_stop(dev, vdev, vq, idx, false); > + return do_vhost_virtqueue_stop(dev, vdev, vq, idx, false, skip_drain); > } > > static int vhost_virtqueue_set_busyloop_timeout(struct vhost_dev *dev, > @@ -2220,7 +2223,8 @@ fail_vq: > vhost_virtqueue_stop(hdev, > vdev, > hdev->vqs + i, > - hdev->vq_index + i); > + hdev->vq_index + i, > + false); > } > > fail_mem: > @@ -2235,7 +2239,7 @@ fail_features: > > /* Host notifiers must be enabled at this point. */ > static int do_vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, > - bool vrings, bool force) > + bool vrings, bool force, bool skip_drain) > { > int i; > int rc = 0; > @@ -2262,7 +2266,8 @@ static int do_vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, > vdev, > hdev->vqs + i, > hdev->vq_index + i, > - force); > + force, > + skip_drain); > } > if (hdev->vhost_ops->vhost_reset_status) { > hdev->vhost_ops->vhost_reset_status(hdev); > @@ -2282,15 +2287,16 @@ static int do_vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, > return rc; > } > > -int vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings) > +int vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings, > + bool skip_drain) > { > - return do_vhost_dev_stop(hdev, vdev, vrings, false); > + return do_vhost_dev_stop(hdev, vdev, vrings, false, skip_drain); > } > > int vhost_dev_force_stop(struct vhost_dev *hdev, VirtIODevice *vdev, > bool vrings) > { > - return do_vhost_dev_stop(hdev, vdev, vrings, true); > + return do_vhost_dev_stop(hdev, vdev, vrings, true, false); > } > > int vhost_net_set_backend(struct vhost_dev *hdev, > diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h > index 89817bd848..3881f6784b 100644 > --- a/include/hw/virtio/vhost.h > +++ b/include/hw/virtio/vhost.h > @@ -233,6 +233,7 @@ int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings); > * @hdev: common vhost_dev structure > * @vdev: the VirtIODevice structure > * @vrings: true to have vrings disabled in this call > + * @skip_drain: true to notice back-end to skip draining all in-flight requests > * > * Stop the vhost device. After the device is stopped the notifiers > * can be disabled (@vhost_dev_disable_notifiers) and the device can > @@ -240,7 +241,8 @@ int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings); > * > * Return: 0 on success, != 0 on error when stopping dev. > */ > -int vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings); > +int vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings, > + bool skip_drain); > > /** > * vhost_dev_force_stop() - force stop the vhost device > @@ -398,7 +400,8 @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write); > int vhost_virtqueue_start(struct vhost_dev *dev, struct VirtIODevice *vdev, > struct vhost_virtqueue *vq, unsigned idx); > int vhost_virtqueue_stop(struct vhost_dev *dev, struct VirtIODevice *vdev, > - struct vhost_virtqueue *vq, unsigned idx); > + struct vhost_virtqueue *vq, unsigned idx, > + bool skip_drain); > > void vhost_dev_reset_inflight(struct vhost_inflight *inflight); > void vhost_dev_free_inflight(struct vhost_inflight *inflight); > -- > 2.34.1 > [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/4] vhost-user: add skip_drain param to GET_VRING_BASE 2026-03-01 23:34 ` Stefan Hajnoczi @ 2026-03-02 7:12 ` Alexandr Moshkov 2026-03-03 8:45 ` Vladimir Sementsov-Ogievskiy 0 siblings, 1 reply; 11+ messages in thread From: Alexandr Moshkov @ 2026-03-02 7:12 UTC (permalink / raw) To: Stefan Hajnoczi Cc: qemu-devel, Raphael Norwitz, virtio-fs, Milan Zamazal, Michael S. Tsirkin, Jason Wang, zhenwei pi, Gonglei (Arei), Pierrick Bouvier, Kevin Wolf, Hanna Reitz, Alex Bennée, Paolo Bonzini, Stefano Garzarella, Fam Zheng, qemu-block [-- Attachment #1: Type: text/plain, Size: 3514 bytes --] On 3/2/26 04:34, Stefan Hajnoczi wrote: > On Tue, Feb 24, 2026 at 12:50:53PM +0500, Alexandr Moshkov wrote: >> In case of migration of QEMU from the new version (where the >> inllight-migration parameter is present), to the old one (where it is >> absent) there is no way to disable this feature on the backend during >> runtime. >> >> This commit slightly changes the semantics of the protocol feature >> VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT. Enabling this feature >> adds a new parameter for GET_VRING_BASE, which allows to control the >> drain in-flight requests on the backend. >> Thus, QEMU will be able to turn this feature on GET_VRING_BASE off and >> on anytime. >> >> Signed-off-by: Alexandr Moshkov<dtalexundeer@yandex-team.ru> >> --- >> backends/cryptodev-vhost.c | 2 +- >> backends/vhost-user.c | 2 +- >> docs/interop/vhost-user.rst | 3 ++- >> hw/block/vhost-user-blk.c | 2 +- >> hw/net/vhost_net.c | 9 +++++---- >> hw/scsi/vhost-scsi-common.c | 2 +- >> hw/virtio/vdpa-dev.c | 2 +- >> hw/virtio/vhost-user-base.c | 2 +- >> hw/virtio/vhost-user-fs.c | 2 +- >> hw/virtio/vhost-user-scmi.c | 2 +- >> hw/virtio/vhost-vsock-common.c | 2 +- >> hw/virtio/vhost.c | 24 +++++++++++++++--------- >> include/hw/virtio/vhost.h | 7 +++++-- >> 13 files changed, 36 insertions(+), 25 deletions(-) >> >> diff --git a/backends/cryptodev-vhost.c b/backends/cryptodev-vhost.c >> index 943680a23a..7a457380d0 100644 >> --- a/backends/cryptodev-vhost.c >> +++ b/backends/cryptodev-vhost.c >> @@ -110,7 +110,7 @@ static void >> cryptodev_vhost_stop_one(CryptoDevBackendVhost *crypto, >> VirtIODevice *dev) >> { >> - vhost_dev_stop(&crypto->dev, dev, false); >> + vhost_dev_stop(&crypto->dev, dev, false, false); >> vhost_dev_disable_notifiers(&crypto->dev, dev); >> } >> >> diff --git a/backends/vhost-user.c b/backends/vhost-user.c >> index 42845329e7..10be713ebd 100644 >> --- a/backends/vhost-user.c >> +++ b/backends/vhost-user.c >> @@ -108,7 +108,7 @@ vhost_user_backend_stop(VhostUserBackend *b) >> return 0; >> } >> >> - ret = vhost_dev_stop(&b->dev, b->vdev, true); >> + ret = vhost_dev_stop(&b->dev, b->vdev, true, false); >> >> if (k->set_guest_notifiers && >> k->set_guest_notifiers(qbus->parent, b->dev.nvqs, false) < 0) { >> diff --git a/docs/interop/vhost-user.rst b/docs/interop/vhost-user.rst >> index bfa75ff9a3..5b944322b4 100644 >> --- a/docs/interop/vhost-user.rst >> +++ b/docs/interop/vhost-user.rst >> @@ -1262,7 +1262,8 @@ Front-end message types >> specified vring before stopping it. >> >> If the ``VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT`` protocol >> - feature has been negotiated, the back-end may suspend in-flight I/O >> + feature has been negotiated, using request payload's *num* field, >> + when num is set to 1, QEMU can tell the back-end to suspend in-flight I/O > This changes the behavior of an existing feature bit. How can the > front-end detect that the back-end supports this new behavior? Thanks for reply! The protocol feature VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT was added by me about a month ago, so I decided to fix it instead of adding another one. It seemed to me to be the more correct solution, because it took a little time for someone to use it and adding a new "feature for a feature" looked too much for me. [-- Attachment #2: Type: text/html, Size: 4474 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/4] vhost-user: add skip_drain param to GET_VRING_BASE 2026-03-02 7:12 ` Alexandr Moshkov @ 2026-03-03 8:45 ` Vladimir Sementsov-Ogievskiy 0 siblings, 0 replies; 11+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2026-03-03 8:45 UTC (permalink / raw) To: Alexandr Moshkov, Stefan Hajnoczi Cc: qemu-devel, Raphael Norwitz, virtio-fs, Milan Zamazal, Michael S. Tsirkin, Jason Wang, zhenwei pi, Gonglei (Arei), Pierrick Bouvier, Kevin Wolf, Hanna Reitz, Alex Bennée, Paolo Bonzini, Stefano Garzarella, Fam Zheng, qemu-block On 02.03.26 10:12, Alexandr Moshkov wrote: > It seemed to me to be the more correct solution, because it took a little time for someone Moreover, it's not yet released. -- Best regards, Vladimir ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/4] vhost-user: add skip_drain param to GET_VRING_BASE 2026-02-24 7:50 ` [PATCH 2/4] vhost-user: add skip_drain param to GET_VRING_BASE Alexandr Moshkov 2026-03-01 23:34 ` Stefan Hajnoczi @ 2026-03-05 9:26 ` Vladimir Sementsov-Ogievskiy 1 sibling, 0 replies; 11+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2026-03-05 9:26 UTC (permalink / raw) To: Alexandr Moshkov, qemu-devel Cc: Raphael Norwitz, virtio-fs, Milan Zamazal, Stefan Hajnoczi, Michael S. Tsirkin, Jason Wang, zhenwei pi, Gonglei (Arei), Pierrick Bouvier, Kevin Wolf, Hanna Reitz, Alex Bennée, Paolo Bonzini, Stefano Garzarella, Fam Zheng, qemu-block On 24.02.26 10:50, Alexandr Moshkov wrote: > In case of migration of QEMU from the new version (where the > inllight-migration parameter is present), to the old one (where it is > absent) there is no way to disable this feature on the backend during > runtime. > > This commit slightly changes the semantics of the protocol feature > VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT. Enabling this feature > adds a new parameter for GET_VRING_BASE, which allows to control the > drain in-flight requests on the backend. > Thus, QEMU will be able to turn this feature on GET_VRING_BASE off and > on anytime. > > Signed-off-by: Alexandr Moshkov<dtalexundeer@yandex-team.ru> Let's split this commit, at least into two: 1. add additional vhost_dev_stop() parameter (most of this commit) 2. breaking changes for (not yet released) vhost-user protocol extension -- Best regards, Vladimir ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 3/4] vhost-user: remove supports_inflight_migration 2026-02-24 7:50 [PATCH 0/4] vhost-user-blk: fix compatibility with older qemu versions Alexandr Moshkov 2026-02-24 7:50 ` [PATCH 1/4] vhost-user.rst: fix typo Alexandr Moshkov 2026-02-24 7:50 ` [PATCH 2/4] vhost-user: add skip_drain param to GET_VRING_BASE Alexandr Moshkov @ 2026-02-24 7:50 ` Alexandr Moshkov 2026-02-24 7:50 ` [PATCH 4/4] vhost-user-blk: make inflight migration throught skip_drain Alexandr Moshkov 3 siblings, 0 replies; 11+ messages in thread From: Alexandr Moshkov @ 2026-02-24 7:50 UTC (permalink / raw) To: qemu-devel Cc: Raphael Norwitz, virtio-fs, Milan Zamazal, Stefan Hajnoczi, Michael S. Tsirkin, Jason Wang, zhenwei pi, Gonglei (Arei), Pierrick Bouvier, Kevin Wolf, Hanna Reitz, Alex Bennée, Paolo Bonzini, Stefano Garzarella, Fam Zheng, qemu-block, Alexandr Moshkov Now QEMU will always try to setup VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT protocol feature with backend. This will allow to use skip_drain parameter on GET_VRING_BASE message. Signed-off-by: Alexandr Moshkov <dtalexundeer@yandex-team.ru> --- hw/block/vhost-user-blk.c | 1 - hw/virtio/vhost-user.c | 3 +-- include/hw/virtio/vhost-user.h | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c index 7f2067d6cf..3421145f23 100644 --- a/hw/block/vhost-user-blk.c +++ b/hw/block/vhost-user-blk.c @@ -353,7 +353,6 @@ static int vhost_user_blk_connect(DeviceState *dev, 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, errp); if (ret < 0) { diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index bb8f8eab77..ed95ec7523 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -2225,8 +2225,7 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque, } } - if (!u->user->supports_inflight_migration || - !virtio_has_feature(protocol_features, + if (!virtio_has_feature(protocol_features, VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD)) { protocol_features &= ~(1ULL << VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT); diff --git a/include/hw/virtio/vhost-user.h b/include/hw/virtio/vhost-user.h index 53fe996686..c95bad5ddc 100644 --- a/include/hw/virtio/vhost-user.h +++ b/include/hw/virtio/vhost-user.h @@ -69,7 +69,6 @@ typedef struct VhostUserState { GPtrArray *notifiers; int memory_slots; bool supports_config; - bool supports_inflight_migration; } VhostUserState; /** -- 2.34.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 4/4] vhost-user-blk: make inflight migration throught skip_drain 2026-02-24 7:50 [PATCH 0/4] vhost-user-blk: fix compatibility with older qemu versions Alexandr Moshkov ` (2 preceding siblings ...) 2026-02-24 7:50 ` [PATCH 3/4] vhost-user: remove supports_inflight_migration Alexandr Moshkov @ 2026-02-24 7:50 ` Alexandr Moshkov 2026-03-05 9:45 ` Vladimir Sementsov-Ogievskiy 3 siblings, 1 reply; 11+ messages in thread From: Alexandr Moshkov @ 2026-02-24 7:50 UTC (permalink / raw) To: qemu-devel Cc: Raphael Norwitz, virtio-fs, Milan Zamazal, Stefan Hajnoczi, Michael S. Tsirkin, Jason Wang, zhenwei pi, Gonglei (Arei), Pierrick Bouvier, Kevin Wolf, Hanna Reitz, Alex Bennée, Paolo Bonzini, Stefano Garzarella, Fam Zheng, qemu-block, Alexandr Moshkov Use skip_drain on GET_VRING_BASE to suspend in-flight I/O requests, and then migrate them throught inflight subsection. Signed-off-by: Alexandr Moshkov <dtalexundeer@yandex-team.ru> --- hw/block/vhost-user-blk.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c index 3421145f23..4e606fd0fc 100644 --- a/hw/block/vhost-user-blk.c +++ b/hw/block/vhost-user-blk.c @@ -130,6 +130,17 @@ const VhostDevConfigOps blk_ops = { .vhost_dev_config_notifier = vhost_user_blk_handle_config_change, }; +static bool vhost_user_blk_inflight_needed(void *opaque) +{ + struct VHostUserBlk *s = opaque; + + bool inflight_migration = virtio_has_feature(s->dev.protocol_features, + VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT); + + return inflight_migration && s->inflight_migration; +} + + static int vhost_user_blk_start(VirtIODevice *vdev, Error **errp) { VHostUserBlk *s = VHOST_USER_BLK(vdev); @@ -221,11 +232,13 @@ static int vhost_user_blk_stop(VirtIODevice *vdev) return 0; } + bool skip_drain = vhost_user_blk_inflight_needed(s); + 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, false); + vhost_dev_stop(&s->dev, vdev, true, skip_drain); if (k->set_guest_notifiers(qbus->parent, s->dev.nvqs, false) < 0) { error_report("vhost guest notifier cleanup failed: %d", ret); @@ -568,16 +581,6 @@ 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 = virtio_has_feature(s->dev.protocol_features, - VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT); - - return inflight_migration; -} - static const VMStateDescription vmstate_vhost_user_blk_inflight = { .name = "vhost-user-blk/inflight", .version_id = 1, -- 2.34.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 4/4] vhost-user-blk: make inflight migration throught skip_drain 2026-02-24 7:50 ` [PATCH 4/4] vhost-user-blk: make inflight migration throught skip_drain Alexandr Moshkov @ 2026-03-05 9:45 ` Vladimir Sementsov-Ogievskiy 0 siblings, 0 replies; 11+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2026-03-05 9:45 UTC (permalink / raw) To: Alexandr Moshkov, qemu-devel Cc: Raphael Norwitz, virtio-fs, Milan Zamazal, Stefan Hajnoczi, Michael S. Tsirkin, Jason Wang, zhenwei pi, Gonglei (Arei), Pierrick Bouvier, Kevin Wolf, Hanna Reitz, Alex Bennée, Paolo Bonzini, Stefano Garzarella, Fam Zheng, qemu-block On 24.02.26 10:50, Alexandr Moshkov wrote: > Use skip_drain on GET_VRING_BASE to suspend in-flight I/O requests, and > then migrate them throught inflight subsection. > > Signed-off-by: Alexandr Moshkov <dtalexundeer@yandex-team.ru> > --- > hw/block/vhost-user-blk.c | 25 ++++++++++++++----------- > 1 file changed, 14 insertions(+), 11 deletions(-) > > diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c > index 3421145f23..4e606fd0fc 100644 > --- a/hw/block/vhost-user-blk.c > +++ b/hw/block/vhost-user-blk.c > @@ -130,6 +130,17 @@ const VhostDevConfigOps blk_ops = { > .vhost_dev_config_notifier = vhost_user_blk_handle_config_change, > }; > > +static bool vhost_user_blk_inflight_needed(void *opaque) > +{ > + struct VHostUserBlk *s = opaque; > + > + bool inflight_migration = virtio_has_feature(s->dev.protocol_features, > + VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT); > + > + return inflight_migration && s->inflight_migration; > +} hmm, unrelated code movement > + > + > static int vhost_user_blk_start(VirtIODevice *vdev, Error **errp) > { > VHostUserBlk *s = VHOST_USER_BLK(vdev); > @@ -221,11 +232,13 @@ static int vhost_user_blk_stop(VirtIODevice *vdev) > return 0; > } > > + bool skip_drain = vhost_user_blk_inflight_needed(s); > + > 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, false); > + vhost_dev_stop(&s->dev, vdev, true, skip_drain); > > if (k->set_guest_notifiers(qbus->parent, s->dev.nvqs, false) < 0) { > error_report("vhost guest notifier cleanup failed: %d", ret); > @@ -568,16 +581,6 @@ 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 = virtio_has_feature(s->dev.protocol_features, > - VHOST_USER_PROTOCOL_F_GET_VRING_BASE_INFLIGHT); > - > - return inflight_migration; > -} > - > static const VMStateDescription vmstate_vhost_user_blk_inflight = { > .name = "vhost-user-blk/inflight", > .version_id = 1, -- Best regards, Vladimir ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-03-05 9:46 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-02-24 7:50 [PATCH 0/4] vhost-user-blk: fix compatibility with older qemu versions Alexandr Moshkov 2026-02-24 7:50 ` [PATCH 1/4] vhost-user.rst: fix typo Alexandr Moshkov 2026-02-25 13:05 ` Stefan Hajnoczi 2026-02-24 7:50 ` [PATCH 2/4] vhost-user: add skip_drain param to GET_VRING_BASE Alexandr Moshkov 2026-03-01 23:34 ` Stefan Hajnoczi 2026-03-02 7:12 ` Alexandr Moshkov 2026-03-03 8:45 ` Vladimir Sementsov-Ogievskiy 2026-03-05 9:26 ` Vladimir Sementsov-Ogievskiy 2026-02-24 7:50 ` [PATCH 3/4] vhost-user: remove supports_inflight_migration Alexandr Moshkov 2026-02-24 7:50 ` [PATCH 4/4] vhost-user-blk: make inflight migration throught skip_drain Alexandr Moshkov 2026-03-05 9:45 ` Vladimir Sementsov-Ogievskiy
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox