From: Jason Gunthorpe <jgg@nvidia.com>
To: Xu Yilun <yilun.xu@linux.intel.com>
Cc: "Tian, Kevin" <kevin.tian@intel.com>,
"will@kernel.org" <will@kernel.org>,
"aneesh.kumar@kernel.org" <aneesh.kumar@kernel.org>,
"iommu@lists.linux.dev" <iommu@lists.linux.dev>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"joro@8bytes.org" <joro@8bytes.org>,
"robin.murphy@arm.com" <robin.murphy@arm.com>,
"shuah@kernel.org" <shuah@kernel.org>,
"nicolinc@nvidia.com" <nicolinc@nvidia.com>,
"aik@amd.com" <aik@amd.com>,
"Williams, Dan J" <dan.j.williams@intel.com>,
"baolu.lu@linux.intel.com" <baolu.lu@linux.intel.com>,
"Xu, Yilun" <yilun.xu@intel.com>
Subject: Re: [PATCH v3 2/5] iommufd: Destroy vdevice on idevice destroy
Date: Mon, 7 Jul 2025 09:25:02 -0300 [thread overview]
Message-ID: <20250707122502.GS1410929@nvidia.com> (raw)
In-Reply-To: <aGuoZUaNOgclC2uU@yilunxu-OptiPlex-7050>
On Mon, Jul 07, 2025 at 06:58:45PM +0800, Xu Yilun wrote:
> I still see concerns here. The pre_destroy() and wait_event is before the
> idev's users count decreasing to 0, which means a new user could get
> in.
Hum, yes it seems we could get a race with another vdevice being
created during idevice destruction, but I think this could be fixed in
a straightforward way with a flag 'being destroyed' in the idev under
the lock if it is the only issue
> The worse thing is the new user could hold the shortterm_users until
> pre_destroy(), but there isn't a second pre_destroy()...
This is OK, the point of pre_destroy is to remove the reference
cycle. So it needs to prevent new vdevs from establishing references
and remove the reference from any existing vdev.
refcounts outside of this cycle are handled by the existing
mechanisms - pre_destroy is only about the refcount loop.
> I think extending the life of shortterm_users at runtime makes things
> complex.
Well, it keeps the refcounting working the way it is supposed
to. Holding a pointer without a reference is nasty and is creating
alot of these weird problems and strange flows. Hold the refcount
along with the pointer and things follow the normal patterns.
There is nothing inherently wrong with shortterm users for this
besides its name. Think of it is as 'wait for users', and we clearly
want to wait for the vdev user to put back its idev reference.
I think there are too many gyrations with refcounts in this version
below. It is hard to reason about if zero refcounts are re-elevated to
non-zero.
> vdev = iommufd_get_vdevice(idev->ictx, idev->vdev->obj.id);
> - if (IS_ERR(vdev))
> + if (IS_ERR(vdev)) {
> + /*
> + * vdev is removed from xarray by userspace, but is not
> + * destroyed. We should wait for vdev real destruction before
> + * idev destruction.
> + */
> + iommufd_object_destroy_wait_prepare(&idev->obj);
> goto out_unlock;
This is now really weird, we are mangling the refcounts and the
reasoning why it is safe with the concurrent vdev thread is tricky..
> +/*
> + * iommufd_object_destroy_wait_complete() should be called by first-destroyer
> + * in its destroy() ops. The first-destroyer should not access the
> + * later-destroyer after calling this function.
> + */
> +static inline void
> +iommufd_object_destroy_wait_complete(struct iommufd_ctx *ictx,
> + struct iommufd_object *to_destroy)
> +{
> + if (refcount_read(&to_destroy->users) != 0 ||
> + refcount_read(&to_destroy->shortterm_users) != 1)
> + return;
> +
> + refcount_dec(&to_destroy->shortterm_users);
> + wake_up_interruptible_all(&ictx->destroy_wait);
> +}
This looks weird too, why is refcount_read safe? That is usually not
how this kind of logic is written.
I'm not sure this is OK, it is not an obvious known-good pattern for
lifetime management.
Jason
next prev parent reply other threads:[~2025-07-07 12:25 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-27 3:38 [PATCH v3 0/5] iommufd: Destroy vdevice on device unbind Xu Yilun
2025-06-27 3:38 ` [PATCH v3 1/5] iommufd: Add iommufd_object_tombstone_user() helper Xu Yilun
2025-06-30 3:08 ` Baolu Lu
2025-06-30 7:24 ` Xu Yilun
2025-06-30 5:52 ` Tian, Kevin
2025-06-30 6:41 ` Xu Yilun
2025-06-30 19:50 ` Nicolin Chen
2025-07-08 8:45 ` Xu Yilun
2025-06-27 3:38 ` [PATCH v3 2/5] iommufd: Destroy vdevice on idevice destroy Xu Yilun
2025-06-30 5:08 ` Baolu Lu
2025-07-08 8:34 ` Xu Yilun
2025-06-30 6:27 ` Tian, Kevin
2025-06-30 10:18 ` Xu Yilun
2025-06-30 14:50 ` Jason Gunthorpe
2025-07-01 9:19 ` Xu Yilun
2025-07-01 12:13 ` Jason Gunthorpe
2025-07-02 2:23 ` Xu Yilun
2025-07-02 9:13 ` Tian, Kevin
2025-07-02 12:40 ` Jason Gunthorpe
2025-07-03 4:32 ` Tian, Kevin
2025-07-03 11:21 ` Jason Gunthorpe
2025-07-07 10:58 ` Xu Yilun
2025-07-07 12:25 ` Jason Gunthorpe [this message]
2025-07-07 19:41 ` Xu Yilun
2025-06-30 19:34 ` Nicolin Chen
2025-07-08 8:12 ` Xu Yilun
2025-06-27 3:38 ` [PATCH v3 3/5] iommufd/vdevice: Remove struct device reference from struct vdevice Xu Yilun
2025-06-30 5:11 ` Baolu Lu
2025-07-04 15:06 ` Jason Gunthorpe
2025-06-27 3:38 ` [PATCH v3 4/5] iommufd/selftest: Explicitly skip tests for inapplicable variant Xu Yilun
2025-07-04 15:07 ` Jason Gunthorpe
2025-06-27 3:38 ` [PATCH v3 5/5] iommufd/selftest: Add coverage for vdevice tombstone Xu Yilun
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=20250707122502.GS1410929@nvidia.com \
--to=jgg@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=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nicolinc@nvidia.com \
--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 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.