@@ -1158,6 +1158,24 @@ static int vhost_vdpa_dev_start(struct vhost_dev *dev, bool started)
trace_vhost_vdpa_dev_start(dev, started);
if (started) {
+ if ((v->enable_iommufd) && (vhost_vdpa_first_dev(dev))) {
+ struct vdpa_iommufd *vdpa_iommufd;
+
+ vdpa_backend_iommufd_ops_class_init(v);
+
+ if (dev->vdev->iommufd_ptr == NULL) {
+ vdpa_iommufd = g_malloc(sizeof(VDPAIOMMUFDState));
+
+ vdpa_iommufd->iommufd = g_malloc(sizeof(IOMMUFDBackend));
+ dev->vdev->iommufd_ptr = vdpa_iommufd;
+
+ qemu_mutex_init(&vdpa_iommufd->iommufd->lock);
+ iommufd_backend_connect(vdpa_iommufd->iommufd, NULL);
+
+ v->ops->attach_device(v, dev->vdev->dma_as, NULL);
+ }
+ }
+
vhost_vdpa_host_notifiers_init(dev);
ok = vhost_vdpa_svqs_start(dev);
if (unlikely(!ok)) {
Add support for iommufd, init the vdpa_iommufd in vdpa_start in this step, driver will bind to the iommufd device and attach the default ASID(asid 0) to iommufd Signed-off-by: Cindy Lu <lulu@redhat.com> --- hw/virtio/vhost-vdpa.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)