On 23/05/2019 19:56, Robin Murphy wrote: > On 23/05/2019 19:06, Jean-Philippe Brucker wrote: >> From: Jacob Pan <jacob.jun....@linux.intel.com> >> >> Traditionally, device specific faults are detected and handled within >> their own device drivers. When IOMMU is enabled, faults such as DMA >> related transactions are detected by IOMMU. There is no generic >> reporting mechanism to report faults back to the in-kernel device >> driver or the guest OS in case of assigned devices. >> >> This patch introduces a registration API for device specific fault >> handlers. This differs from the existing iommu_set_fault_handler/ >> report_iommu_fault infrastructures in several ways: >> - it allows to report more sophisticated fault events (both >> unrecoverable faults and page request faults) due to the nature >> of the iommu_fault struct >> - it is device specific and not domain specific. >> >> The current iommu_report_device_fault() implementation only handles >> the "shoot and forget" unrecoverable fault case. Handling of page >> request faults or stalled faults will come later. >> >> Signed-off-by: Jacob Pan <jacob.jun....@linux.intel.com> >> Signed-off-by: Ashok Raj <ashok....@intel.com> >> Signed-off-by: Jean-Philippe Brucker <jean-philippe.bruc...@arm.com> >> Signed-off-by: Eric Auger <eric.au...@redhat.com> >> --- >> drivers/iommu/iommu.c | 127 ++++++++++++++++++++++++++++++++++++++++++ >> include/linux/iommu.h | 29 ++++++++++ >> 2 files changed, 156 insertions(+) >> >> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c >> index 67ee6623f9b2..d546f7baa0d4 100644 >> --- a/drivers/iommu/iommu.c >> +++ b/drivers/iommu/iommu.c >> @@ -644,6 +644,13 @@ int iommu_group_add_device(struct iommu_group *group, >> struct device *dev) >> goto err_free_name; >> } >> >> + dev->iommu_param = kzalloc(sizeof(*dev->iommu_param), GFP_KERNEL); >> + if (!dev->iommu_param) { >> + ret = -ENOMEM; >> + goto err_free_name; >> + } >> + mutex_init(&dev->iommu_param->lock); >> + > > Note that this gets a bit tricky when we come to move to move the > fwspec/ops/etc. into iommu_param, since that data can have a longer > lifespan than the group association. I'd suggest moving this management > out to the iommu_{probe,release}_device() level from the start, but > maybe we're happy to come back and change things later as necessary.
I'll do that, but iommu_probe_device() might still be too late. According to of_iommu_configure() there might be cases where iommu_probe_device() is called after iommu_fwspec_init(). So when moving everything to iommu_param, we might need to introduce something like iommu_get_dev_param() which allocates the param if it doesn't exist. Thanks, Jean