Looks ok, just a comment typo which is deleted in a subsequent commit. Reviewed-by: Raphael Norwitz <[email protected]>
On Thu, Oct 16, 2025 at 7:47 AM Vladimir Sementsov-Ogievskiy <[email protected]> wrote: > > We are going to split vhost_dev_init() so that the first part will do > early initialization of QEMU structures, but don't communicate with > backend, and the second part will do backend communication. We need > this for future support for backend-transfer migration support for > vhost-user-blk (backend will not be available in the early > initialization point). > > With this commit we introduce boolean parameter for vhost_dev_init(), > so callers may chose, do they want "init + connect" (which is current > behavior, so all callers pass true), or caller may want "only init", > and call vhost_dev_connect() later. vhost_dev_connect(), as well > as support for connect=false will be added in further commits. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]> > --- > backends/cryptodev-vhost.c | 2 +- > backends/vhost-user.c | 2 +- > hw/block/vhost-user-blk.c | 2 +- > hw/net/vhost_net.c | 2 +- > hw/scsi/vhost-scsi.c | 2 +- > hw/scsi/vhost-user-scsi.c | 2 +- > hw/virtio/vdpa-dev.c | 3 ++- > 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-vsock.c | 2 +- > hw/virtio/vhost-vsock.c | 2 +- > hw/virtio/vhost.c | 11 ++++++++++- > include/hw/virtio/vhost-backend.h | 2 ++ > include/hw/virtio/vhost.h | 3 ++- > 15 files changed, 27 insertions(+), 14 deletions(-) > > diff --git a/backends/cryptodev-vhost.c b/backends/cryptodev-vhost.c > index c6069f4e5b..b4dafb4062 100644 > --- a/backends/cryptodev-vhost.c > +++ b/backends/cryptodev-vhost.c > @@ -66,7 +66,7 @@ cryptodev_vhost_init( > crypto->dev.vq_index = crypto->cc->queue_index * crypto->dev.nvqs; > > r = vhost_dev_init(&crypto->dev, options->opaque, options->backend_type, > 0, > - &local_err); > + true, &local_err); > if (r < 0) { > error_report_err(local_err); > goto fail; > diff --git a/backends/vhost-user.c b/backends/vhost-user.c > index 42845329e7..e65ba7b648 100644 > --- a/backends/vhost-user.c > +++ b/backends/vhost-user.c > @@ -37,7 +37,7 @@ vhost_user_backend_dev_init(VhostUserBackend *b, > VirtIODevice *vdev, > b->dev.vqs = g_new0(struct vhost_virtqueue, nvqs); > > ret = vhost_dev_init(&b->dev, &b->vhost_user, VHOST_BACKEND_TYPE_USER, 0, > - errp); > + true, errp); > if (ret < 0) { > return -1; > } > diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c > index a5daed4346..a92426f18c 100644 > --- a/hw/block/vhost-user-blk.c > +++ b/hw/block/vhost-user-blk.c > @@ -365,7 +365,7 @@ static int vhost_user_blk_connect(DeviceState *dev, Error > **errp) > > s->vhost_user.supports_config = true; > ret = vhost_dev_init(&s->dev, &s->vhost_user, VHOST_BACKEND_TYPE_USER, 0, > - errp); > + true, errp); > if (ret < 0) { > return ret; > } > diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c > index 323d117735..c4526974fb 100644 > --- a/hw/net/vhost_net.c > +++ b/hw/net/vhost_net.c > @@ -274,7 +274,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options) > > r = vhost_dev_init(&net->dev, options->opaque, > options->backend_type, options->busyloop_timeout, > - &local_err); > + true, &local_err); > if (r < 0) { > error_report_err(local_err); > goto fail; > diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c > index d694a25fe2..d187c705d8 100644 > --- a/hw/scsi/vhost-scsi.c > +++ b/hw/scsi/vhost-scsi.c > @@ -278,7 +278,7 @@ static void vhost_scsi_realize(DeviceState *dev, Error > **errp) > vsc->dev.vq_index = 0; > > ret = vhost_dev_init(&vsc->dev, (void *)(uintptr_t)vhostfd, > - VHOST_BACKEND_TYPE_KERNEL, 0, errp); > + VHOST_BACKEND_TYPE_KERNEL, 0, true, errp); > if (ret < 0) { > /* > * vhost_dev_init calls vhost_dev_cleanup on error, which closes > diff --git a/hw/scsi/vhost-user-scsi.c b/hw/scsi/vhost-user-scsi.c > index 0c80a271d8..e121f2e259 100644 > --- a/hw/scsi/vhost-user-scsi.c > +++ b/hw/scsi/vhost-user-scsi.c > @@ -161,7 +161,7 @@ static int vhost_user_scsi_connect(DeviceState *dev, > Error **errp) > vsc->dev.vq_index = 0; > > ret = vhost_dev_init(&vsc->dev, &s->vhost_user, VHOST_BACKEND_TYPE_USER, > 0, > - errp); > + true, errp); > if (ret < 0) { > return ret; > } > diff --git a/hw/virtio/vdpa-dev.c b/hw/virtio/vdpa-dev.c > index e1a2ff433d..b6b4ee7d38 100644 > --- a/hw/virtio/vdpa-dev.c > +++ b/hw/virtio/vdpa-dev.c > @@ -116,7 +116,8 @@ static void vhost_vdpa_device_realize(DeviceState *dev, > Error **errp) > v->vdpa.shared->device_fd = v->vhostfd; > v->vdpa.shared->iova_range = iova_range; > > - ret = vhost_dev_init(&v->dev, &v->vdpa, VHOST_BACKEND_TYPE_VDPA, 0, > NULL); > + ret = vhost_dev_init(&v->dev, &v->vdpa, VHOST_BACKEND_TYPE_VDPA, 0, true, > + NULL); > if (ret < 0) { > error_setg(errp, "vhost-vdpa-device: vhost initialization failed: > %s", > strerror(-ret)); > diff --git a/hw/virtio/vhost-user-base.c b/hw/virtio/vhost-user-base.c > index cf311c3bfc..0768231a88 100644 > --- a/hw/virtio/vhost-user-base.c > +++ b/hw/virtio/vhost-user-base.c > @@ -334,7 +334,7 @@ static void vub_device_realize(DeviceState *dev, Error > **errp) > > /* connect to backend */ > ret = vhost_dev_init(&vub->vhost_dev, &vub->vhost_user, > - VHOST_BACKEND_TYPE_USER, 0, errp); > + VHOST_BACKEND_TYPE_USER, 0, true, errp); > > if (ret < 0) { > do_vhost_user_cleanup(vdev, vub); > diff --git a/hw/virtio/vhost-user-fs.c b/hw/virtio/vhost-user-fs.c > index e77c69eb12..2a8eead90b 100644 > --- a/hw/virtio/vhost-user-fs.c > +++ b/hw/virtio/vhost-user-fs.c > @@ -256,7 +256,7 @@ static void vuf_device_realize(DeviceState *dev, Error > **errp) > fs->vhost_dev.nvqs = 1 + fs->conf.num_request_queues; > fs->vhost_dev.vqs = g_new0(struct vhost_virtqueue, fs->vhost_dev.nvqs); > ret = vhost_dev_init(&fs->vhost_dev, &fs->vhost_user, > - VHOST_BACKEND_TYPE_USER, 0, errp); > + VHOST_BACKEND_TYPE_USER, 0, true, errp); > if (ret < 0) { > goto err_virtio; > } > diff --git a/hw/virtio/vhost-user-scmi.c b/hw/virtio/vhost-user-scmi.c > index f9264c4374..40e567c18a 100644 > --- a/hw/virtio/vhost-user-scmi.c > +++ b/hw/virtio/vhost-user-scmi.c > @@ -253,7 +253,7 @@ static void vu_scmi_device_realize(DeviceState *dev, > Error **errp) > scmi->vhost_dev.vqs = g_new0(struct vhost_virtqueue, > scmi->vhost_dev.nvqs); > > ret = vhost_dev_init(&scmi->vhost_dev, &scmi->vhost_user, > - VHOST_BACKEND_TYPE_USER, 0, errp); > + VHOST_BACKEND_TYPE_USER, 0, true, errp); > if (ret < 0) { > error_setg_errno(errp, -ret, > "vhost-user-scmi: vhost_dev_init() failed"); > diff --git a/hw/virtio/vhost-user-vsock.c b/hw/virtio/vhost-user-vsock.c > index 993c287348..b630af0fe7 100644 > --- a/hw/virtio/vhost-user-vsock.c > +++ b/hw/virtio/vhost-user-vsock.c > @@ -115,7 +115,7 @@ static void vuv_device_realize(DeviceState *dev, Error > **errp) > vhost_dev_set_config_notifier(&vvc->vhost_dev, &vsock_ops); > > ret = vhost_dev_init(&vvc->vhost_dev, &vsock->vhost_user, > - VHOST_BACKEND_TYPE_USER, 0, errp); > + VHOST_BACKEND_TYPE_USER, 0, true, errp); > if (ret < 0) { > goto err_virtio; > } > diff --git a/hw/virtio/vhost-vsock.c b/hw/virtio/vhost-vsock.c > index 107d88babe..3a4b2d924d 100644 > --- a/hw/virtio/vhost-vsock.c > +++ b/hw/virtio/vhost-vsock.c > @@ -166,7 +166,7 @@ static void vhost_vsock_device_realize(DeviceState *dev, > Error **errp) > vhost_vsock_common_realize(vdev); > > ret = vhost_dev_init(&vvc->vhost_dev, (void *)(uintptr_t)vhostfd, > - VHOST_BACKEND_TYPE_KERNEL, 0, errp); > + VHOST_BACKEND_TYPE_KERNEL, 0, true, errp); > if (ret < 0) { > /* > * vhostfd is closed by vhost_dev_cleanup, which is called > diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c > index 1998663461..f733e98b4a 100644 > --- a/hw/virtio/vhost.c > +++ b/hw/virtio/vhost.c > @@ -1617,7 +1617,7 @@ static bool check_memslots(struct vhost_dev *hdev, > Error **errp) > > int vhost_dev_init(struct vhost_dev *hdev, void *opaque, > VhostBackendType backend_type, uint32_t busyloop_timeout, > - Error **errp) > + bool connect, Error **errp) > { > int i, r, n_initialized_vqs = 0; > > @@ -1634,6 +1634,15 @@ int vhost_dev_init(struct vhost_dev *hdev, void > *opaque, > r = vhost_set_backend_type(hdev, backend_type); > assert(r >= 0); > > + /* > + * Postponed connect only supported for devices with > + * .vhost_backend_connect handler > + */ > + assert(connect || hdev->vhost_ops->vhost_backend_connect); > + nit: TODO > + /* TDDO: support connect=false */ > + assert(connect); > + > r = hdev->vhost_ops->vhost_backend_init(hdev, opaque, errp); > if (r < 0) { > goto fail; > diff --git a/include/hw/virtio/vhost-backend.h > b/include/hw/virtio/vhost-backend.h > index ff94fa1734..d3f055f95e 100644 > --- a/include/hw/virtio/vhost-backend.h > +++ b/include/hw/virtio/vhost-backend.h > @@ -53,6 +53,7 @@ struct vhost_virtqueue; > > typedef int (*vhost_backend_init)(struct vhost_dev *dev, void *opaque, > Error **errp); > +typedef int (*vhost_backend_connect)(struct vhost_dev *dev, Error **errp); > typedef int (*vhost_backend_cleanup)(struct vhost_dev *dev); > typedef int (*vhost_backend_memslots_limit)(struct vhost_dev *dev); > > @@ -167,6 +168,7 @@ typedef int (*vhost_check_device_state_op)(struct > vhost_dev *dev, Error **errp); > typedef struct VhostOps { > VhostBackendType backend_type; > vhost_backend_init vhost_backend_init; > + vhost_backend_connect vhost_backend_connect; > vhost_backend_cleanup vhost_backend_cleanup; > vhost_backend_memslots_limit vhost_backend_memslots_limit; > vhost_backend_no_private_memslots_op vhost_backend_no_private_memslots; > diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h > index f1a7e7b971..74ed24232e 100644 > --- a/include/hw/virtio/vhost.h > +++ b/include/hw/virtio/vhost.h > @@ -155,7 +155,8 @@ struct vhost_net { > */ > int vhost_dev_init(struct vhost_dev *hdev, void *opaque, > VhostBackendType backend_type, > - uint32_t busyloop_timeout, Error **errp); > + uint32_t busyloop_timeout, > + bool connect, Error **errp); > > /** > * vhost_dev_cleanup() - tear down and cleanup vhost interface > -- > 2.48.1 > >
