From: Yi Liu <yi.l.liu@intel.com>
To: joro@8bytes.org, alex.williamson@redhat.com, jgg@nvidia.com,
kevin.tian@intel.com, robin.murphy@arm.com,
baolu.lu@linux.intel.com
Cc: cohuck@redhat.com, eric.auger@redhat.com, nicolinc@nvidia.com,
kvm@vger.kernel.org, mjrosato@linux.ibm.com,
chao.p.peng@linux.intel.com, yi.l.liu@intel.com,
yi.y.sun@linux.intel.com, peterx@redhat.com, jasowang@redhat.com,
shameerali.kolothum.thodi@huawei.com, lulu@redhat.com,
suravee.suthikulpanit@amd.com, iommu@lists.linux.dev,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
zhenzhong.duan@intel.com, joao.m.martins@oracle.com
Subject: [PATCH v4 01/17] iommu: Add hwpt_type with user_data for domain_alloc_user op
Date: Thu, 21 Sep 2023 00:51:22 -0700 [thread overview]
Message-ID: <20230921075138.124099-2-yi.l.liu@intel.com> (raw)
In-Reply-To: <20230921075138.124099-1-yi.l.liu@intel.com>
domain_alloc_user op already accepts user flags for domain allocation,
add hwpt_type and user_data support as well. This op chooses to make the
special parameters opaque to the core. This suits the current usage model
where accessing any of the IOMMU device special parameters does require
a userspace driver that matches the kernel driver. If a need for common
parameters, implemented similarly by several drivers, arises then there
is room in the design to grow a generic parameter set as well.
Define enum iommu_hwpt_type to differentiate the user parameters used by
different iommu vendor drivers in the future. For backward compatibility
and the allocations without any specified hwpt_type or user parameters,
add an IOMMU_HWPT_TYPE_DEFAULT in the list.
Also, add a struct iommu_user_data as a package of data_ptr and data_len
from an iommufd core uAPI structure, then provide a helper function for
a driver to run data length sanity and copy a defined hwpt_type specific
driver user data.
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 | 5 ++-
drivers/iommu/iommufd/hw_pagetable.c | 4 ++-
drivers/iommu/iommufd/selftest.c | 5 ++-
include/linux/iommu.h | 51 ++++++++++++++++++++++++++--
include/uapi/linux/iommufd.h | 8 +++++
5 files changed, 67 insertions(+), 6 deletions(-)
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index 491bcde1ff96..4ffc939a71f0 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -4075,7 +4075,10 @@ 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,
+ enum iommu_hwpt_type hwpt_type,
+ 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 26a8a818ffa3..1d7378a6cbb3 100644
--- a/drivers/iommu/iommufd/hw_pagetable.c
+++ b/drivers/iommu/iommufd/hw_pagetable.c
@@ -96,7 +96,9 @@ 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,
+ IOMMU_HWPT_TYPE_DEFAULT,
+ 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 b54cbfb1862b..2205a552e570 100644
--- a/drivers/iommu/iommufd/selftest.c
+++ b/drivers/iommu/iommufd/selftest.c
@@ -171,7 +171,10 @@ 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,
+ enum iommu_hwpt_type hwpt_type,
+ 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 660dc1931dc9..12e12e5563e6 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -14,6 +14,7 @@
#include <linux/err.h>
#include <linux/of.h>
#include <uapi/linux/iommu.h>
+#include <uapi/linux/iommufd.h>
#define IOMMU_READ (1 << 0)
#define IOMMU_WRITE (1 << 1)
@@ -227,6 +228,41 @@ struct iommu_iotlb_gather {
bool queued;
};
+/**
+ * struct iommu_user_data - iommu driver specific user space data info
+ * @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
+ * Both @uptr and @len should be just copied from an iommufd core uAPI structure
+ */
+struct iommu_user_data {
+ void __user *uptr;
+ size_t len;
+};
+
+/**
+ * iommu_copy_user_data - Copy iommu driver specific user space data
+ * @dst_data: Pointer to an iommu driver specific user data that is defined in
+ * include/uapi/linux/iommufd.h
+ * @src_data: Pointer to a struct iommu_user_data for user space data info
+ * @data_len: Length of current user data structure, i.e. sizeof(struct _dst)
+ * @min_len: Initial length of user data structure for backward compatibility.
+ * This should be offsetofend using the last member in the user data
+ * struct that was initially added to include/uapi/linux/iommufd.h
+ */
+static inline int iommu_copy_user_data(void *dst_data,
+ const struct iommu_user_data *src_data,
+ size_t data_len, size_t min_len)
+{
+ if (WARN_ON(!dst_data || !src_data))
+ return -EINVAL;
+ if (src_data->len < min_len || data_len < src_data->len)
+ return -EINVAL;
+ return copy_struct_from_user(dst_data, data_len,
+ src_data->uptr, src_data->len);
+}
+
/**
* struct iommu_ops - iommu ops and capabilities
* @capable: check capability
@@ -237,11 +273,17 @@ struct iommu_iotlb_gather {
* @domain_alloc: allocate iommu domain
* @domain_alloc_user: Allocate an iommu domain corresponding to the input
* parameters like flags defined as enum iommufd_ioas_map_flags
+ * and the @hwpt_type that is defined as enum iommu_hwpt_type
* in include/uapi/linux/iommufd.h. Different from the
* domain_alloc op, it requires iommu driver to fully
* initialize a new domain including the generic iommu_domain
- * struct. Upon success, a domain is returned. Upon failure,
- * ERR_PTR must be returned.
+ * struct.
+ * 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 be IOMMU_DOMAIN_UNMANAGED type.
+ * 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
@@ -274,7 +316,10 @@ 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,
+ enum iommu_hwpt_type hwpt_type,
+ 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 4a7c5c8fdbb4..3c8660fe9bb1 100644
--- a/include/uapi/linux/iommufd.h
+++ b/include/uapi/linux/iommufd.h
@@ -357,6 +357,14 @@ enum iommufd_hwpt_alloc_flags {
IOMMU_HWPT_ALLOC_NEST_PARENT = 1 << 0,
};
+/**
+ * enum iommu_hwpt_type - IOMMU HWPT Type
+ * @IOMMU_HWPT_TYPE_DEFAULT: default
+ */
+enum iommu_hwpt_type {
+ IOMMU_HWPT_TYPE_DEFAULT,
+};
+
/**
* struct iommu_hwpt_alloc - ioctl(IOMMU_HWPT_ALLOC)
* @size: sizeof(struct iommu_hwpt_alloc)
--
2.34.1
next prev parent reply other threads:[~2023-09-21 19:05 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-21 7:51 [PATCH v4 00/17] iommufd: Add nesting infrastructure Yi Liu
2023-09-21 7:51 ` Yi Liu [this message]
2023-09-21 12:10 ` [PATCH v4 01/17] iommu: Add hwpt_type with user_data for domain_alloc_user op Baolu Lu
2023-09-21 20:58 ` Nicolin Chen
2023-09-25 13:05 ` Jason Gunthorpe
2023-09-25 18:17 ` Nicolin Chen
2023-09-25 6:22 ` Yi Liu
2023-09-25 8:01 ` Baolu Lu
2023-09-25 13:00 ` Jason Gunthorpe
2023-09-21 12:12 ` Baolu Lu
2023-09-21 16:44 ` Jason Gunthorpe
2023-09-22 9:47 ` Robin Murphy
2023-09-25 6:17 ` Yi Liu
2023-09-25 12:59 ` Jason Gunthorpe
2023-09-26 6:37 ` Tian, Kevin
2023-09-26 16:29 ` Jason Gunthorpe
2023-09-27 1:08 ` Tian, Kevin
2023-10-07 9:38 ` Yi Liu
2023-09-26 6:56 ` Tian, Kevin
2023-10-12 9:12 ` Yi Liu
2023-10-13 11:42 ` Yi Liu
2023-10-13 22:22 ` Nicolin Chen
2023-10-10 16:58 ` Jason Gunthorpe
2023-10-12 9:11 ` Yi Liu
2023-10-12 13:39 ` Jason Gunthorpe
2023-10-13 4:33 ` Yi Liu
2023-10-13 14:04 ` Jason Gunthorpe
2023-10-13 17:56 ` Nicolin Chen
2023-10-16 3:28 ` Yi Liu
2023-10-16 11:54 ` Jason Gunthorpe
2023-10-16 18:17 ` Nicolin Chen
2023-10-17 8:51 ` Yi Liu
2023-10-17 9:28 ` Tian, Kevin
2023-10-18 6:12 ` Yi Liu
2023-10-18 16:37 ` Jason Gunthorpe
2023-10-18 16:51 ` Nicolin Chen
2023-10-13 0:34 ` Nicolin Chen
2023-10-13 14:03 ` Jason Gunthorpe
2023-09-21 7:51 ` [PATCH v4 02/17] iommu: Add nested domain support Yi Liu
2023-10-10 17:21 ` Jason Gunthorpe
2023-10-12 9:13 ` Yi Liu
2023-10-14 0:47 ` Nicolin Chen
2023-09-21 7:51 ` [PATCH v4 03/17] iommufd: Unite all kernel-managed members into a struct Yi Liu
2023-09-26 7:46 ` Tian, Kevin
2023-10-07 10:08 ` Yan Zhao
2023-10-09 4:13 ` Yi Liu
2023-10-09 5:13 ` Yan Zhao
2023-10-10 3:26 ` Yi Liu
2023-09-21 7:51 ` [PATCH v4 04/17] iommufd: Pass in hwpt_type/user_data to iommufd_hw_pagetable_alloc() Yi Liu
2023-09-21 7:51 ` [PATCH v4 05/17] iommufd: Separate kernel-managed HWPT alloc/destroy/abort functions Yi Liu
2023-09-26 7:57 ` Tian, Kevin
2023-10-10 18:49 ` Jason Gunthorpe
2023-10-12 19:09 ` Jason Gunthorpe
2023-10-13 7:13 ` Tian, Kevin
2023-10-13 14:05 ` Jason Gunthorpe
2023-10-16 8:26 ` Tian, Kevin
2023-10-16 12:02 ` Jason Gunthorpe
2023-09-21 7:51 ` [PATCH v4 06/17] iommufd: Add shared alloc_fn function pointer and mutex pointer Yi Liu
2023-09-21 7:51 ` [PATCH v4 07/17] iommufd: Add user-managed hw_pagetable support Yi Liu
2023-09-26 8:14 ` Tian, Kevin
2023-10-14 0:08 ` Nicolin Chen
2023-09-21 7:51 ` [PATCH v4 08/17] iommufd: Always setup MSI and anforce cc on kernel-managed domains Yi Liu
2023-09-26 8:16 ` Tian, Kevin
2023-10-14 0:44 ` Nicolin Chen
2023-10-16 8:48 ` Tian, Kevin
2023-10-16 11:57 ` Jason Gunthorpe
2023-10-17 8:52 ` Tian, Kevin
2023-10-17 15:53 ` Jason Gunthorpe
2023-10-17 19:58 ` Nicolin Chen
2023-10-18 16:51 ` Jason Gunthorpe
2023-10-19 1:56 ` Tian, Kevin
2023-10-19 23:53 ` Jason Gunthorpe
2023-10-20 2:43 ` Tian, Kevin
2023-10-20 13:55 ` Jason Gunthorpe
2023-10-20 18:59 ` Nicolin Chen
2023-10-21 16:38 ` Jason Gunthorpe
2023-10-23 0:18 ` Nicolin Chen
2023-10-23 2:53 ` Tian, Kevin
2023-10-23 18:42 ` Nicolin Chen
2023-10-23 13:59 ` Jason Gunthorpe
2023-10-23 18:49 ` Nicolin Chen
2023-10-18 2:32 ` Baolu Lu
2023-10-17 9:05 ` Tian, Kevin
2023-09-21 7:51 ` [PATCH v4 09/17] iommufd/device: Add helpers to enforce/remove device reserved regions Yi Liu
2023-10-07 7:20 ` Yan Zhao
2023-10-07 9:27 ` Nicolin Chen
2023-09-21 7:51 ` [PATCH v4 10/17] iommufd: Support IOMMU_HWPT_ALLOC allocation with user data Yi Liu
2023-10-13 15:19 ` Jason Gunthorpe
2023-10-13 20:58 ` Nicolin Chen
2023-10-14 0:07 ` Jason Gunthorpe
2023-10-14 0:51 ` Nicolin Chen
2023-10-16 7:03 ` Yi Liu
2023-10-16 11:59 ` Jason Gunthorpe
2023-10-16 18:44 ` Nicolin Chen
2023-10-17 8:55 ` Yi Liu
2023-10-17 15:50 ` Jason Gunthorpe
2023-10-17 19:32 ` Nicolin Chen
2023-09-21 7:51 ` [PATCH v4 11/17] iommufd: Add IOMMU_HWPT_INVALIDATE Yi Liu
2023-09-21 7:51 ` [PATCH v4 12/17] iommufd/selftest: Rework TEST_LENGTH to test min_size explicitly Yi Liu
2023-09-21 7:51 ` [PATCH v4 13/17] iommufd/selftest: Add nested domain allocation for mock domain Yi Liu
2023-09-21 7:51 ` [PATCH v4 14/17] iommufd/selftest: Add coverage for IOMMU_HWPT_ALLOC with nested HWPTs Yi Liu
2023-09-21 7:51 ` [PATCH v4 15/17] iommufd/selftest: Add mock_domain_cache_invalidate_user support Yi Liu
2023-09-21 7:51 ` [PATCH v4 16/17] iommufd/selftest: Add IOMMU_TEST_OP_MD_CHECK_IOTLB test op Yi Liu
2023-09-21 7:51 ` [PATCH v4 17/17] iommufd/selftest: Add coverage for IOMMU_HWPT_INVALIDATE ioctl Yi Liu
2023-10-10 16:53 ` [PATCH v4 00/17] iommufd: Add nesting infrastructure Jason Gunthorpe
2023-10-12 8:45 ` Yi Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230921075138.124099-2-yi.l.liu@intel.com \
--to=yi.l.liu@intel.com \
--cc=alex.williamson@redhat.com \
--cc=baolu.lu@linux.intel.com \
--cc=chao.p.peng@linux.intel.com \
--cc=cohuck@redhat.com \
--cc=eric.auger@redhat.com \
--cc=iommu@lists.linux.dev \
--cc=jasowang@redhat.com \
--cc=jgg@nvidia.com \
--cc=joao.m.martins@oracle.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=lulu@redhat.com \
--cc=mjrosato@linux.ibm.com \
--cc=nicolinc@nvidia.com \
--cc=peterx@redhat.com \
--cc=robin.murphy@arm.com \
--cc=shameerali.kolothum.thodi@huawei.com \
--cc=suravee.suthikulpanit@amd.com \
--cc=yi.y.sun@linux.intel.com \
--cc=zhenzhong.duan@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®