Hi Yi, Thank you for reviewing my patch. On 07/23/2018 12:44 PM, Liu, Yi L wrote: > Hi Baolu, > > Per my understanding, the subject is not accurate. I think this patch is > to get parent device structure for a mediate device instead of iommu > device. This may be misleading for reviewers. Please check below. > > Thanks, > Yi Liu > >> From: Lu Baolu [mailto:baolu.lu@xxxxxxxxxxxxxxx] >> Sent: Sunday, July 22, 2018 2:09 PM >> >> This patch adds the support to get the iommu device for a mediated device. The >> assumption is that each mediated device is a minimal assignable set of a physical PCI >> device. Hence, we should use the iommu device of the parent PCI device to manage >> the translation. >> >> Cc: Ashok Raj <ashok.raj@xxxxxxxxx> >> Cc: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx> >> Cc: Kevin Tian <kevin.tian@xxxxxxxxx> >> Cc: Liu Yi L <yi.l.liu@xxxxxxxxx> >> Signed-off-by: Sanjay Kumar <sanjay.k.kumar@xxxxxxxxx> >> Signed-off-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx> >> --- >> drivers/iommu/intel-iommu.c | 6 ++++++ drivers/iommu/intel-pasid.h | 16 >> ++++++++++++++++ >> 2 files changed, 22 insertions(+) >> >> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index >> 7d198ea..fc3ac1c 100644 >> --- a/drivers/iommu/intel-iommu.c >> +++ b/drivers/iommu/intel-iommu.c >> @@ -767,6 +767,12 @@ static struct intel_iommu *device_to_iommu(struct device >> *dev, u8 *bus, u8 *devf >> if (iommu_dummy(dev)) >> return NULL; >> >> + if (dev_is_mdev(dev)) { >> + dev = dev_mdev_parent(dev); >> + if (WARN_ON(!dev_is_pci(dev))) >> + return NULL; >> + } >> + This gets the parent of a mediated device. And an iommu device will be found which services the parent device. A mediated device should in the same iommu scope as its parent. Best regards, Lu Baolu >> if (dev_is_pci(dev)) { >> struct pci_dev *pf_pdev; >> >> diff --git a/drivers/iommu/intel-pasid.h b/drivers/iommu/intel-pasid.h index >> 518df72..46cde66 100644 >> --- a/drivers/iommu/intel-pasid.h >> +++ b/drivers/iommu/intel-pasid.h >> @@ -35,6 +35,22 @@ struct pasid_table { >> struct list_head dev; /* device list */ >> }; >> >> +static inline bool dev_is_mdev(struct device *dev) { >> + if (!dev) >> + return false; >> + >> + return !strcmp(dev->bus->name, "mdev"); } >> + >> +static inline struct device *dev_mdev_parent(struct device *dev) { >> + if (WARN_ON(!dev_is_mdev(dev))) >> + return NULL; >> + >> + return dev->parent; >> +} >> + >> extern u32 intel_pasid_max_id; >> int intel_pasid_alloc_id(void *ptr, int start, int end, gfp_t gfp); void >> intel_pasid_free_id(int pasid); >> -- >> 2.7.4 >