@@ -106,6 +106,7 @@ config IOMMU_DMA
config IOMMU_SVA
bool
select IOASID
+ select IOMMU_PAGE_FAULT
select IOMMU_API
select MMU_NOTIFIER
@@ -420,6 +420,12 @@ void iommu_sva_unbind_generic(struct iommu_sva *handle)
if (WARN_ON(!param))
return;
+ /*
+ * Caller stopped the device from issuing PASIDs, now make sure they are
+ * out of the fault queue.
+ */
+ iopf_queue_flush_dev(handle->dev, bond->io_mm->pasid);
+
mutex_lock(¶m->sva_lock);
mutex_lock(&iommu_sva_lock);
io_mm_detach(bond);
@@ -457,6 +463,10 @@ int iommu_sva_enable(struct device *dev, struct iommu_sva_param *sva_param)
goto err_unlock;
}
+ ret = iommu_register_device_fault_handler(dev, iommu_queue_iopf, dev);
+ if (ret)
+ goto err_unlock;
+
dev->iommu->sva_param = new_param;
mutex_unlock(¶m->sva_lock);
return 0;
@@ -494,6 +504,7 @@ int iommu_sva_disable(struct device *dev)
goto out_unlock;
}
+ iommu_unregister_device_fault_handler(dev);
kfree(param->sva_param);
param->sva_param = NULL;
out_unlock:
When enabling SVA, register the fault handler. Device driver will register an I/O page fault queue before or after calling iommu_sva_enable. The fault queue must be flushed before any io_mm is freed, to make sure that its PASID isn't used in any fault queue, and can be reallocated. Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org> --- drivers/iommu/Kconfig | 1 + drivers/iommu/iommu-sva.c | 11 +++++++++++ 2 files changed, 12 insertions(+)