Commit fc58bd0d authored by Maxime Coquelin's avatar Maxime Coquelin Committed by Michael S. Tsirkin
Browse files

vhost: propagate errors in vhost_device_iotlb_miss()



Some backends might want to know when things went wrong.

Signed-off-by: default avatarMaxime Coquelin <maxime.coquelin@redhat.com>
Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 46764fe0
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -105,5 +105,5 @@ bool vhost_has_free_slot(void);
int vhost_net_set_backend(struct vhost_dev *hdev,
                          struct vhost_vring_file *file);

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);
#endif