Allow backends to chose, which addr to put into vhost_iotlb_msg: user or physical. To be used in further commit.
Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]> --- hw/virtio/vhost.c | 11 ++++++++--- include/hw/virtio/vhost-backend.h | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 1cde1aaebf..36e43e0af5 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -920,14 +920,18 @@ static void vhost_region_addnop(MemoryListener *listener, } static int vhost_update_device_iotlb(struct vhost_dev *dev, - uint64_t iova, uint64_t uaddr, + uint64_t iova, + uint64_t paddr, + uint64_t uaddr, uint64_t len, IOMMUAccessFlags perm) { + bool phys = dev->vhost_ops->vhost_phys_iotlb_msg && + dev->vhost_ops->vhost_phys_iotlb_msg(dev); struct vhost_iotlb_msg imsg; imsg.iova = iova; - imsg.uaddr = uaddr; + imsg.uaddr = phys ? paddr : uaddr; imsg.size = len; imsg.type = VHOST_IOTLB_UPDATE; @@ -1387,7 +1391,8 @@ int 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; - ret = vhost_update_device_iotlb(dev, iova, uaddr, len, iotlb.perm); + ret = vhost_update_device_iotlb(dev, iova, iotlb.translated_addr, uaddr, + len, iotlb.perm); if (ret) { trace_vhost_iotlb_miss(dev, 4); error_report("Fail to update device iotlb"); diff --git a/include/hw/virtio/vhost-backend.h b/include/hw/virtio/vhost-backend.h index 7cc3bb5441..00881a0bd4 100644 --- a/include/hw/virtio/vhost-backend.h +++ b/include/hw/virtio/vhost-backend.h @@ -143,6 +143,8 @@ typedef int (*vhost_dev_start_op)(struct vhost_dev *dev, bool started); typedef bool (*vhost_phys_vring_addr_op)(struct vhost_dev *dev); +typedef bool (*vhost_phys_iotlb_msg_op)(struct vhost_dev *dev); + typedef int (*vhost_get_device_id_op)(struct vhost_dev *dev, uint32_t *dev_id); typedef bool (*vhost_force_iommu_op)(struct vhost_dev *dev); @@ -210,6 +212,7 @@ typedef struct VhostOps { vhost_set_inflight_fd_op vhost_set_inflight_fd; vhost_dev_start_op vhost_dev_start; vhost_phys_vring_addr_op vhost_phys_vring_addr; + vhost_phys_iotlb_msg_op vhost_phys_iotlb_msg; vhost_get_device_id_op vhost_get_device_id; vhost_force_iommu_op vhost_force_iommu; vhost_set_config_call_op vhost_set_config_call; -- 2.52.0
