lkml.org 
[lkml]   [2023]   [Jul]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 07/12] iommufd: Add data structure for Intel VT-d stage-1 cache invalidation
    Date
    This adds the data structure for flushing iotlb for the nested domain
    allocated with IOMMU_HWPT_TYPE_VTD_S1 type.

    Cache invalidation path is performance path, so it's better to avoid
    memory allocation in such path. To achieve it, this path reuses the
    ucmd_buffer to copy user data. So the new data structures are added in
    the ucmd_buffer union to avoid overflow.

    This only supports invalidating IOTLB, but no for device-TLB as device-TLB
    invalidation will be covered automatically in the IOTLB invalidation if the
    underlying IOMMU driver has enabled ATS for the affected device.

    Signed-off-by: Yi Liu <yi.l.liu@intel.com>
    ---
    drivers/iommu/iommufd/main.c | 6 ++++
    include/uapi/linux/iommufd.h | 58 ++++++++++++++++++++++++++++++++++++
    2 files changed, 64 insertions(+)

    diff --git a/drivers/iommu/iommufd/main.c b/drivers/iommu/iommufd/main.c
    index d49837397dfa..b927ace7f3af 100644
    --- a/drivers/iommu/iommufd/main.c
    +++ b/drivers/iommu/iommufd/main.c
    @@ -485,6 +485,12 @@ union ucmd_buffer {
    #ifdef CONFIG_IOMMUFD_TEST
    struct iommu_test_cmd test;
    #endif
    + /*
    + * hwpt_type specific structure used in the cache invalidation
    + * path.
    + */
    + struct iommu_hwpt_vtd_s1_invalidate vtd;
    + struct iommu_hwpt_vtd_s1_invalidate_desc req_vtd;
    };

    struct iommufd_ioctl_op {
    diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h
    index 90b0d3f603a7..2c1241448c87 100644
    --- a/include/uapi/linux/iommufd.h
    +++ b/include/uapi/linux/iommufd.h
    @@ -523,6 +523,64 @@ struct iommu_resv_iova_ranges {
    };
    #define IOMMU_RESV_IOVA_RANGES _IO(IOMMUFD_TYPE, IOMMUFD_CMD_RESV_IOVA_RANGES)

    +/**
    + * enum iommu_hwpt_vtd_s1_invalidate_flags - Flags for Intel VT-d
    + * stage-1 cache invalidation
    + * @IOMMU_VTD_QI_FLAGS_LEAF: The LEAF flag indicates whether only the
    + * leaf PTE caching needs to be invalidated
    + * and other paging structure caches can be
    + * preserved.
    + */
    +enum iommu_hwpt_vtd_s1_invalidate_flags {
    + IOMMU_VTD_QI_FLAGS_LEAF = 1 << 0,
    +};
    +
    +/**
    + * struct iommu_hwpt_vtd_s1_invalidate_desc - Intel VT-d stage-1 cache
    + * invalidation descriptor
    + * @addr: The start address of the addresses to be invalidated.
    + * @npages: Number of contiguous 4K pages to be invalidated.
    + * @flags: Combination of enum iommu_hwpt_vtd_s1_invalidate_flags
    + * @__reserved: Must be 0
    + *
    + * The Intel VT-d specific invalidation data for user-managed stage-1 cache
    + * invalidation under nested translation. Userspace uses this structure to
    + * tell host about the impacted caches after modifying the stage-1 page table.
    + *
    + * Invalidating all the caches related to the hw_pagetable by setting @addr
    + * to be 0 and @npages to be __aligned_u64(-1).
    + */
    +struct iommu_hwpt_vtd_s1_invalidate_desc {
    + __aligned_u64 addr;
    + __aligned_u64 npages;
    + __u32 flags;
    + __u32 __reserved;
    +};
    +
    +/**
    + * struct iommu_hwpt_vtd_s1_invalidate - Intel VT-d cache invalidation
    + * (IOMMU_HWPT_TYPE_VTD_S1)
    + * @flags: Must be 0
    + * @entry_size: Size in bytes of each cache invalidation request
    + * @entry_nr_uptr: User pointer to the number of invalidation requests.
    + * Kernel reads it to get the number of requests and
    + * updates the buffer with the number of requests that
    + * have been processed successfully. This pointer must
    + * point to a __u32 type of memory location.
    + * @inv_data_uptr: Pointer to the cache invalidation requests
    + *
    + * The Intel VT-d specific invalidation data for a set of cache invalidation
    + * requests. Kernel loops the requests one-by-one and stops when failure
    + * is encountered. The number of handled requests is reported to user by
    + * writing the buffer pointed by @entry_nr_uptr.
    + */
    +struct iommu_hwpt_vtd_s1_invalidate {
    + __u32 flags;
    + __u32 entry_size;
    + __aligned_u64 entry_nr_uptr;
    + __aligned_u64 inv_data_uptr;
    +};
    +
    /**
    * struct iommu_hwpt_invalidate - ioctl(IOMMU_HWPT_INVALIDATE)
    * @size: sizeof(struct iommu_hwpt_invalidate)
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-07-24 13:15    [W:4.249 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site