Provide a way for device drivers to tell IOMMU drivers about the device state and the cleanup work to be done, when unbinding. No functional change. Signed-off-by: Jean-Philippe Brucker <jean-philippe@xxxxxxxxxx> --- include/linux/intel-iommu.h | 2 +- include/linux/iommu.h | 7 ++++--- drivers/iommu/intel/svm.c | 7 ++++--- drivers/iommu/iommu.c | 5 +++-- drivers/misc/uacce/uacce.c | 4 ++-- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index fbf5b3e7707e..5b66b23d591d 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h @@ -747,7 +747,7 @@ int intel_svm_bind_gpasid(struct iommu_domain *domain, struct device *dev, int intel_svm_unbind_gpasid(struct device *dev, u32 pasid); struct iommu_sva *intel_svm_bind(struct device *dev, struct mm_struct *mm, void *drvdata); -void intel_svm_unbind(struct iommu_sva *handle); +void intel_svm_unbind(struct iommu_sva *handle, unsigned long flags); 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); diff --git a/include/linux/iommu.h b/include/linux/iommu.h index b95a6f8db6ff..26c1358a2a37 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -285,7 +285,7 @@ struct iommu_ops { struct iommu_sva *(*sva_bind)(struct device *dev, struct mm_struct *mm, void *drvdata); - void (*sva_unbind)(struct iommu_sva *handle); + void (*sva_unbind)(struct iommu_sva *handle, unsigned long flags); u32 (*sva_get_pasid)(struct iommu_sva *handle); int (*page_response)(struct device *dev, @@ -636,7 +636,7 @@ int iommu_aux_get_pasid(struct iommu_domain *domain, struct device *dev); struct iommu_sva *iommu_sva_bind_device(struct device *dev, struct mm_struct *mm, void *drvdata); -void iommu_sva_unbind_device(struct iommu_sva *handle); +void iommu_sva_unbind_device(struct iommu_sva *handle, unsigned long flags); u32 iommu_sva_get_pasid(struct iommu_sva *handle); #else /* CONFIG_IOMMU_API */ @@ -1026,7 +1026,8 @@ iommu_sva_bind_device(struct device *dev, struct mm_struct *mm, void *drvdata) return NULL; } -static inline void iommu_sva_unbind_device(struct iommu_sva *handle) +static inline void iommu_sva_unbind_device(struct iommu_sva *handle, + unsigned long flags) { } diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c index f1861fa3d0e4..700b05612af9 100644 --- a/drivers/iommu/intel/svm.c +++ b/drivers/iommu/intel/svm.c @@ -651,7 +651,8 @@ intel_svm_bind_mm(struct device *dev, unsigned int flags, } /* Caller must hold pasid_mutex */ -static int intel_svm_unbind_mm(struct device *dev, u32 pasid) +static int intel_svm_unbind_mm(struct device *dev, u32 pasid, + unsigned long flags) { struct intel_svm_dev *sdev; struct intel_iommu *iommu; @@ -1091,13 +1092,13 @@ intel_svm_bind(struct device *dev, struct mm_struct *mm, void *drvdata) return sva; } -void intel_svm_unbind(struct iommu_sva *sva) +void intel_svm_unbind(struct iommu_sva *sva, unsigned long flags) { struct intel_svm_dev *sdev; mutex_lock(&pasid_mutex); sdev = to_intel_svm_dev(sva); - intel_svm_unbind_mm(sdev->dev, sdev->pasid); + intel_svm_unbind_mm(sdev->dev, sdev->pasid, flags); mutex_unlock(&pasid_mutex); } diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 8c470f451a32..741c463095a8 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -2991,6 +2991,7 @@ EXPORT_SYMBOL_GPL(iommu_sva_bind_device); /** * iommu_sva_unbind_device() - Remove a bond created with iommu_sva_bind_device * @handle: the handle returned by iommu_sva_bind_device() + * @flags: IOMMU_UNBIND_* flags * * Put reference to a bond between device and address space. The device should * not be issuing any more transaction for this PASID. All outstanding page @@ -2998,7 +2999,7 @@ EXPORT_SYMBOL_GPL(iommu_sva_bind_device); * * Returns 0 on success, or an error value */ -void iommu_sva_unbind_device(struct iommu_sva *handle) +void iommu_sva_unbind_device(struct iommu_sva *handle, unsigned long flags) { struct iommu_group *group; struct device *dev = handle->dev; @@ -3012,7 +3013,7 @@ void iommu_sva_unbind_device(struct iommu_sva *handle) return; mutex_lock(&group->mutex); - ops->sva_unbind(handle); + ops->sva_unbind(handle, flags); mutex_unlock(&group->mutex); iommu_group_put(group); diff --git a/drivers/misc/uacce/uacce.c b/drivers/misc/uacce/uacce.c index 56dd98ab5a81..0800566a6656 100644 --- a/drivers/misc/uacce/uacce.c +++ b/drivers/misc/uacce/uacce.c @@ -105,7 +105,7 @@ static int uacce_bind_queue(struct uacce_device *uacce, struct uacce_queue *q) pasid = iommu_sva_get_pasid(handle); if (pasid == IOMMU_PASID_INVALID) { - iommu_sva_unbind_device(handle); + iommu_sva_unbind_device(handle, 0); return -ENODEV; } @@ -118,7 +118,7 @@ static void uacce_unbind_queue(struct uacce_queue *q) { if (!q->handle) return; - iommu_sva_unbind_device(q->handle); + iommu_sva_unbind_device(q->handle, 0); q->handle = NULL; } -- 2.28.0