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]

Reply via email to