On Thu, Jul 27, 2023 at 01:48:34PM +0800, Lu Baolu wrote: > The iopf_handler() function handles a fault_group for a SVA domain. Move > it to the right place. > > Signed-off-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx> > --- > drivers/iommu/iommu-sva.h | 17 +++++++++++++ > drivers/iommu/io-pgfault.c | 50 +++----------------------------------- > drivers/iommu/iommu-sva.c | 49 +++++++++++++++++++++++++++++++++++++ > 3 files changed, 69 insertions(+), 47 deletions(-) > diff --git a/drivers/iommu/iommu-sva.c b/drivers/iommu/iommu-sva.c > index 05c0fb2acbc4..ab42cfdd7636 100644 > --- a/drivers/iommu/iommu-sva.c > +++ b/drivers/iommu/iommu-sva.c > @@ -219,3 +219,52 @@ void mm_pasid_drop(struct mm_struct *mm) > +static void iopf_handler(struct work_struct *work) > +{ > + struct iopf_fault *iopf; > + struct iopf_group *group; > + struct iommu_domain *domain; > + enum iommu_page_response_code status = IOMMU_PAGE_RESP_SUCCESS; > + > + group = container_of(work, struct iopf_group, work); > + domain = iommu_get_domain_for_dev_pasid(group->dev, > + group->last_fault.fault.prm.pasid, 0); > + if (!domain || !domain->iopf_handler) > + status = IOMMU_PAGE_RESP_INVALID; > + > + list_for_each_entry(iopf, &group->faults, list) { > + /* > + * For the moment, errors are sticky: don't handle subsequent > + * faults in the group if there is an error. > + */ > + if (status == IOMMU_PAGE_RESP_SUCCESS) > + status = domain->iopf_handler(&iopf->fault, > + domain->fault_data); > + } > + > + iopf_complete_group(group->dev, &group->last_fault, status); > + iopf_free_group(group); > +} Routing faults to domains is generic code, not SVA code. SVA starts at domain->iopf_handler Jason