Message ID | 20241107113247.46532-1-ppandit@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v1] vhost: fail device start if iotlb update fails | expand |
On Thu, Nov 07, 2024 at 05:02:47PM +0530, Prasad Pandit wrote: >From: Prasad Pandit <pjp@fedoraproject.org> > >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. > >Signed-off-by: Prasad Pandit <pjp@fedoraproject.org> >--- > hw/virtio/vhost.c | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > >v1: > - Remove VHOST_OPS_DEBUG call. > - Call vhost_set_iotlb_callback and vhost_dev_start with 'false' argument. LGTM! Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> > >v0: > - https://lore.kernel.org/qemu-devel/20241105060053.61973-1-ppandit@redhat.com/ > >diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c >index 76f9b2aaad..c40f48ac4d 100644 >--- a/hw/virtio/vhost.c >+++ b/hw/virtio/vhost.c >@@ -2095,11 +2095,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.47.0 >
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 76f9b2aaad..c40f48ac4d 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -2095,11 +2095,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);