Hi Joerg & David, Any feedback on this one? Thanks.
On Wed, 8 May 2019 12:22:46 -0700 Jacob Pan <[email protected]> wrote: > If multiple devices try to bind to the same mm/PASID, we need to > set up first level PASID entries for all the devices. The current > code does not consider this case which results in failed DMA for > devices after the first bind. > > Signed-off-by: Jacob Pan <[email protected]> > Reported-by: Mike Campin <[email protected]> > --- > drivers/iommu/intel-svm.c | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c > index 3a4b09a..f3d59d1 100644 > --- a/drivers/iommu/intel-svm.c > +++ b/drivers/iommu/intel-svm.c > @@ -357,6 +357,21 @@ int intel_svm_bind_mm(struct device *dev, int > *pasid, int flags, struct svm_dev_ } > > list_add_tail(&svm->list, &global_svm_list); > + } else { > + /* > + * Binding a new device with existing PASID, need to > setup > + * the PASID entry. > + */ > + spin_lock(&iommu->lock); > + ret = intel_pasid_setup_first_level(iommu, dev, > + mm ? mm->pgd : > init_mm.pgd, > + svm->pasid, > FLPT_DEFAULT_DID, > + mm ? 0 : > PASID_FLAG_SUPERVISOR_MODE); > + spin_unlock(&iommu->lock); > + if (ret) { > + kfree(sdev); > + goto out; > + } > } > list_add_rcu(&sdev->list, &svm->devs); > [Jacob Pan]
