All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pranjal Shrivastava <praan@google.com>
To: Nicolin Chen <nicolinc@nvidia.com>
Cc: jgg@nvidia.com, kevin.tian@intel.com, corbet@lwn.net,
	will@kernel.org, bagasdotme@gmail.com, robin.murphy@arm.com,
	joro@8bytes.org, thierry.reding@gmail.com, vdumpa@nvidia.com,
	jonathanh@nvidia.com, shuah@kernel.org, jsnitsel@redhat.com,
	nathan@kernel.org, peterz@infradead.org, yi.l.liu@intel.com,
	mshavit@google.com, zhangzekun11@huawei.com,
	iommu@lists.linux.dev, linux-doc@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-tegra@vger.kernel.org, linux-kselftest@vger.kernel.org,
	patches@lists.linux.dev, mochs@nvidia.com,
	alok.a.tiwari@oracle.com, vasant.hegde@amd.com
Subject: Re: [PATCH v2 11/22] iommufd: Add for-driver helpers iommufd_vcmdq_depend/undepend()
Date: Tue, 29 Apr 2025 12:40:07 +0000	[thread overview]
Message-ID: <aBDIpz7w8wxIn_AF@google.com> (raw)
In-Reply-To: <a25c9454c17663f9e79b37bc2908bf3a99856be6.1745646960.git.nicolinc@nvidia.com>

