From: Jacob Pan <jacob.jun.pan@linux.intel.com>
To: Jean-Philippe Brucker <jean-philippe@linaro.org>
Cc: "Tian, Kevin" <kevin.tian@intel.com>,
Jacob Pan <jacob.pan.linux@gmail.com>,
Raj Ashok <ashok.raj@intel.com>,
David Woodhouse <dwmw2@infradead.org>,
LKML <linux-kernel@vger.kernel.org>,
iommu@lists.linux-foundation.org,
Jean-Philippe Brucker <jean-philippe@linaro.com>,
Wu Hao <hao.wu@intel.com>
Subject: Re: [PATCH v2 4/9] iommu/ioasid: Add reference couting functions
Date: Tue, 8 Sep 2020 13:30:46 -0700 [thread overview]
Message-ID: <20200908133046.194e0577@jacob-builder> (raw)
In-Reply-To: <20200825101937.GA3252704@myrica>
On Tue, 25 Aug 2020 12:19:37 +0200
Jean-Philippe Brucker <jean-philippe@linaro.org> wrote:
> On Fri, Aug 21, 2020 at 09:35:13PM -0700, Jacob Pan wrote:
> > There can be multiple users of an IOASID, each user could have
> > hardware contexts associated with the IOASID. In order to align
> > lifecycles, reference counting is introduced in this patch. It is
> > expected that when an IOASID is being freed, each user will drop a
> > reference only after its context is cleared.
> >
> > Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
> > ---
> > drivers/iommu/ioasid.c | 113
> > +++++++++++++++++++++++++++++++++++++++++++++++++
> > include/linux/ioasid.h | 4 ++ 2 files changed, 117 insertions(+)
> >
> > diff --git a/drivers/iommu/ioasid.c b/drivers/iommu/ioasid.c
> > index f73b3dbfc37a..5f31d63c75b1 100644
> > --- a/drivers/iommu/ioasid.c
> > +++ b/drivers/iommu/ioasid.c
> > @@ -717,6 +717,119 @@ int ioasid_set_for_each_ioasid(struct
> > ioasid_set *set, EXPORT_SYMBOL_GPL(ioasid_set_for_each_ioasid);
> >
> > /**
> > + * IOASID refcounting rules
> > + * - ioasid_alloc() set initial refcount to 1
> > + *
> > + * - ioasid_free() decrement and test refcount.
> > + * If refcount is 0, ioasid will be freed. Deleted from the
> > system-wide
> > + * xarray as well as per set xarray. The IOASID will be
> > returned to the
> > + * pool and available for new allocations.
> > + *
> > + * If recount is non-zero, mark IOASID as
> > IOASID_STATE_FREE_PENDING.
> > + * No new reference can be added. The IOASID is not returned
> > to the pool
> > + * for reuse.
> > + * After free, ioasid_get() will return error but
> > ioasid_find() and other
> > + * non refcount adding APIs will continue to work until the
> > last reference
> > + * is dropped
> > + *
> > + * - ioasid_get() get a reference on an active IOASID
> > + *
> > + * - ioasid_put() decrement and test refcount of the IOASID.
> > + * If refcount is 0, ioasid will be freed. Deleted from the
> > system-wide
> > + * xarray as well as per set xarray. The IOASID will be
> > returned to the
> > + * pool and available for new allocations.
> > + * Do nothing if refcount is non-zero.
> > + *
> > + * - ioasid_find() does not take reference, caller must hold
> > reference
> > + *
> > + * ioasid_free() can be called multiple times without error until
> > all refs are
> > + * dropped.
> > + */
>
> Since you already document this in ioasid.rst, I'm not sure the
> comment is necessary. Maybe the doc for _free/_put would be better in
> the function's documentation.
>
good point. will move the free/put to doc.
> > +
> > +int ioasid_get_locked(struct ioasid_set *set, ioasid_t ioasid)
> > +{
> > + struct ioasid_data *data;
> > +
> > + data = xa_load(&active_allocator->xa, ioasid);
> > + if (!data) {
> > + pr_err("Trying to get unknown IOASID %u\n",
> > ioasid);
> > + return -EINVAL;
> > + }
> > + if (data->state == IOASID_STATE_FREE_PENDING) {
> > + pr_err("Trying to get IOASID being freed%u\n",
> > ioasid);
> > + return -EBUSY;
> > + }
> > +
> > + if (set && data->set != set) {
> > + pr_err("Trying to get IOASID not in set%u\n",
> > ioasid);
> > + /* data found but does not belong to the set */
> > + return -EACCES;
> > + }
> > + refcount_inc(&data->users);
> > +
> > + return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(ioasid_get_locked);
>
> Is it necessary to export the *_locked variant? Who'd call them and
> how would they acquire the lock?
>
It is used by KVM inside the atomic notifier handler. Notifier chain is
invoked under the lock.
> > +
> > +/**
> > + * ioasid_get - Obtain a reference of an ioasid
> > + * @set
> > + * @ioasid
>
> Can be dropped. The doc checker will throw a warning, though.
>
yes, will do
> > + *
> > + * Check set ownership if @set is non-null.
> > + */
> > +int ioasid_get(struct ioasid_set *set, ioasid_t ioasid)
> > +{
> > + int ret = 0;
>
> No need to initialize ret
>
right,
> > +
> > + spin_lock(&ioasid_allocator_lock);
> > + ret = ioasid_get_locked(set, ioasid);
> > + spin_unlock(&ioasid_allocator_lock);
> > +
> > + return ret;
> > +}
> > +EXPORT_SYMBOL_GPL(ioasid_get);
> > +
> > +void ioasid_put_locked(struct ioasid_set *set, ioasid_t ioasid)
> > +{
> > + struct ioasid_data *data;
> > +
> > + data = xa_load(&active_allocator->xa, ioasid);
> > + if (!data) {
> > + pr_err("Trying to put unknown IOASID %u\n",
> > ioasid);
> > + return;
> > + }
> > +
> > + if (set && data->set != set) {
> > + pr_err("Trying to drop IOASID not in the set
> > %u\n", ioasid);
> > + return;
> > + }
> > +
> > + if (!refcount_dec_and_test(&data->users)) {
> > + pr_debug("%s: IOASID %d has %d remainning users\n",
> > + __func__, ioasid,
> > refcount_read(&data->users));
> > + return;
> > + }
> > + ioasid_do_free(data);
> > +}
> > +EXPORT_SYMBOL_GPL(ioasid_put_locked);
> > +
> > +/**
> > + * ioasid_put - Drop a reference of an ioasid
> > + * @set
> > + * @ioasid
> > + *
> > + * Check set ownership if @set is non-null.
> > + */
> > +void ioasid_put(struct ioasid_set *set, ioasid_t ioasid)
> > +{
> > + spin_lock(&ioasid_allocator_lock);
> > + ioasid_put_locked(set, ioasid);
> > + spin_unlock(&ioasid_allocator_lock);
> > +}
> > +EXPORT_SYMBOL_GPL(ioasid_put);
> > +
> > +/**
> > * ioasid_find - Find IOASID data
> > * @set: the IOASID set
> > * @ioasid: the IOASID to find
> > diff --git a/include/linux/ioasid.h b/include/linux/ioasid.h
> > index 412d025d440e..310abe4187a3 100644
> > --- a/include/linux/ioasid.h
> > +++ b/include/linux/ioasid.h
> > @@ -76,6 +76,10 @@ int ioasid_attach_data(ioasid_t ioasid, void
> > *data); int ioasid_register_allocator(struct ioasid_allocator_ops
> > *allocator); void ioasid_unregister_allocator(struct
> > ioasid_allocator_ops *allocator); void ioasid_is_in_set(struct
> > ioasid_set *set, ioasid_t ioasid); +int ioasid_get(struct
> > ioasid_set *set, ioasid_t ioasid); +int ioasid_get_locked(struct
> > ioasid_set *set, ioasid_t ioasid); +void ioasid_put(struct
> > ioasid_set *set, ioasid_t ioasid); +void ioasid_put_locked(struct
> > ioasid_set *set, ioasid_t ioasid);
>
> Please also add the stubs for !CONFIG_IOASID.
>
yes, will do.
Thanks a lot!
> Thanks,
> Jean
>
> > int ioasid_set_for_each_ioasid(struct ioasid_set *sdata,
> > void (*fn)(ioasid_t id, void *data),
> > void *data);
> > --
> > 2.7.4
> >
> _______________________________________________
> iommu mailing list
> iommu@lists.linux-foundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/iommu
[Jacob Pan]
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
next prev parent reply other threads:[~2020-09-08 20:28 UTC|newest]
Thread overview: 111+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-22 4:35 [PATCH v2 0/9] IOASID extensions for guest SVA Jacob Pan
2020-08-22 4:35 ` Jacob Pan
2020-08-22 4:35 ` [PATCH v2 1/9] docs: Document IO Address Space ID (IOASID) APIs Jacob Pan
2020-08-22 4:35 ` Jacob Pan
2020-08-23 7:05 ` Lu Baolu
2020-08-23 7:05 ` Lu Baolu
2020-08-28 17:01 ` Jacob Pan
2020-08-28 17:01 ` Jacob Pan
2020-08-24 10:32 ` Jean-Philippe Brucker
2020-08-24 10:32 ` Jean-Philippe Brucker
2020-08-27 16:21 ` Auger Eric
2020-08-27 16:21 ` Auger Eric
2020-09-01 16:56 ` Jacob Pan
2020-09-01 16:56 ` Jacob Pan
2020-09-07 8:03 ` Auger Eric
2020-09-07 8:03 ` Auger Eric
2020-09-08 17:29 ` Jacob Pan
2020-08-28 22:24 ` Jacob Pan
2020-08-28 22:24 ` Jacob Pan
2020-08-22 4:35 ` [PATCH v2 2/9] iommu/ioasid: Rename ioasid_set_data() Jacob Pan
2020-08-22 4:35 ` Jacob Pan
2020-08-24 18:29 ` Jean-Philippe Brucker
2020-08-24 18:29 ` Jean-Philippe Brucker
2020-09-01 11:51 ` Auger Eric
2020-09-01 11:51 ` Auger Eric
2020-08-22 4:35 ` [PATCH v2 3/9] iommu/ioasid: Introduce ioasid_set APIs Jacob Pan
2020-08-22 4:35 ` Jacob Pan
2020-08-22 12:53 ` kernel test robot
2020-08-22 12:53 ` kernel test robot
2020-08-22 12:53 ` kernel test robot
2020-08-24 2:24 ` Lu Baolu
2020-08-24 2:24 ` Lu Baolu
2020-09-01 21:28 ` Jacob Pan
2020-09-01 21:28 ` Jacob Pan
2020-09-02 2:39 ` Lu Baolu
2020-09-02 2:39 ` Lu Baolu
2020-08-24 18:28 ` Jean-Philippe Brucker
2020-08-24 18:28 ` Jean-Philippe Brucker
2020-08-24 18:30 ` Randy Dunlap
2020-08-24 18:30 ` Randy Dunlap
2020-09-02 21:46 ` Jacob Pan
2020-09-02 21:46 ` Jacob Pan
2020-08-24 18:34 ` Randy Dunlap
2020-08-24 18:34 ` Randy Dunlap
2020-09-02 21:47 ` Jacob Pan
2020-09-02 21:47 ` Jacob Pan
2020-09-02 21:44 ` Jacob Pan
2020-09-02 21:44 ` Jacob Pan
2020-09-01 11:51 ` Auger Eric
2020-09-01 11:51 ` Auger Eric
2020-09-03 21:07 ` Jacob Pan
2020-09-03 21:07 ` Jacob Pan
2020-09-07 8:04 ` Auger Eric
2020-09-07 8:04 ` Auger Eric
2020-08-22 4:35 ` [PATCH v2 4/9] iommu/ioasid: Add reference couting functions Jacob Pan
2020-08-22 4:35 ` Jacob Pan
2020-08-24 2:26 ` Lu Baolu
2020-08-24 2:26 ` Lu Baolu
2020-08-25 10:20 ` Jean-Philippe Brucker
2020-08-25 10:20 ` Jean-Philippe Brucker
2020-08-25 10:19 ` Jean-Philippe Brucker
2020-08-25 10:19 ` Jean-Philippe Brucker
2020-09-08 20:30 ` Jacob Pan [this message]
2020-09-01 12:13 ` Auger Eric
2020-09-01 12:13 ` Auger Eric
2020-09-08 20:49 ` Jacob Pan
2020-09-24 18:29 ` Shameerali Kolothum Thodi
2020-09-24 18:29 ` Shameerali Kolothum Thodi
2020-08-22 4:35 ` [PATCH v2 5/9] iommu/ioasid: Introduce ioasid_set private ID Jacob Pan
2020-08-22 4:35 ` Jacob Pan
2020-08-22 8:36 ` kernel test robot
2020-08-22 8:36 ` kernel test robot
2020-08-22 8:36 ` kernel test robot
2020-08-22 9:03 ` kernel test robot
2020-08-22 9:03 ` kernel test robot
2020-08-22 9:03 ` kernel test robot
2020-08-25 10:22 ` Jean-Philippe Brucker
2020-08-25 10:22 ` Jean-Philippe Brucker
2020-09-08 22:19 ` Jacob Pan
2020-09-08 22:19 ` Jacob Pan
2020-09-01 15:38 ` Auger Eric
2020-09-01 15:38 ` Auger Eric
2020-09-08 22:40 ` Jacob Pan
2020-09-08 22:40 ` Jacob Pan
2020-09-10 9:18 ` Auger Eric
2020-09-10 9:18 ` Auger Eric
2020-08-22 4:35 ` [PATCH v2 6/9] iommu/ioasid: Introduce notification APIs Jacob Pan
2020-08-22 4:35 ` Jacob Pan
2020-08-25 10:26 ` Jean-Philippe Brucker
2020-08-25 10:26 ` Jean-Philippe Brucker
2020-09-09 20:37 ` Jacob Pan
2020-09-09 20:37 ` Jacob Pan
2020-09-01 16:49 ` Auger Eric
2020-09-01 16:49 ` Auger Eric
2020-09-09 22:58 ` Jacob Pan
2020-09-09 22:58 ` Jacob Pan
2020-09-10 8:59 ` Auger Eric
2020-09-10 8:59 ` Auger Eric
2020-08-22 4:35 ` [PATCH v2 7/9] iommu/vt-d: Listen to IOASID notifications Jacob Pan
2020-08-22 4:35 ` Jacob Pan
2020-09-01 17:03 ` Auger Eric
2020-09-01 17:03 ` Auger Eric
2020-09-10 4:54 ` Jacob Pan
2020-08-22 4:35 ` [PATCH v2 8/9] iommu/vt-d: Send IOASID bind/unbind notifications Jacob Pan
2020-08-22 4:35 ` Jacob Pan
2020-08-22 4:35 ` [PATCH v2 9/9] iommu/vt-d: Store guest PASID during bind Jacob Pan
2020-08-22 4:35 ` Jacob Pan
2020-09-01 17:08 ` Auger Eric
2020-09-01 17:08 ` Auger Eric
2020-09-10 17:12 ` Jacob Pan
2020-09-10 17:12 ` Jacob Pan
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=20200908133046.194e0577@jacob-builder \
--to=jacob.jun.pan@linux.intel.com \
--cc=ashok.raj@intel.com \
--cc=dwmw2@infradead.org \
--cc=hao.wu@intel.com \
--cc=iommu@lists.linux-foundation.org \
--cc=jacob.pan.linux@gmail.com \
--cc=jean-philippe@linaro.com \
--cc=jean-philippe@linaro.org \
--cc=kevin.tian@intel.com \
--cc=linux-kernel@vger.kernel.org \
/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.