@samitouri / QOSamiQemu / commits / 04f0d0a69e

vhost: add .vhost_phys_iotlb_msg() handler

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 <vsementsov@yandex-team.ru> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Based-on: <20260206095258.894504-1-vsementsov@yandex-team.ru> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Message-Id: <20260420202032.714884-10-vsementsov@yandex-team.ru>

Vladimir Sementsov-Ogievskiy committed Apr 20, 2026 at 23:20 UTC 04f0d0a69eb93c3da135068afd081871ab4f6bd5
2 files changed +11 -3
hw/virtio/vhost.c
+8 -3
@@ -920,14 +920,18 @@ static void vhost_region_addnop(MemoryListener *listener,
920 }
921
922 static int vhost_update_device_iotlb(struct vhost_dev *dev,
923 - uint64_t iova, uint64_t uaddr,
923 + uint64_t iova,
924 + uint64_t paddr,
925 + uint64_t uaddr,
926 uint64_t len,
927 IOMMUAccessFlags perm)
928 {
929 + bool phys = dev->vhost_ops->vhost_phys_iotlb_msg &&
930 + dev->vhost_ops->vhost_phys_iotlb_msg(dev);
931 struct vhost_iotlb_msg imsg;
932
933 imsg.iova = iova;
930 - imsg.uaddr = uaddr;
934 + imsg.uaddr = phys ? paddr : uaddr;
935 imsg.size = len;
936 imsg.type = VHOST_IOTLB_UPDATE;
937
@@ -1385,7 +1389,8 @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
1389 len = MIN(iotlb.addr_mask + 1, len);
1390 iova = iova & ~iotlb.addr_mask;
1391
1388 - ret = vhost_update_device_iotlb(dev, iova, uaddr, len, iotlb.perm);
1392 + ret = vhost_update_device_iotlb(dev, iova, iotlb.translated_addr, uaddr,
1393 + len, iotlb.perm);
1394 if (ret) {
1395 trace_vhost_iotlb_miss(dev, 4);
1396 error_report("Fail to update device iotlb");
include/hw/virtio/vhost-backend.h
+3
@@ -143,6 +143,8 @@ typedef int (*vhost_dev_start_op)(struct vhost_dev *dev, bool started);
143
144 typedef bool (*vhost_phys_vring_addr_op)(struct vhost_dev *dev);
145
146 +typedef bool (*vhost_phys_iotlb_msg_op)(struct vhost_dev *dev);
147 +
148 typedef int (*vhost_get_device_id_op)(struct vhost_dev *dev, uint32_t *dev_id);
149
150 typedef bool (*vhost_force_iommu_op)(struct vhost_dev *dev);
@@ -210,6 +212,7 @@ typedef struct VhostOps {
212 vhost_set_inflight_fd_op vhost_set_inflight_fd;
213 vhost_dev_start_op vhost_dev_start;
214 vhost_phys_vring_addr_op vhost_phys_vring_addr;
215 + vhost_phys_iotlb_msg_op vhost_phys_iotlb_msg;
216 vhost_get_device_id_op vhost_get_device_id;
217 vhost_force_iommu_op vhost_force_iommu;
218 vhost_set_config_call_op vhost_set_config_call;