Reviewed-by: Raphael Norwitz <raphael.s.norwitz@gmail.com>
On Thu, Oct 16, 2025 at 7:47 AM Vladimir Sementsov-Ogievskiy
<vsementsov@yandex-team.ru> 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 simply reorder the logic in vhost_dev_init()
> in accordance with idea of further split.
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
> ---
> hw/virtio/vhost.c | 60 +++++++++++++++++++++++------------------------
> 1 file changed, 30 insertions(+), 30 deletions(-)
>
> diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> index 9fc6e7ba65..551d1687fc 100644
> --- a/hw/virtio/vhost.c
> +++ b/hw/virtio/vhost.c
> @@ -1637,26 +1637,6 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
> goto fail;
> }
>
> - r = hdev->vhost_ops->vhost_set_owner(hdev);
> - if (r < 0) {
> - error_setg_errno(errp, -r, "vhost_set_owner failed");
> - goto fail;
> - }
> -
> - r = vhost_dev_init_features(hdev);
> - if (r < 0) {
> - error_setg_errno(errp, -r, "vhost_init_features failed");
> - goto fail;
> - }
> -
> - for (i = 0; i < hdev->nvqs; ++i, ++n_initialized_vqs) {
> - r = vhost_virtqueue_init(hdev, hdev->vqs + i, hdev->vq_index + i);
> - if (r < 0) {
> - error_setg_errno(errp, -r, "Failed to initialize virtqueue %d", i);
> - goto fail;
> - }
> - }
> -
> hdev->memory_listener = (MemoryListener) {
> .name = "vhost",
> .begin = vhost_begin,
> @@ -1677,6 +1657,36 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
> .region_del = vhost_iommu_region_del,
> };
>
> + hdev->mem = g_malloc0(offsetof(struct vhost_memory, regions));
> + hdev->n_mem_sections = 0;
> + hdev->mem_sections = NULL;
> + hdev->log = NULL;
> + hdev->log_size = 0;
> + hdev->log_enabled = false;
> + hdev->started = false;
> + memory_listener_register(&hdev->memory_listener, &address_space_memory);
> + QLIST_INSERT_HEAD(&vhost_devices, hdev, entry);
> +
> + r = hdev->vhost_ops->vhost_set_owner(hdev);
> + if (r < 0) {
> + error_setg_errno(errp, -r, "vhost_set_owner failed");
> + goto fail;
> + }
> +
> + r = vhost_dev_init_features(hdev);
> + if (r < 0) {
> + error_setg_errno(errp, -r, "vhost_init_features failed");
> + goto fail;
> + }
> +
> + for (i = 0; i < hdev->nvqs; ++i, ++n_initialized_vqs) {
> + r = vhost_virtqueue_init(hdev, hdev->vqs + i, hdev->vq_index + i);
> + if (r < 0) {
> + error_setg_errno(errp, -r, "Failed to initialize virtqueue %d", i);
> + goto fail;
> + }
> + }
> +
> if (hdev->migration_blocker == NULL) {
> if (!vhost_dev_has_feature_ex(hdev, VHOST_F_LOG_ALL)) {
> error_setg(&hdev->migration_blocker,
> @@ -1694,16 +1704,6 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
> }
> }
>
> - hdev->mem = g_malloc0(offsetof(struct vhost_memory, regions));
> - hdev->n_mem_sections = 0;
> - hdev->mem_sections = NULL;
> - hdev->log = NULL;
> - hdev->log_size = 0;
> - hdev->log_enabled = false;
> - hdev->started = false;
> - memory_listener_register(&hdev->memory_listener, &address_space_memory);
> - QLIST_INSERT_HEAD(&vhost_devices, hdev, entry);
> -
> if (!check_memslots(hdev, errp)) {
> r = -EINVAL;
> goto fail;
> --
> 2.48.1
>
>