mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Nicolin Chen <nicolinc@nvidia.com>
To: Xu Yilun <yilun.xu@linux.intel.com>
Cc: <jgg@nvidia.com>, <jgg@ziepe.ca>, <kevin.tian@intel.com>,
	<will@kernel.org>, <aneesh.kumar@kernel.org>,
	<iommu@lists.linux.dev>, <linux-kernel@vger.kernel.org>,
	<joro@8bytes.org>, <robin.murphy@arm.com>, <shuah@kernel.org>,
	<aik@amd.com>, <dan.j.williams@intel.com>,
	<baolu.lu@linux.intel.com>, <yilun.xu@intel.com>
Subject: Re: [PATCH v4 4/7] iommufd: Destroy vdevice on idevice destroy
Date: Fri, 11 Jul 2025 19:22:52 -0700	[thread overview]
Message-ID: <aHHG/H6IT9lvYy8x@Asurada-Nvidia> (raw)
In-Reply-To: <20250709040234.1773573-5-yilun.xu@linux.intel.com>

On Wed, Jul 09, 2025 at 12:02:31PM +0800, Xu Yilun wrote:
> Destroy iommufd_vdevice (vdev) on iommufd_idevice (idev) destruction so
> that vdev can't outlive idev.
> 
> idev represents the physical device bound to iommufd, while the vdev
> represents the virtual instance of the physical device in the VM. The
> lifecycle of the vdev should not be longer than idev. This doesn't
> cause real problem on existing use cases cause vdev doesn't impact the
> physical device, only provides virtualization information. But to
> extend vdev for Confidential Computing (CC), there are needs to do
> secure configuration for the vdev, e.g. TSM Bind/Unbind. These
> configurations should be rolled back on idev destroy, or the external
> driver (VFIO) functionality may be impact.
> 
> The idev is created by external driver so its destruction can't fail.
> The idev implements pre_destroy() op to actively remove its associated
> vdev before destroying itself. There are 3 cases on idev pre_destroy():
> 
>   1. vdev is already destroyed by userspace. No extra handling needed.
>   2. vdev is still alive. Use iommufd_object_tombstone_user() to
>      destroy vdev and tombstone the vdev ID.
>   3. vdev is being destroyed by userspace. The vdev ID is already
>      freed, but vdev destroy handler is not completed. This requires
>      multi-threads syncing - vdev holds idev's short term users
>      reference until vdev destruction completes, idev leverages
>      existing wait_shortterm mechanism for syncing.
> 
> Originally-by: Nicolin Chen <nicolinc@nvidia.com>
> Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
> Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
> Co-developed-by: Aneesh Kumar K.V (Arm) <aneesh.kumar@kernel.org>
> Signed-off-by: Aneesh Kumar K.V (Arm) <aneesh.kumar@kernel.org>
> Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com>

Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>

With a nit:

> @@ -155,6 +182,19 @@ int iommufd_vdevice_alloc_ioctl(struct iommufd_ucmd *ucmd)
>  	get_device(idev->dev);
>  	vdev->viommu = viommu;
>  	refcount_inc(&viommu->obj.users);
> +	/*
> +	 * A short term users reference is held on the idev so long as we have
> +	 * the pointer. iommufd_device_pre_destroy() will revoke it before the
> +	 * idev real destruction.
> +	 */
> +	vdev->idev = idev;

[..]

>  out_put_idev:
> -	iommufd_put_object(ucmd->ictx, &idev->obj);
> +	if (rc)
> +		iommufd_put_object(ucmd->ictx, &idev->obj);

So, this actually holds both the short term user and (covertly)
the regular user too.

Though it doesn't hurt to do that, holding the regular one seems
to be useless, because its refcount check is way behind this new
pre_destroy op:

