On Mon, Jan 22, 2024 at 03:38:58PM +0800, Lu Baolu wrote: > +/** > + * enum iommu_hwpt_pgfault_flags - flags for struct iommu_hwpt_pgfault > + * @IOMMU_PGFAULT_FLAGS_PASID_VALID: The pasid field of the fault data is > + * valid. > + * @IOMMU_PGFAULT_FLAGS_LAST_PAGE: It's the last fault of a fault group. > + */ > +enum iommu_hwpt_pgfault_flags { > + IOMMU_PGFAULT_FLAGS_PASID_VALID = (1 << 0), > + IOMMU_PGFAULT_FLAGS_LAST_PAGE = (1 << 1), > +}; > + > +/** > + * enum iommu_hwpt_pgfault_perm - perm bits for struct iommu_hwpt_pgfault > + * @IOMMU_PGFAULT_PERM_READ: request for read permission > + * @IOMMU_PGFAULT_PERM_WRITE: request for write permission > + * @IOMMU_PGFAULT_PERM_EXEC: request for execute permission > + * @IOMMU_PGFAULT_PERM_PRIV: request for privileged permission You are going to have to elaborate what PRIV is for.. We don't have any concept of this in the UAPI for iommufd so what is a userspace supposed to do if it hits this? EXEC is similar, we can't actually enable exec permissions from userspace IIRC.. > +enum iommu_hwpt_pgfault_perm { > + IOMMU_PGFAULT_PERM_READ = (1 << 0), > + IOMMU_PGFAULT_PERM_WRITE = (1 << 1), > + IOMMU_PGFAULT_PERM_EXEC = (1 << 2), > + IOMMU_PGFAULT_PERM_PRIV = (1 << 3), > +}; > + > +/** > + * struct iommu_hwpt_pgfault - iommu page fault data > + * @size: sizeof(struct iommu_hwpt_pgfault) > + * @flags: Combination of enum iommu_hwpt_pgfault_flags > + * @dev_id: id of the originated device > + * @pasid: Process Address Space ID > + * @grpid: Page Request Group Index > + * @perm: Combination of enum iommu_hwpt_pgfault_perm > + * @addr: page address > + */ > +struct iommu_hwpt_pgfault { > + __u32 size; > + __u32 flags; > + __u32 dev_id; > + __u32 pasid; > + __u32 grpid; > + __u32 perm; > + __u64 addr; > +}; Do we need an addr + size here? I've seen a few things where I wonder if that might become an enhancment someday. > +/** > + * struct iommu_hwpt_page_response - IOMMU page fault response > + * @size: sizeof(struct iommu_hwpt_page_response) > + * @flags: Must be set to 0 > + * @dev_id: device ID of target device for the response > + * @pasid: Process Address Space ID > + * @grpid: Page Request Group Index > + * @code: response code. The supported codes include: > + * 0: Successful; 1: Response Failure; 2: Invalid Request. This should be an enum > + * @addr: The fault address. Must match the addr field of the > + * last iommu_hwpt_pgfault of a reported iopf group. > + */ > +struct iommu_hwpt_page_response { > + __u32 size; > + __u32 flags; > + __u32 dev_id; > + __u32 pasid; > + __u32 grpid; > + __u32 code; > + __u64 addr; > +}; Do we want some kind of opaque ID value from the kernel here to match request with response exactly? Or is the plan to search on the addr? Jason