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;