-----Original Message----- From: Lu Baolu baolu.lu@linux.intel.com Sent: Thursday, October 26, 2023 3:49 AM To: Jason Gunthorpe jgg@ziepe.ca; Kevin Tian kevin.tian@intel.com; Joerg Roedel joro@8bytes.org; Will Deacon will@kernel.org; Robin Murphy robin.murphy@arm.com; Jean-Philippe Brucker jean-philippe@linaro.org; Nicolin Chen nicolinc@nvidia.com; Yi Liu yi.l.liu@intel.com; Jacob Pan jacob.jun.pan@linux.intel.com Cc: iommu@lists.linux.dev; linux-kselftest@vger.kernel.org; virtualization@lists.linux-foundation.org; linux-kernel@vger.kernel.org; Lu Baolu baolu.lu@linux.intel.com Subject: [PATCH v2 4/6] iommufd: Deliver fault messages to user space
[...]
Hi,
+static ssize_t hwpt_fault_fops_write(struct file *filep,
const char __user *buf,size_t count, loff_t *ppos)+{
- size_t response_size = sizeof(struct iommu_hwpt_page_response);
 - struct hw_pgtable_fault *fault = filep->private_data;
 - struct iommu_hwpt_page_response response;
 - struct iommufd_hw_pagetable *hwpt;
 - struct iopf_group *iter, *group;
 - struct iommufd_device *idev;
 - size_t done = 0;
 - int rc = 0;
 - if (*ppos || count % response_size)
 return -ESPIPE;- mutex_lock(&fault->mutex);
 - while (!list_empty(&fault->response) && count > done) {
 rc = copy_from_user(&response, buf + done, response_size);if (rc)break;/* Get the device that this response targets at. */idev = container_of(iommufd_get_object(fault->ictx,response.dev_id,IOMMUFD_OBJ_DEVICE),struct iommufd_device, obj);if (IS_ERR(idev)) {rc = PTR_ERR(idev);break;}/** Get the hw page table that this response was generated for.* It must match the one stored in the fault data.*/hwpt = container_of(iommufd_get_object(fault->ictx,response.hwpt_id,IOMMUFD_OBJ_HW_PAGETABLE),
struct iommufd_hw_pagetable, obj);if (IS_ERR(hwpt)) {iommufd_put_object(&idev->obj);rc = PTR_ERR(hwpt);break;}if (hwpt != fault->hwpt) {rc = -EINVAL;goto put_obj;}group = NULL;list_for_each_entry(iter, &fault->response, node) {if (response.grpid != iter->last_fault.fault.prm.grpid)continue;if (idev->dev != iter->dev)continue;if ((iter->last_fault.fault.prm.flags &IOMMU_FAULT_PAGE_REQUEST_PASID_VALID) &&response.pasid != iter->last_fault.fault.prm.pasid)continue;
I am trying to get vSVA working with this series and got hit by the above check. On ARM platforms, page responses to stall events(CMD_RESUME) do not have an associated pasid. I think, either we need to check here using IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID or remove the check as it will be eventually done in iommu_page_response().
Thanks, Shameer