Re: [RFC 1/7] iommu/vt-d: Set the dma_ops per device so we can remove the iommu_no_mapping code
From: Tom Murphy
Date: Mon May 06 2019 - 11:28:07 EST
On Mon, May 6, 2019 at 2:48 AM Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx> wrote:
>
> Hi,
>
> On 5/4/19 9:23 PM, Tom Murphy wrote:
> > Set the dma_ops per device so we can remove the iommu_no_mapping code.
> >
> > Signed-off-by: Tom Murphy<tmurphy@xxxxxxxxxx>
> > ---
> > drivers/iommu/intel-iommu.c | 85 +++----------------------------------
> > 1 file changed, 6 insertions(+), 79 deletions(-)
> >
> > diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
> > index eace915602f0..2db1dc47e7e4 100644
> > --- a/drivers/iommu/intel-iommu.c
> > +++ b/drivers/iommu/intel-iommu.c
> > @@ -2622,17 +2622,6 @@ static int __init si_domain_init(int hw)
> > return 0;
> > }
> >
> > -static int identity_mapping(struct device *dev)
> > -{
> > - struct device_domain_info *info;
> > -
> > - info = dev->archdata.iommu;
> > - if (info && info != DUMMY_DEVICE_DOMAIN_INFO)
> > - return (info->domain == si_domain);
> > -
> > - return 0;
> > -}
> > -
> > static int domain_add_dev_info(struct dmar_domain *domain, struct device *dev)
> > {
> > struct dmar_domain *ndomain;
> > @@ -3270,43 +3259,6 @@ static unsigned long intel_alloc_iova(struct device *dev,
> > return iova_pfn;
> > }
> >
> > -/* Check if the dev needs to go through non-identity map and unmap process.*/
> > -static int iommu_no_mapping(struct device *dev)
> > -{
> > - int found;
> > -
> > - if (iommu_dummy(dev))
> > - return 1;
> > -
> > - found = identity_mapping(dev);
> > - if (found) {
> > - /*
> > - * If the device's dma_mask is less than the system's memory
> > - * size then this is not a candidate for identity mapping.
> > - */
> > - u64 dma_mask = *dev->dma_mask;
> > -
> > - if (dev->coherent_dma_mask &&
> > - dev->coherent_dma_mask < dma_mask)
> > - dma_mask = dev->coherent_dma_mask;
> > -
> > - if (dma_mask < dma_get_required_mask(dev)) {
> > - /*
> > - * 32 bit DMA is removed from si_domain and fall back
> > - * to non-identity mapping.
> > - */
> > - dmar_remove_one_dev_info(dev);
> > - dev_warn(dev, "32bit DMA uses non-identity mapping\n");
> > -
> > - return 0;
> > - }
>
> The iommu_no_mapping() also checks whether any 32bit DMA device uses
> identity mapping. The device might not work if the system memory space
> is bigger than 4G.
It looks like their is actually a bug in the v3 of the "iommu/vt-d:
Delegate DMA domain to generic iommu" patch set. I will leave a
message in that email thread. Fixing that bug should also fix this
issue.
>
> Will you add this to other place, or it's unnecessary?
>
> Best regards,
> Lu Baolu