From 2b12ea393b9a5d8392cb510406626f4c99c9f4c5 Mon Sep 17 00:00:00 2001 From: Prasad Pandit Date: Thu, 7 Nov 2024 17:02:47 +0530 Subject: [PATCH 6/7] vhost: fail device start if iotlb update fails RH-Author: Prasad Pandit RH-MergeRequest: 318: vhost: fail device start if iotlb update fails RH-Jira: RHEL-73005 RH-Acked-by: Stefano Garzarella RH-Acked-by: Miroslav Rezanina RH-Commit: [1/1] f185f02378ebbf36a38aef0ea608b70c637a4816 (pjp/cs-qemu-kvm) While starting a vhost device, updating iotlb entries via 'vhost_device_iotlb_miss' may return an error. qemu-kvm: vhost_device_iotlb_miss: 700871,700871: Fail to update device iotlb Fail device start when such an error occurs. Jira: https://issues.redhat.com/browse/RHEL-73005 Signed-off-by: Prasad Pandit Message-Id: <20241107113247.46532-1-ppandit@redhat.com> Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin Reviewed-by: Stefano Garzarella (cherry picked from commit 571bdc97b83646dfd3746ec56fb2f70bca55b9a2) Signed-off-by: Prasad Pandit --- hw/virtio/vhost.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 06fc71746e..e25fdce3dd 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -2151,11 +2151,22 @@ int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings) * vhost-kernel code requires for this.*/ for (i = 0; i < hdev->nvqs; ++i) { struct vhost_virtqueue *vq = hdev->vqs + i; - vhost_device_iotlb_miss(hdev, vq->used_phys, true); + r = vhost_device_iotlb_miss(hdev, vq->used_phys, true); + if (r) { + goto fail_iotlb; + } } } vhost_start_config_intr(hdev); return 0; +fail_iotlb: + if (vhost_dev_has_iommu(hdev) && + hdev->vhost_ops->vhost_set_iotlb_callback) { + hdev->vhost_ops->vhost_set_iotlb_callback(hdev, false); + } + if (hdev->vhost_ops->vhost_dev_start) { + hdev->vhost_ops->vhost_dev_start(hdev, false); + } fail_start: if (vrings) { vhost_dev_set_vring_enable(hdev, false); -- 2.39.3