diff options
author | Maxime Coquelin | 2017-06-02 12:18:27 +0200 |
---|---|---|
committer | Michael S. Tsirkin | 2017-06-02 17:57:17 +0200 |
commit | fc58bd0d97c41dc3257001c86b2f802ae7255dff (patch) | |
tree | 9bd22607c9c71c64ec2020eed281539549d613f6 /hw/virtio/vhost.c | |
parent | virtio-serial: fix segfault on disconnect (diff) | |
download | qemu-fc58bd0d97c41dc3257001c86b2f802ae7255dff.tar.gz qemu-fc58bd0d97c41dc3257001c86b2f802ae7255dff.tar.xz qemu-fc58bd0d97c41dc3257001c86b2f802ae7255dff.zip |
vhost: propagate errors in vhost_device_iotlb_miss()
Some backends might want to know when things went wrong.
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/virtio/vhost.c')
-rw-r--r-- | hw/virtio/vhost.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 03a46a7429..8fab12d5f1 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -971,18 +971,20 @@ static int vhost_memory_region_lookup(struct vhost_dev *hdev, return -EFAULT; } -void vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write) +int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write) { IOMMUTLBEntry iotlb; uint64_t uaddr, len; + int ret = -EFAULT; rcu_read_lock(); iotlb = address_space_get_iotlb_entry(dev->vdev->dma_as, iova, write); if (iotlb.target_as != NULL) { - if (vhost_memory_region_lookup(dev, iotlb.translated_addr, - &uaddr, &len)) { + ret = vhost_memory_region_lookup(dev, iotlb.translated_addr, + &uaddr, &len); + if (ret) { error_report("Fail to lookup the translated address " "%"PRIx64, iotlb.translated_addr); goto out; @@ -991,14 +993,17 @@ void vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write) len = MIN(iotlb.addr_mask + 1, len); iova = iova & ~iotlb.addr_mask; - if (dev->vhost_ops->vhost_update_device_iotlb(dev, iova, uaddr, - len, iotlb.perm)) { + ret = dev->vhost_ops->vhost_update_device_iotlb(dev, iova, uaddr, + len, iotlb.perm); + if (ret) { error_report("Fail to update device iotlb"); goto out; } } out: rcu_read_unlock(); + + return ret; } static int vhost_virtqueue_start(struct vhost_dev *dev, |