lkml.org 
[lkml]   [2023]   [Oct]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 02/10] iommu: Pass in parent domain with user_data to domain_alloc_user op
    Date
    domain_alloc_user op already accepts user flags for domain allocation, add
    a parent domain pointer and a driver specific user data support as well.

    Add a struct iommu_user_data as a bundle of data_ptr/data_len/type from an
    iommufd core uAPI structure. Make the user data opaque to the core, since
    a userspace driver must match the kernel driver. In the future, if drivers
    share some common parameter, there would be a generic parameter as well.

    Define an enum iommu_hwpt_data_type (with IOMMU_HWPT_DATA_NONE type) for
    iommu drivers to add their own driver specific user data per hw_pagetable.

    Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
    Co-developed-by: Nicolin Chen <nicolinc@nvidia.com>
    Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
    Signed-off-by: Yi Liu <yi.l.liu@intel.com>
    ---
    drivers/iommu/intel/iommu.c | 4 +++-
    drivers/iommu/iommufd/hw_pagetable.c | 3 ++-
    drivers/iommu/iommufd/selftest.c | 4 +++-
    include/linux/iommu.h | 27 ++++++++++++++++++++++++---
    include/uapi/linux/iommufd.h | 8 ++++++++
    5 files changed, 40 insertions(+), 6 deletions(-)

    diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
    index 017aed5813d8..8d78149e793e 100644
    --- a/drivers/iommu/intel/iommu.c
    +++ b/drivers/iommu/intel/iommu.c
    @@ -4075,7 +4075,9 @@ static struct iommu_domain *intel_iommu_domain_alloc(unsigned type)
    }

    static struct iommu_domain *
    -intel_iommu_domain_alloc_user(struct device *dev, u32 flags)
    +intel_iommu_domain_alloc_user(struct device *dev, u32 flags,
    + struct iommu_domain *parent,
    + const struct iommu_user_data *user_data)
    {
    struct iommu_domain *domain;
    struct intel_iommu *iommu;
    diff --git a/drivers/iommu/iommufd/hw_pagetable.c b/drivers/iommu/iommufd/hw_pagetable.c
    index 8b3d2875d642..548079c8ca0a 100644
    --- a/drivers/iommu/iommufd/hw_pagetable.c
    +++ b/drivers/iommu/iommufd/hw_pagetable.c
    @@ -96,7 +96,8 @@ iommufd_hw_pagetable_alloc(struct iommufd_ctx *ictx, struct iommufd_ioas *ioas,
    hwpt->ioas = ioas;

    if (ops->domain_alloc_user) {
    - hwpt->domain = ops->domain_alloc_user(idev->dev, flags);
    + hwpt->domain = ops->domain_alloc_user(idev->dev, flags,
    + NULL, NULL);
    if (IS_ERR(hwpt->domain)) {
    rc = PTR_ERR(hwpt->domain);
    hwpt->domain = NULL;
    diff --git a/drivers/iommu/iommufd/selftest.c b/drivers/iommu/iommufd/selftest.c
    index fe7e3c7d933a..2bfe8dc9adc3 100644
    --- a/drivers/iommu/iommufd/selftest.c
    +++ b/drivers/iommu/iommufd/selftest.c
    @@ -171,7 +171,9 @@ static struct iommu_domain *mock_domain_alloc(unsigned int iommu_domain_type)
    }

    static struct iommu_domain *
    -mock_domain_alloc_user(struct device *dev, u32 flags)
    +mock_domain_alloc_user(struct device *dev, u32 flags,
    + struct iommu_domain *parent,
    + const struct iommu_user_data *user_data)
    {
    struct iommu_domain *domain;

    diff --git a/include/linux/iommu.h b/include/linux/iommu.h
    index ce08a3c41446..cdb989b853a5 100644
    --- a/include/linux/iommu.h
    +++ b/include/linux/iommu.h
    @@ -231,6 +231,21 @@ struct iommu_iotlb_gather {
    bool queued;
    };

    +/**
    + * struct iommu_user_data - iommu driver specific user space data info
    + * @type: The data type of the user buffer
    + * @uptr: Pointer to the user buffer for copy_from_user()
    + * @len: The length of the user buffer in bytes
    + *
    + * A user space data is an uAPI that is defined in include/uapi/linux/iommufd.h
    + * @type, @uptr and @len should be just copied from an iommufd core uAPI struct.
    + */
    +struct iommu_user_data {
    + unsigned int type;
    + void __user *uptr;
    + size_t len;
    +};
    +
    /**
    * struct iommu_ops - iommu ops and capabilities
    * @capable: check capability
    @@ -245,8 +260,12 @@ struct iommu_iotlb_gather {
    * parameters as defined in include/uapi/linux/iommufd.h.
    * Unlike @domain_alloc, it is called only by IOMMUFD and
    * must fully initialize the new domain before return.
    - * Upon success, a domain is returned. Upon failure,
    - * ERR_PTR must be returned.
    + * Upon success, if the @user_data is valid and the @parent
    + * points to a kernel-managed domain, the new domain must be
    + * IOMMU_DOMAIN_NESTED type; otherwise, the @parent must be
    + * NULL while the @user_data can be optionally provided, the
    + * new domain must support __IOMMU_DOMAIN_PAGING.
    + * Upon failure, ERR_PTR must be returned.
    * @probe_device: Add device to iommu driver handling
    * @release_device: Remove device from iommu driver handling
    * @probe_finalize: Do final setup work after the device is added to an IOMMU
    @@ -279,7 +298,9 @@ struct iommu_ops {

    /* Domain allocation and freeing by the iommu driver */
    struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type);
    - struct iommu_domain *(*domain_alloc_user)(struct device *dev, u32 flags);
    + struct iommu_domain *(*domain_alloc_user)(struct device *dev, u32 flags,
    + struct iommu_domain *parent,
    + const struct iommu_user_data *user_data);

    struct iommu_device *(*probe_device)(struct device *dev);
    void (*release_device)(struct device *dev);
    diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h
    index be7a95042677..b459bb7ac579 100644
    --- a/include/uapi/linux/iommufd.h
    +++ b/include/uapi/linux/iommufd.h
    @@ -356,6 +356,14 @@ enum iommufd_hwpt_alloc_flags {
    IOMMU_HWPT_ALLOC_NEST_PARENT = 1 << 0,
    };

    +/**
    + * enum iommu_hwpt_data_type - IOMMU HWPT Data Type
    + * @IOMMU_HWPT_DATA_NONE: no data
    + */
    +enum iommu_hwpt_data_type {
    + IOMMU_HWPT_DATA_NONE,
    +};
    +
    /**
    * struct iommu_hwpt_alloc - ioctl(IOMMU_HWPT_ALLOC)
    * @size: sizeof(struct iommu_hwpt_alloc)
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-10-20 11:21    [W:3.398 / U:0.944 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site