[RFC PATCHES 10/17] iommufd: Add IOMMU_HWPT_ALLOC_FLAGS_USER_PASID_TABLE for hwpt_alloc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This flag indicates that the architecture supports assigning the whole
PASID table for a device to userspace. When this flag is set, the host
kernel does not need to be involved in attaching or detaching HWPTs to
any PASID of the device. For such architectures, the fault cookie is
always saved as {device, 0}.

Signed-off-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
---
 drivers/iommu/iommufd/iommufd_private.h | 1 +
 include/uapi/linux/iommufd.h            | 3 +++
 drivers/iommu/iommufd/hw_pagetable.c    | 6 +++++-
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/iommufd/iommufd_private.h b/drivers/iommu/iommufd/iommufd_private.h
index 8ff7721ea922..67e5aa0f996e 100644
--- a/drivers/iommu/iommufd/iommufd_private.h
+++ b/drivers/iommu/iommufd/iommufd_private.h
@@ -241,6 +241,7 @@ struct hw_pgtable_fault {
 	struct list_head deliver;
 	struct list_head response;
 	struct eventfd_ctx *trigger;
+	bool user_pasid_table;
 };
 
 struct iommufd_fault {
diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h
index 2c7c44c00da2..63863e21d043 100644
--- a/include/uapi/linux/iommufd.h
+++ b/include/uapi/linux/iommufd.h
@@ -449,6 +449,8 @@ struct iommu_hwpt_arm_smmuv3 {
  *    must be valid once this flag is set. On successful return, user can
  *    listen to @event_fd and retrieve faults by reading @out_fault_fd.
  *    The fault data is encoded in the format defined by iommu_hwpt_pgfault.
+ *  - USER_PASID_TABLE: The architecture supports assigning the whole pasid
+ *    table of a device to user.
  * @dev_id: The device to allocate this HWPT for
  * @pt_id: The IOAS to connect this HWPT to
  * @out_hwpt_id: The ID of the new HWPT
@@ -487,6 +489,7 @@ struct iommu_hwpt_alloc {
 	__u32 size;
 	__u32 flags;
 #define IOMMU_HWPT_ALLOC_FLAGS_IOPF_CAPABLE		(1 << 0)
+#define IOMMU_HWPT_ALLOC_FLAGS_USER_PASID_TABLE		(1 << 1)
 	__u32 dev_id;
 	__u32 pt_id;
 	__u32 out_hwpt_id;
diff --git a/drivers/iommu/iommufd/hw_pagetable.c b/drivers/iommu/iommufd/hw_pagetable.c
index 4d07c7c0073e..ca3e4d92f2aa 100644
--- a/drivers/iommu/iommufd/hw_pagetable.c
+++ b/drivers/iommu/iommufd/hw_pagetable.c
@@ -304,6 +304,9 @@ int iommufd_hwpt_alloc(struct iommufd_ucmd *ucmd)
 			goto out_hwpt;
 		}
 
+		if (cmd->flags & IOMMU_HWPT_ALLOC_FLAGS_USER_PASID_TABLE)
+			hwpt->fault->user_pasid_table = true;
+
 		iommu_domain_set_iopf_handler(hwpt->domain,
 					      iommufd_hw_pagetable_iopf_handler,
 					      hwpt);
@@ -401,7 +404,8 @@ iommufd_hw_pagetable_iopf_handler(struct iommu_fault *fault,
 	if (!ifault)
 		return IOMMU_PAGE_RESP_FAILURE;
 
-	cookie = iommu_get_device_fault_cookie(dev, fault->prm.pasid);
+	cookie = iommu_get_device_fault_cookie(dev,
+			hwpt->fault->user_pasid_table ?  0 : fault->prm.pasid);
 	if (!cookie)
 		return IOMMU_PAGE_RESP_FAILURE;
 
-- 
2.34.1




[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux