> From: Tian, Kevin > Sent: Friday, May 14, 2021 2:28 PM > > > From: Jason Gunthorpe <jgg@xxxxxxxx> > > 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