On Fri, Apr 25, 2025 at 10:58:06PM -0700, Nicolin Chen wrote:
> NVIDIA Virtual Command Queue is one of the iommufd users exposing vIOMMU
> features to user space VMs. Its hardware has a strict rule when mapping
> and unmapping multiple global CMDQVs to/from a VM-owned VINTF, requiring
> mappings in ascending order and unmappings in descending order.
> 
> The tegra241-cmdqv driver can apply the rule for a mapping in the LVCMDQ
> allocation handler, however it can't do the same for an unmapping since
> the destroy op returns void.
> 
> Add iommufd_vcmdq_depend/undepend() for-driver helpers, allowing LVCMDQ
> allocator to refcount_inc() a sibling LVCMDQ object and LVCMDQ destroyer
> to refcount_dec().
> 
> This is a bit of compromise, because a driver might end up with abusing
> the API that deadlocks the objects. So restrict the API to a dependency
> between two driver-allocated objects of the same type, as iommufd would
> unlikely build any core-level dependency in this case.
> 
> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
> ---
>  include/linux/iommufd.h        | 47 ++++++++++++++++++++++++++++++++++
>  drivers/iommu/iommufd/driver.c | 28 ++++++++++++++++++++
>  2 files changed, 75 insertions(+)
> 
> diff --git a/include/linux/iommufd.h b/include/linux/iommufd.h
> index e91381aaec5a..5dff154e8ce1 100644
> --- a/include/linux/iommufd.h
> +++ b/include/linux/iommufd.h
> @@ -232,6 +232,10 @@ struct iommufd_object *_iommufd_object_alloc(struct iommufd_ctx *ictx,
>  					     size_t size,
>  					     enum iommufd_object_type type);
>  void iommufd_object_abort(struct iommufd_ctx *ictx, struct iommufd_object *obj);
> +int iommufd_object_depend(struct iommufd_object *obj_dependent,
> +			  struct iommufd_object *obj_depended);
> +void iommufd_object_undepend(struct iommufd_object *obj_dependent,
> +			     struct iommufd_object *obj_depended);
>  struct device *iommufd_viommu_find_dev(struct iommufd_viommu *viommu,
>  				       unsigned long vdev_id);
>  int iommufd_viommu_get_vdev_id(struct iommufd_viommu *viommu,
> @@ -252,6 +256,17 @@ static inline void iommufd_object_abort(struct iommufd_ctx *ictx,
>  {
>  }
>  
> +static inline int iommufd_object_depend(struct iommufd_object *obj_dependent,
> +					struct iommufd_object *obj_depended)
> +{
> +	return -EOPNOTSUPP;
> +}
> +
> +static inline void iommufd_object_undepend(struct iommufd_object *obj_dependent,
> +					   struct iommufd_object *obj_depended)
> +{
> +}
> +
>  static inline struct device *
>  iommufd_viommu_find_dev(struct iommufd_viommu *viommu, unsigned long vdev_id)
>  {
> @@ -329,4 +344,36 @@ static inline int iommufd_viommu_report_event(struct iommufd_viommu *viommu,
>  		static_assert(offsetof(typeof(*drv_struct), member.obj) == 0); \
>  		iommufd_object_abort(ictx, &drv_struct->member.obj);           \
>  	})
> +
> +/*
> + * Helpers for IOMMU driver to build/destroy a dependency between two sibling
> + * structures created by one of the allocators above
> + */
> +#define iommufd_vcmdq_depend(vcmdq_dependent, vcmdq_depended, member)          \
> +	({                                                                     \
> +		static_assert(__same_type(struct iommufd_object,               \
> +					  vcmdq_dependent->member.obj));       \
> +		static_assert(offsetof(typeof(*vcmdq_dependent),               \
> +					      member.obj) == 0);               \
> +		static_assert(__same_type(struct iommufd_object,               \
> +					  vcmdq_depended->member.obj));        \
> +		static_assert(offsetof(typeof(*vcmdq_depended),                \
> +					      member.obj) == 0);               \
> +		iommufd_object_depend(&vcmdq_dependent->member.obj,            \
> +				      &vcmdq_depended->member.obj);            \
> +	})
> +
> +#define iommufd_vcmdq_undepend(vcmdq_dependent, vcmdq_depended, member)        \
> +	({                                                                     \
> +		static_assert(__same_type(struct iommufd_object,               \
> +					  vcmdq_dependent->member.obj));       \
> +		static_assert(offsetof(typeof(*vcmdq_dependent),               \
> +					      member.obj) == 0);               \
> +		static_assert(__same_type(struct iommufd_object,               \
> +					  vcmdq_depended->member.obj));        \
> +		static_assert(offsetof(typeof(*vcmdq_depended),                \
> +					      member.obj) == 0);               \
> +		iommufd_object_undepend(&vcmdq_dependent->member.obj,          \
> +					&vcmdq_depended->member.obj);          \
> +	})
>  #endif
> diff --git a/drivers/iommu/iommufd/driver.c b/drivers/iommu/iommufd/driver.c
> index 7980a09761c2..fb7f8fe40f95 100644
> --- a/drivers/iommu/iommufd/driver.c
> +++ b/drivers/iommu/iommufd/driver.c
> @@ -50,6 +50,34 @@ void iommufd_object_abort(struct iommufd_ctx *ictx, struct iommufd_object *obj)
>  }
>  EXPORT_SYMBOL_NS_GPL(iommufd_object_abort, "IOMMUFD");
>  
> +/* A per-structure helper is available in include/linux/iommufd.h */
> +int iommufd_object_depend(struct iommufd_object *obj_dependent,
> +			  struct iommufd_object *obj_depended)
> +{
> +	/* Reject self dependency that dead locks */
> +	if (obj_dependent == obj_depended)
> +		return -EINVAL;
> +	/* Only support dependency between two objects of the same type */
> +	if (obj_dependent->type != obj_depended->type)
> +		return -EINVAL;
> +
> +	refcount_inc(&obj_depended->users);
> +	return 0;
> +}
> +EXPORT_SYMBOL_NS_GPL(iommufd_object_depend, "IOMMUFD");
> +
> +/* A per-structure helper is available in include/linux/iommufd.h */
> +void iommufd_object_undepend(struct iommufd_object *obj_dependent,
> +			     struct iommufd_object *obj_depended)
> +{
> +	if (WARN_ON_ONCE(obj_dependent == obj_depended ||
> +			 obj_dependent->type != obj_depended->type))
> +		return;
> +
> +	refcount_dec(&obj_depended->users);
> +}
> +EXPORT_SYMBOL_NS_GPL(iommufd_object_undepend, "IOMMUFD");
> +
>  /* Caller should xa_lock(&viommu->vdevs) to protect the return value */
>  struct device *iommufd_viommu_find_dev(struct iommufd_viommu *viommu,
>  				       unsigned long vdev_id)

If I'm getting this right, I think we are setting up dependencies like:
vcmdq[2] -> vcmdq[1] -> vcmdq[0] based on refcounts of each object,
which ensures that the unmaps happen in descending order..

If that's right, Is it fair to have iommufd_vcmdq_depend/undepend in the
core code itself? Since it's a driver-level limitation, I think we
should just have iommufd_object_depend/undepend in the core code and the
iommufd_vcmdq_depend/undepend can move into the CMDQV driver?

> -- 
> 2.43.0
> 

Thanks,
Praan


  parent reply	other threads:[~2025-04-29 14:13 UTC|newest]

Thread overview: 146+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-26  5:57 [PATCH v2 00/22] iommufd: Add vIOMMU infrastructure (Part-4 vCMDQ) Nicolin Chen
2025-04-26  5:57 ` [PATCH v2 01/22] iommufd/viommu: Add driver-allocated vDEVICE support Nicolin Chen
2025-04-27  6:23   ` Baolu Lu
2025-04-28  0:41     ` Tian, Kevin
2025-04-28 18:08       ` Nicolin Chen
2025-04-26  5:57 ` [PATCH v2 02/22] iommu: Pass in a driver-level user data structure to viommu_alloc op Nicolin Chen
2025-04-27  6:31   ` Baolu Lu
2025-04-28 17:19     ` Nicolin Chen
2025-04-28 17:28       ` Pranjal Shrivastava
2025-04-26  5:57 ` [PATCH v2 03/22] iommufd/viommu: Allow driver-specific user data for a vIOMMU object Nicolin Chen
2025-04-27  6:36   ` Baolu Lu
2025-04-28 17:52   ` Pranjal Shrivastava
2025-04-30 14:58   ` ALOK TIWARI
2025-04-26  5:57 ` [PATCH v2 04/22] iommu: Add iommu_copy_struct_to_user helper Nicolin Chen
2025-04-27  6:39   ` Baolu Lu
2025-04-28 17:50   ` Pranjal Shrivastava
2025-04-28 18:21     ` Nicolin Chen
2025-04-29  8:31       ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 05/22] iommufd: Add iommufd_struct_destroy to revert iommufd_viommu_alloc Nicolin Chen
2025-04-27  6:55   ` Baolu Lu
2025-04-28 17:24     ` Nicolin Chen
2025-04-26  5:58 ` [PATCH v2 06/22] iommufd/selftest: Support user_data in mock_viommu_alloc Nicolin Chen
2025-04-28 18:56   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 07/22] iommufd/selftest: Add covearge for viommu data Nicolin Chen
2025-04-28 19:02   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 08/22] iommufd: Abstract iopt_pin_pages and iopt_unpin_pages helpers Nicolin Chen
2025-04-27  7:22   ` Baolu Lu
2025-04-28 17:41     ` Nicolin Chen
2025-05-05 15:01       ` Jason Gunthorpe
2025-05-05 15:44         ` Nicolin Chen
2025-05-05 15:55           ` Jason Gunthorpe
2025-05-05 16:03             ` Nicolin Chen
2025-05-05 16:05               ` Jason Gunthorpe
2025-05-05 16:19                 ` Nicolin Chen
2025-05-05 16:56                   ` Jason Gunthorpe
2025-04-28 20:14   ` Pranjal Shrivastava
2025-04-28 22:12     ` Nicolin Chen
2025-04-28 23:34       ` Nicolin Chen
2025-04-29 18:03         ` Pranjal Shrivastava
2025-05-06  9:36   ` Tian, Kevin
2025-05-06 19:17     ` Nicolin Chen
2025-05-07  7:22       ` Tian, Kevin
2025-05-07  7:36         ` Nicolin Chen
2025-05-07  7:51           ` Tian, Kevin
2025-04-26  5:58 ` [PATCH v2 09/22] iommufd/viommu: Introduce IOMMUFD_OBJ_VCMDQ and its related struct Nicolin Chen
2025-04-28  1:09   ` Baolu Lu
2025-04-28 18:10     ` Nicolin Chen
2025-05-05 15:02       ` Jason Gunthorpe
2025-05-05 15:45         ` Nicolin Chen
2025-04-28 21:01   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 10/22] iommufd/viommmu: Add IOMMUFD_CMD_VCMDQ_ALLOC ioctl Nicolin Chen
2025-04-28  1:32   ` Baolu Lu
2025-04-28 18:58     ` Nicolin Chen
2025-04-29  6:11       ` Baolu Lu
2025-04-28 12:12   ` Vasant Hegde
2025-04-28 20:02     ` Nicolin Chen
2025-04-29  5:34       ` Vasant Hegde
2025-04-29  6:45         ` Nicolin Chen
2025-04-29 10:22           ` Vasant Hegde
2025-04-29 17:14             ` Nicolin Chen
2025-04-30  4:22               ` Vasant Hegde
2025-04-30  8:01                 ` Nicolin Chen
2025-04-30 10:21                   ` Vasant Hegde
2025-05-06  9:25               ` Tian, Kevin
2025-05-06 20:12                 ` Nicolin Chen
2025-05-07  7:25                   ` Tian, Kevin
2025-05-07  7:37                     ` Nicolin Chen
2025-05-07 12:33                       ` Jason Gunthorpe
2025-05-07 20:51                         ` Nicolin Chen
2025-04-28 21:34   ` Pranjal Shrivastava
2025-04-28 22:44     ` Nicolin Chen
2025-04-29  8:28       ` Pranjal Shrivastava
2025-04-29 18:10         ` Pranjal Shrivastava
2025-04-29 18:15           ` Nicolin Chen
2025-04-29 18:57             ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 11/22] iommufd: Add for-driver helpers iommufd_vcmdq_depend/undepend() Nicolin Chen
2025-04-28  2:22   ` Baolu Lu
2025-04-28 18:17     ` Nicolin Chen
2025-04-29 12:40   ` Pranjal Shrivastava [this message]
2025-04-29 17:10     ` Nicolin Chen
2025-04-29 17:59       ` Pranjal Shrivastava
2025-04-29 18:07         ` Nicolin Chen
2025-04-29 18:44           ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 12/22] iommufd/selftest: Add coverage for IOMMUFD_CMD_VCMDQ_ALLOC Nicolin Chen
2025-04-26  5:58 ` [PATCH v2 13/22] iommufd: Add mmap interface Nicolin Chen
2025-04-28  2:50   ` Baolu Lu
2025-04-28 18:54     ` Nicolin Chen
2025-05-05 16:50     ` Jason Gunthorpe
2025-05-05 17:21       ` Nicolin Chen
2025-05-05 17:28         ` Jason Gunthorpe
2025-05-05 20:07           ` Nicolin Chen
2025-05-06  9:22             ` Tian, Kevin
2025-05-06 12:55               ` Jason Gunthorpe
2025-05-06 12:54             ` Jason Gunthorpe
2025-05-06 20:54               ` Nicolin Chen
2025-05-07 12:36                 ` Jason Gunthorpe
2025-05-07 20:49                   ` Nicolin Chen
2025-04-29 20:24   ` Pranjal Shrivastava
2025-04-29 20:34     ` Pranjal Shrivastava
2025-04-29 20:39       ` Nicolin Chen
2025-04-29 20:55         ` Pranjal Shrivastava
2025-04-29 21:05           ` Nicolin Chen
2025-04-29 21:35             ` Pranjal Shrivastava
2025-04-29 21:46               ` Nicolin Chen
2025-04-29 21:57                 ` Pranjal Shrivastava
2025-05-05 16:55                 ` Jason Gunthorpe
2025-05-05 17:27                   ` Nicolin Chen
2025-05-05 17:31                     ` Jason Gunthorpe
2025-05-05 19:50                       ` Nicolin Chen
2025-05-06 12:52                         ` Jason Gunthorpe
2025-05-06 19:30                           ` Nicolin Chen
2025-05-07 12:39                             ` Jason Gunthorpe
2025-05-07 21:09                               ` Nicolin Chen
2025-05-07 22:08                                 ` Jason Gunthorpe
2025-05-08  3:49                                   ` Nicolin Chen
2025-05-08  9:15                                     ` Tian, Kevin
2025-05-08 12:12                                       ` Jason Gunthorpe
2025-05-08 17:14                                         ` Nicolin Chen
2025-05-05 18:47                   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 14/22] iommufd/selftest: Add coverage for the new " Nicolin Chen
2025-04-26  5:58 ` [PATCH v2 15/22] Documentation: userspace-api: iommufd: Update vCMDQ Nicolin Chen
2025-04-28 14:31   ` Bagas Sanjaya
2025-04-28 19:00     ` Nicolin Chen
2025-04-26  5:58 ` [PATCH v2 16/22] iommu/arm-smmu-v3-iommufd: Add vsmmu_alloc impl op Nicolin Chen
2025-04-29 21:36   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 17/22] iommu/arm-smmu-v3-iommufd: Support implementation-defined hw_info Nicolin Chen
2025-04-29 21:44   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 18/22] iommu/tegra241-cmdqv: Use request_threaded_irq Nicolin Chen
2025-04-29 21:47   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 19/22] iommu/tegra241-cmdqv: Simplify deinit flow in tegra241_cmdqv_remove_vintf() Nicolin Chen
2025-04-29 22:05   ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 20/22] iommu/tegra241-cmdqv: Do not statically map LVCMDQs Nicolin Chen
2025-04-29 20:43   ` ALOK TIWARI
2025-04-29 22:32   ` Pranjal Shrivastava
2025-04-29 22:37     ` Nicolin Chen
2025-04-26  5:58 ` [PATCH v2 21/22] iommu/tegra241-cmdqv: Add user-space use support Nicolin Chen
2025-04-29 19:47   ` ALOK TIWARI
2025-04-29 21:12     ` Nicolin Chen
2025-04-30 21:59   ` Pranjal Shrivastava
2025-04-30 22:39     ` Nicolin Chen
2025-05-01  0:54       ` Nicolin Chen
2025-05-01 21:46         ` Pranjal Shrivastava
2025-05-01 21:45       ` Pranjal Shrivastava
2025-04-26  5:58 ` [PATCH v2 22/22] iommu/tegra241-cmdqv: Add IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV support Nicolin Chen
2025-04-30 15:07   ` ALOK TIWARI
2025-04-30 22:03   ` Pranjal Shrivastava

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=aBDIpz7w8wxIn_AF@google.com \
    --to=praan@google.com \
    --cc=alok.a.tiwari@oracle.com \
    --cc=bagasdotme@gmail.com \
    --cc=corbet@lwn.net \
    --cc=iommu@lists.linux.dev \
    --cc=jgg@nvidia.com \
    --cc=jonathanh@nvidia.com \
    --cc=joro@8bytes.org \
    --cc=jsnitsel@redhat.com \
    --cc=kevin.tian@intel.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=mochs@nvidia.com \
    --cc=mshavit@google.com \
    --cc=nathan@kernel.org \
    --cc=nicolinc@nvidia.com \
    --cc=patches@lists.linux.dev \
    --cc=peterz@infradead.org \
    --cc=robin.murphy@arm.com \
    --cc=shuah@kernel.org \
    --cc=thierry.reding@gmail.com \
    --cc=vasant.hegde@amd.com \
    --cc=vdumpa@nvidia.com \
    --cc=will@kernel.org \
    --cc=yi.l.liu@intel.com \
    --cc=zhangzekun11@huawei.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.