183         if (flags & REMOVE_WAIT_SHORTTERM) {                                                                                                                                                                                                                                                                                                             
184                 ret = iommufd_object_dec_wait_shortterm(ictx, to_destroy);
==>			/* pre_destroy op */
...
214         if (!refcount_dec_if_one(&obj->users)) {
215                 ret = -EBUSY;
216                 goto err_xa;
217         }

So, I think we could just do, exactly reflecting the comments:
+	vdev->idev = idev;
+	refcount_inc(&idev->obj.shortterm_users);

Then, keep the exit patch unchanged.
out_put_idev:
	iommufd_put_object(ucmd->ictx, &idev->obj);

Thanks
Nicolin

  parent reply	other threads:[~2025-07-12  2:23 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-09  4:02 [PATCH v4 0/7] iommufd: Destroy vdevice on device unbind Xu Yilun
2025-07-09  4:02 ` [PATCH v4 1/7] iommufd/viommu: Roll back to use iommufd_object_alloc() for vdevice Xu Yilun
2025-07-10  7:32   ` Tian, Kevin
2025-07-10 18:26   ` Nicolin Chen
2025-07-11 17:42   ` Jason Gunthorpe
2025-07-09  4:02 ` [PATCH v4 2/7] iommufd: Add iommufd_object_tombstone_user() helper Xu Yilun
2025-07-10  7:35   ` Tian, Kevin
2025-07-10 19:08   ` Nicolin Chen
2025-07-11 15:02     ` Xu Yilun
2025-07-11 19:39       ` Nicolin Chen
2025-07-11 21:33       ` Jason Gunthorpe
2025-07-11 22:04         ` Nicolin Chen
2025-07-11 17:44   ` Jason Gunthorpe
2025-07-09  4:02 ` [PATCH v4 3/7] iommufd: Add a pre_destroy() op for objects Xu Yilun
2025-07-10  7:40   ` Tian, Kevin
2025-07-10 17:15     ` Jason Gunthorpe
2025-07-11  3:16       ` Tian, Kevin
2025-07-11  9:38         ` Xu Yilun
2025-07-11 22:09   ` Nicolin Chen
2025-07-09  4:02 ` [PATCH v4 4/7] iommufd: Destroy vdevice on idevice destroy Xu Yilun
2025-07-10  8:03   ` Tian, Kevin
2025-07-12  2:22   ` Nicolin Chen [this message]
2025-07-12 17:47     ` Xu Yilun
2025-07-14 16:40       ` Xu Yilun
2025-07-14 16:53         ` Jason Gunthorpe
2025-07-14 17:34           ` Nicolin Chen
2025-07-14 18:03             ` Xu Yilun
2025-07-12  2:26   ` Nicolin Chen
2025-07-09  4:02 ` [PATCH v4 5/7] iommufd/vdevice: Remove struct device reference from struct vdevice Xu Yilun
2025-07-10  8:04   ` Tian, Kevin
2025-07-12  2:27   ` Nicolin Chen
2025-07-09  4:02 ` [PATCH v4 6/7] iommufd/selftest: Explicitly skip tests for inapplicable variant Xu Yilun
2025-07-10  8:06   ` Tian, Kevin
2025-07-12  2:39   ` Nicolin Chen
2025-07-09  4:02 ` [PATCH v4 7/7] iommufd/selftest: Add coverage for vdevice tombstone Xu Yilun
2025-07-10  8:10   ` Tian, Kevin
2025-07-10  9:25     ` Xu Yilun
2025-07-11  3:12       ` Tian, Kevin

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=aHHG/H6IT9lvYy8x@Asurada-Nvidia \
    --to=nicolinc@nvidia.com \
    --cc=aik@amd.com \
    --cc=aneesh.kumar@kernel.org \
    --cc=baolu.lu@linux.intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=iommu@lists.linux.dev \
    --cc=jgg@nvidia.com \
    --cc=jgg@ziepe.ca \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=shuah@kernel.org \
    --cc=will@kernel.org \
    --cc=yilun.xu@intel.com \
    --cc=yilun.xu@linux.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®