Messages in this thread | | | Date | Sun, 31 Jul 2022 20:20:36 +0800 | Subject | Re: [PATCH v10 06/12] iommu/vt-d: Add SVA domain support | From | Yi Liu <> |
| |
On 2022/7/5 13:07, Lu Baolu wrote: > Add support for SVA domain allocation and provide an SVA-specific > iommu_domain_ops. > > Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> > Reviewed-by: Kevin Tian <kevin.tian@intel.com> > Tested-by: Tony Zhu <tony.zhu@intel.com> > --- > include/linux/intel-iommu.h | 5 ++++ > drivers/iommu/intel/iommu.c | 2 ++ > drivers/iommu/intel/svm.c | 49 +++++++++++++++++++++++++++++++++++++ > 3 files changed, 56 insertions(+)
Reviewed-by: Yi Liu <yi.l.liu@intel.com>
> diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h > index 31e3edc0fc7e..9007428a68f1 100644 > --- a/include/linux/intel-iommu.h > +++ b/include/linux/intel-iommu.h > @@ -743,6 +743,7 @@ void intel_svm_unbind(struct iommu_sva *handle); > u32 intel_svm_get_pasid(struct iommu_sva *handle); > int intel_svm_page_response(struct device *dev, struct iommu_fault_event *evt, > struct iommu_page_response *msg); > +struct iommu_domain *intel_svm_domain_alloc(void); > > struct intel_svm_dev { > struct list_head list; > @@ -768,6 +769,10 @@ struct intel_svm { > }; > #else > static inline void intel_svm_check(struct intel_iommu *iommu) {} > +static inline struct iommu_domain *intel_svm_domain_alloc(void) > +{ > + return NULL; > +} > #endif > > #ifdef CONFIG_INTEL_IOMMU_DEBUGFS > diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c > index 44016594831d..993a1ce509a8 100644 > --- a/drivers/iommu/intel/iommu.c > +++ b/drivers/iommu/intel/iommu.c > @@ -4298,6 +4298,8 @@ static struct iommu_domain *intel_iommu_domain_alloc(unsigned type) > return domain; > case IOMMU_DOMAIN_IDENTITY: > return &si_domain->domain; > + case IOMMU_DOMAIN_SVA: > + return intel_svm_domain_alloc(); > default: > return NULL; > } > diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c > index d04880a291c3..7d4f9d173013 100644 > --- a/drivers/iommu/intel/svm.c > +++ b/drivers/iommu/intel/svm.c > @@ -931,3 +931,52 @@ int intel_svm_page_response(struct device *dev, > mutex_unlock(&pasid_mutex); > return ret; > } > + > +static int intel_svm_set_dev_pasid(struct iommu_domain *domain, > + struct device *dev, ioasid_t pasid) > +{ > + struct device_domain_info *info = dev_iommu_priv_get(dev); > + struct intel_iommu *iommu = info->iommu; > + struct mm_struct *mm = domain->mm; > + struct iommu_sva *sva; > + int ret = 0; > + > + mutex_lock(&pasid_mutex); > + sva = intel_svm_bind_mm(iommu, dev, mm); > + if (IS_ERR(sva)) > + ret = PTR_ERR(sva); > + mutex_unlock(&pasid_mutex); > + > + return ret; > +} > + > +static void intel_svm_block_dev_pasid(struct iommu_domain *domain, > + struct device *dev, ioasid_t pasid) > +{ > + mutex_lock(&pasid_mutex); > + intel_svm_unbind_mm(dev, pasid); > + mutex_unlock(&pasid_mutex); > +} > + > +static void intel_svm_domain_free(struct iommu_domain *domain) > +{ > + kfree(to_dmar_domain(domain)); > +} > + > +static const struct iommu_domain_ops intel_svm_domain_ops = { > + .set_dev_pasid = intel_svm_set_dev_pasid, > + .block_dev_pasid = intel_svm_block_dev_pasid, > + .free = intel_svm_domain_free, > +}; > + > +struct iommu_domain *intel_svm_domain_alloc(void) > +{ > + struct dmar_domain *domain; > + > + domain = kzalloc(sizeof(*domain), GFP_KERNEL); > + if (!domain) > + return NULL; > + domain->domain.ops = &intel_svm_domain_ops; > + > + return &domain->domain; > +}
-- Regards, Yi Liu
| |