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>
This commit is contained in:
parent
46764fe09c
commit
fc58bd0d97
@ -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,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user