From: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
Sent: Tuesday, July 11, 2023 9:07 AM
+static int iommu_handle_io_pgfault(struct device *dev,
+ struct iommu_fault *fault)
+{
+ struct iommu_domain *domain;
+
+ if (fault->type != IOMMU_FAULT_PAGE_REQ)
+ return -EINVAL;
+
+ if (fault->prm.flags & IOMMU_FAULT_PAGE_REQUEST_PASID_VALID)
+ domain = iommu_get_domain_for_dev_pasid(dev, fault-
prm.pasid, 0);+ else
+ domain = iommu_get_domain_for_dev(dev);
+
+ if (!domain || !domain->iopf_handler)
+ return -ENODEV;
+
+ if (domain->iopf_handler == iommu_sva_handle_iopf)
+ return iommu_queue_iopf(fault, dev);
You can avoid the special check by directly making iommu_queue_iopf
as the iopf_handler for sva domain.
+
+ return domain->iopf_handler(fault, dev, domain->fault_data);
+}
btw is there value of moving the group handling logic from
iommu_queue_iopf() to this common function?
I wonder whether there is any correctness issue if not forwarding
partial request to iommufd. If not this can also help reduce
notifications to the user until the group is ready.