diff mbox series

[v4,4/7] iommu/vt-d: Use pci_real_dma_dev() for mapping

Message ID 1579278449-174098-5-git-send-email-jonathan.derrick@intel.com
State New
Headers show
Series Clean up VMD DMA Map Ops | expand

Commit Message

Derrick, Jonathan Jan. 17, 2020, 4:27 p.m. UTC
The PCI device may have a DMA requester on another bus, such as VMD
subdevices needing to use the VMD endpoint. This case requires the real
DMA device when mapping to IOMMU.

Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
---
 drivers/iommu/intel-iommu.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Christoph Hellwig Jan. 19, 2020, 10:18 p.m. UTC | #1
On Fri, Jan 17, 2020 at 09:27:26AM -0700, Jon Derrick wrote:
> +	if (dev_is_pci(dev)) {
> +		struct pci_dev *pdev;
> +
> +		pdev = pci_real_dma_dev(to_pci_dev(dev));
> +		dev = &pdev->dev;

I think this could be simplified to

	if (dev_is_pci(dev))
		dev = &pci_real_dma_dev(to_pci_dev(dev)->dev;
Lu Baolu Jan. 21, 2020, 1:06 a.m. UTC | #2
Hi,

On 1/18/20 12:27 AM, Jon Derrick wrote:
> The PCI device may have a DMA requester on another bus, such as VMD
> subdevices needing to use the VMD endpoint. This case requires the real
> DMA device when mapping to IOMMU.
> 
> Signed-off-by: Jon Derrick<jonathan.derrick@intel.com>
> ---
>   drivers/iommu/intel-iommu.c | 9 +++++++++
>   1 file changed, 9 insertions(+)
> 
> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
> index 0c8d81f..01a1b0f 100644
> --- a/drivers/iommu/intel-iommu.c
> +++ b/drivers/iommu/intel-iommu.c
> @@ -782,6 +782,8 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
>   			return NULL;
>   #endif
>   
> +		pdev = pci_real_dma_dev(dev);

This isn't correct. It will result in a compiling error when bisect.

Best regards,
baolu
Derrick, Jonathan Jan. 21, 2020, 1:22 a.m. UTC | #3
Good catch. Thanks Baolu.
Will do v5 fixing this and Christoph's nit

On Tue, 2020-01-21 at 09:06 +0800, Lu Baolu wrote:
> Hi,
> 
> On 1/18/20 12:27 AM, Jon Derrick wrote:
> > The PCI device may have a DMA requester on another bus, such as VMD
> > subdevices needing to use the VMD endpoint. This case requires the real
> > DMA device when mapping to IOMMU.
> > 
> > Signed-off-by: Jon Derrick<jonathan.derrick@intel.com>
> > ---
> >   drivers/iommu/intel-iommu.c | 9 +++++++++
> >   1 file changed, 9 insertions(+)
> > 
> > diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
> > index 0c8d81f..01a1b0f 100644
> > --- a/drivers/iommu/intel-iommu.c
> > +++ b/drivers/iommu/intel-iommu.c
> > @@ -782,6 +782,8 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
> >   			return NULL;
> >   #endif
> >   
> > +		pdev = pci_real_dma_dev(dev);
> 
> This isn't correct. It will result in a compiling error when bisect.
> 
> Best regards,
> baolu
diff mbox series

Patch

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 0c8d81f..01a1b0f 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -782,6 +782,8 @@  static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
 			return NULL;
 #endif
 
+		pdev = pci_real_dma_dev(dev);
+
 		/* VFs aren't listed in scope tables; we need to look up
 		 * the PF instead to find the IOMMU. */
 		pf_pdev = pci_physfn(pdev);
@@ -2428,6 +2430,13 @@  static struct dmar_domain *find_domain(struct device *dev)
 		     dev->archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO))
 		return NULL;
 
+	if (dev_is_pci(dev)) {
+		struct pci_dev *pdev;
+
+		pdev = pci_real_dma_dev(to_pci_dev(dev));
+		dev = &pdev->dev;
+	}
+
 	/* No lock here, assumes no domain exit in normal case */
 	info = dev->archdata.iommu;
 	if (likely(info))