From: Jason Gunthorpe <jgg@nvidia.com>
To: Yi Liu <yi.l.liu@intel.com>
Cc: joro@8bytes.org, alex.williamson@redhat.com,
kevin.tian@intel.com, robin.murphy@arm.com,
baolu.lu@linux.intel.com, 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.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: Re: [PATCH v4 05/17] iommufd: Separate kernel-managed HWPT alloc/destroy/abort functions
Date: Tue, 10 Oct 2023 15:49:32 -0300 [thread overview]
Message-ID: <20231010184932.GT3952@nvidia.com> (raw)
In-Reply-To: <20230921075138.124099-6-yi.l.liu@intel.com>
On Thu, Sep 21, 2023 at 12:51:26AM -0700, Yi Liu wrote:
> From: Nicolin Chen <nicolinc@nvidia.com>
>
> As one of the previous commits mentioned, a user-managed HWPT will have
> some different attributes/members. It'd be more clear by having separate
> allocators. Since the existing iommufd_hw_pagetable_alloc() serves well
> kernel-managed HWPTs, apply some minimal updates to mark it as a kernel-
> managed HWPT allocator.
>
> Also, add a pair of function pointers (abort and destroy) in the struct,
> to separate different cleanup routines. Then rename the existing cleanup
> functions to iommufd_kernel_managed_hwpt_destroy/abort() linked to the
> HWPT in the allocator.
>
> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
> Signed-off-by: Yi Liu <yi.l.liu@intel.com>
> ---
> drivers/iommu/iommufd/hw_pagetable.c | 34 ++++++++++++++++++++-----
> drivers/iommu/iommufd/iommufd_private.h | 3 +++
> 2 files changed, 31 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/iommu/iommufd/hw_pagetable.c b/drivers/iommu/iommufd/hw_pagetable.c
> index 554a9c3d740f..1cc7178121d1 100644
> --- a/drivers/iommu/iommufd/hw_pagetable.c
> +++ b/drivers/iommu/iommufd/hw_pagetable.c
> @@ -8,7 +8,7 @@
> #include "../iommu-priv.h"
> #include "iommufd_private.h"
>
> -void iommufd_hw_pagetable_destroy(struct iommufd_object *obj)
> +static void iommufd_kernel_managed_hwpt_destroy(struct iommufd_object *obj)
> {
> struct iommufd_hw_pagetable *hwpt =
> container_of(obj, struct iommufd_hw_pagetable, obj);
> @@ -27,7 +27,12 @@ void iommufd_hw_pagetable_destroy(struct iommufd_object *obj)
> refcount_dec(&hwpt->ioas->obj.users);
> }
>
> -void iommufd_hw_pagetable_abort(struct iommufd_object *obj)
> +void iommufd_hw_pagetable_destroy(struct iommufd_object *obj)
> +{
> + container_of(obj, struct iommufd_hw_pagetable, obj)->destroy(obj);
> +}
> +
> +static void iommufd_kernel_managed_hwpt_abort(struct iommufd_object *obj)
> {
> struct iommufd_hw_pagetable *hwpt =
> container_of(obj, struct iommufd_hw_pagetable, obj);
> @@ -42,6 +47,11 @@ void iommufd_hw_pagetable_abort(struct iommufd_object *obj)
> iommufd_hw_pagetable_destroy(obj);
> }
>
> +void iommufd_hw_pagetable_abort(struct iommufd_object *obj)
> +{
> + container_of(obj, struct iommufd_hw_pagetable, obj)->abort(obj);
> +}
> +
> int iommufd_hw_pagetable_enforce_cc(struct iommufd_hw_pagetable *hwpt)
> {
> if (hwpt->enforce_cache_coherency)
> @@ -57,7 +67,7 @@ int iommufd_hw_pagetable_enforce_cc(struct iommufd_hw_pagetable *hwpt)
> }
>
> /**
> - * iommufd_hw_pagetable_alloc() - Get an iommu_domain for a device
> + * iommufd_hw_pagetable_alloc() - Get a kernel-managed iommu_domain for a device
> * @ictx: iommufd context
> * @ioas: IOAS to associate the domain with
> * @idev: Device to get an iommu_domain for
> @@ -66,9 +76,9 @@ int iommufd_hw_pagetable_enforce_cc(struct iommufd_hw_pagetable *hwpt)
> * @user_data: Optional user_data pointer
> * @immediate_attach: True if idev should be attached to the hwpt
> *
> - * Allocate a new iommu_domain and return it as a hw_pagetable. The HWPT
> - * will be linked to the given ioas and upon return the underlying iommu_domain
> - * is fully popoulated.
> + * Allocate a new iommu_domain (must be IOMMU_DOMAIN_UNMANAGED) and return it as
> + * a kernel-managed hw_pagetable. The HWPT will be linked to the given ioas and
> + * upon return the underlying iommu_domain is fully popoulated.
> *
> * The caller must hold the ioas->mutex until after
> * iommufd_object_abort_and_destroy() or iommufd_object_finalize() is called on
> @@ -103,6 +113,8 @@ iommufd_hw_pagetable_alloc(struct iommufd_ctx *ictx, struct iommufd_ioas *ioas,
> /* Pairs with iommufd_hw_pagetable_destroy() */
> refcount_inc(&ioas->obj.users);
> hwpt->ioas = ioas;
> + hwpt->abort = iommufd_kernel_managed_hwpt_abort;
> + hwpt->destroy = iommufd_kernel_managed_hwpt_destroy;
>
> if (ops->domain_alloc_user) {
> hwpt->domain = ops->domain_alloc_user(idev->dev, flags,
> @@ -121,6 +133,16 @@ iommufd_hw_pagetable_alloc(struct iommufd_ctx *ictx, struct iommufd_ioas *ioas,
> }
> }
>
> + if (WARN_ON_ONCE(hwpt->domain->type != IOMMU_DOMAIN_UNMANAGED)) {
> + rc = -EINVAL;
> + goto out_abort;
> + }
> + /* Driver is buggy by mixing user-managed op in kernel-managed ops */
> + if (WARN_ON_ONCE(hwpt->domain->ops->cache_invalidate_user)) {
> + rc = -EINVAL;
> + goto out_abort;
> + }
> +
> /*
> * Set the coherency mode before we do iopt_table_add_domain() as some
> * iommus have a per-PTE bit that controls it and need to decide before
> diff --git a/drivers/iommu/iommufd/iommufd_private.h b/drivers/iommu/iommufd/iommufd_private.h
> index 1d3b1a74e854..3e89c3d530f3 100644
> --- a/drivers/iommu/iommufd/iommufd_private.h
> +++ b/drivers/iommu/iommufd/iommufd_private.h
> @@ -234,6 +234,9 @@ struct iommufd_hw_pagetable {
> struct iommufd_object obj;
> struct iommu_domain *domain;
>
> + void (*abort)(struct iommufd_object *obj);
> + void (*destroy)(struct iommufd_object *obj);
> +
> union {
> struct { /* kernel-managed */
> struct iommufd_ioas *ioas;
I think if you are doing this you are trying too hard to share the
struct.. Defaintely want to avoid function pointers in general, and
function pointers in a writable struct in particular.
An if of some sort in the two functions would be clearer
Jason
next prev parent reply other threads:[~2023-10-10 18:49 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 ` [PATCH v4 01/17] iommu: Add hwpt_type with user_data for domain_alloc_user op Yi Liu
2023-09-21 12:10 ` 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 [this message]
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=20231010184932.GT3952@nvidia.com \
--to=jgg@nvidia.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=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.l.liu@intel.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