RE: [PATCH 3/6] vfio: remove the unused mdev iommu hook

Tian, Kevin
2021-05-14T06:54:27Z

> From: Tian, Kevin
> Sent: Friday, May 14, 2021 2:28 PM
>
> > From: Jason Gunthorpe <jgg@ziepe.ca>
> > Sent: Thursday, May 13, 2021 8:01 PM
> >
> > On Thu, May 13, 2021 at 03:28:52AM +0000, Tian, Kevin wrote:
> >
> > > Are you specially concerned about this iommu_device hack which
> > > directly connects mdev_device to iommu layer or the entire removed
> > > logic including the aux domain concept? For the former we are now
> > > following up the referred thread to find a clean way. But for the latter
> > > we feel it's still necessary regardless of how iommu interface is
> redesigned
> > > to support device connection from the upper level driver. The reason is
> > > that with mdev or subdevice one physical device could be attached to
> > > multiple domains now. there could be a primary domain with DOMAIN_
> > > DMA type for DMA_API use by parent driver itself, and multiple auxiliary
> > > domains with DOMAIN_UNMANAGED types for subdevices assigned to
> > > different VMs.
> >
> > Why do we need more domains than just the physical domain for the
> > parent? How does auxdomain appear in /dev/ioasid?
> >
>
> Say the parent device has three WQs. WQ1 is used by parent driver itself,
> while WQ2/WQ3 are assigned to VM1/VM2 respectively.
>
> WQ1 is attached to domain1 for an IOVA space to support DMA API
> operations in parent driver.
>
> WQ2 is attached to domain2 for the GPA space of VM1. Domain2 is
> created when WQ2 is assigned to VM1 as a mdev.
>
> WQ3 is attached to domain3 for the GPA space of VM2. Domain3 is
> created when WQ3 is assigned to VM2 as a mdev.
>
> In this case domain1 is the primary while the other two are auxiliary
> to the parent.
>
> auxdomain represents as a normal domain in /dev/ioasid, with only
> care required when doing attachment.
>
> e.g. VM1 is assigned with both a pdev and mdev. Qemu creates
> gpa_ioasid which is associated with a single domain for VM1's
> GPA space and this domain is shared by both pdev and mdev.

Here pdev/mdev are just conceptual description. Following your
earlier suggestion /dev/ioasid will not refer to explicit mdev_device.
Instead, each vfio device attached to an ioasid is represented by either
"struct device" for pdev or "struct device + pasid" for mdev. The
presence of pasid decides which iommu_attach api should be used.

>
> The domain becomes the primary domain of pdev when attaching
> pdev to gpa_ioasid:
> iommu_attach_device(domain, device);
>
> The domain becomes the auxiliary domain of mdev's parent when
> attaching mdev to gpa_ioasid:
> iommu_aux_attach_device(domain, device, pasid);
>
> Thanks
> Kevin