From: Jacob Pan <jacob.jun.pan@linux.intel.com>
To: Baolu Lu <baolu.lu@linux.intel.com>
Cc: LKML <linux-kernel@vger.kernel.org>,
iommu@lists.linux.dev, Jason Gunthorpe <jgg@nvidia.com>,
Joerg Roedel <joro@8bytes.org>,
Jean-Philippe Brucker <jean-philippe@linaro.com>,
Dave Hansen <dave.hansen@intel.com>,
Thomas Gleixner <tglx@linutronix.de>, X86 Kernel <x86@kernel.org>,
bp@alien8.de, "H. Peter Anvin" <hpa@zytor.com>,
Peter Zijlstra <peterz@infradead.org>,
corbet@lwn.net, vkoul@kernel.org, dmaengine@vger.kernel.org,
linux-doc@vger.kernel.org, Robin Murphy <robin.murphy@arm.com>,
Will Deacon <will@kernel.org>,
David Woodhouse <dwmw2@infradead.org>,
Raj Ashok <ashok.raj@intel.com>,
"Tian, Kevin" <kevin.tian@intel.com>, Yi Liu <yi.l.liu@intel.com>,
"Yu, Fenghua" <fenghua.yu@intel.com>,
Dave Jiang <dave.jiang@intel.com>,
Kirill Shutemov <kirill.shutemov@linux.intel.com>,
Tony Luck <tony.luck@intel.com>,
jacob.jun.pan@linux.intel.com
Subject: Re: [PATCH v5 4/7] iommu/sva: Stop using ioasid_set for SVA
Date: Fri, 10 Mar 2023 09:52:20 -0800 [thread overview]
Message-ID: <20230310095220.5dc3d8ac@jacob-builder> (raw)
In-Reply-To: <69753e4a-32f3-8760-ba1d-8286badd159e@linux.intel.com>
Hi Baolu,
On Fri, 10 Mar 2023 13:07:51 +0800, Baolu Lu <baolu.lu@linux.intel.com>
wrote:
> On 3/10/23 6:21 AM, Jacob Pan wrote:
> > From: Jason Gunthorpe <jgg@nvidia.com>
> >
> > Instead SVA drivers can use a simple global IDA to allocate PASIDs for
> > each mm_struct.
> >
> > Future work would be to allow drivers using the SVA APIs to reserve
> > global PASIDs from this IDA for their internal use, eg with the DMA API
> > PASID support.
> >
> > Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
> > Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
> > ---
> > v5:
> > - Put removing iommu_sva_find() to a separate patch (Kevin)
> > - Make pasid allocation range to be inclusive (Tina)
> > - Simplified return code handling (Baolu)
> > v4:
> > - Keep GFP_ATOMIC flag for PASID allocation, will changed to
> > GFP_KERNEL in a separate patch.
> > ---
> > drivers/iommu/iommu-sva.c | 42 +++++++++++++--------------------------
> > drivers/iommu/iommu-sva.h | 2 --
> > 2 files changed, 14 insertions(+), 30 deletions(-)
> >
> > diff --git a/drivers/iommu/iommu-sva.c b/drivers/iommu/iommu-sva.c
> > index 4f357ef14f04..b75711bdbe97 100644
> > --- a/drivers/iommu/iommu-sva.c
> > +++ b/drivers/iommu/iommu-sva.c
> > @@ -9,47 +9,33 @@
> > #include "iommu-sva.h"
> >
> > static DEFINE_MUTEX(iommu_sva_lock);
> > -static DECLARE_IOASID_SET(iommu_sva_pasid);
> > +static DEFINE_IDA(iommu_global_pasid_ida);
> >
> > -/**
> > - * iommu_sva_alloc_pasid - Allocate a PASID for the mm
> > - * @mm: the mm
> > - * @min: minimum PASID value (inclusive)
> > - * @max: maximum PASID value (inclusive)
> > - *
> > - * Try to allocate a PASID for this mm, or take a reference to the
> > existing one
> > - * provided it fits within the [@min, @max] range. On success the
> > PASID is
> > - * available in mm->pasid and will be available for the lifetime of
> > the mm.
> > - *
> > - * Returns 0 on success and < 0 on error.
> > - */
> > -int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t
> > max) +static int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t
> > min, ioasid_t max) {
> > int ret = 0;
> > - ioasid_t pasid;
> >
> > - if (min == INVALID_IOASID || max == INVALID_IOASID ||
> > - min == 0 || max < min)
> > + if (!pasid_valid(min) || !pasid_valid(max) ||
> > + min == 0 || max < min)
>
> No need to change above line.
>
> > return -EINVAL;
> >
> > mutex_lock(&iommu_sva_lock);
> > /* Is a PASID already associated with this mm? */
> > if (pasid_valid(mm->pasid)) {
> > - if (mm->pasid < min || mm->pasid >= max)
> > + if (mm->pasid < min || mm->pasid > max)
>
> I forgot why do we need to change above line. But it's better to put
> some comments there so that people don't need to dive into
> ioasid_alloc() to know the inclusion or exclusion of @min or @max.
>
just to be consistent for both limits. sure, we can add the comment.
> > ret = -EOVERFLOW;
> > goto out;
> > }
> >
> > - pasid = ioasid_alloc(&iommu_sva_pasid, min, max, mm);
> > - if (!pasid_valid(pasid))
> > - ret = -ENOMEM;
> > - else
> > - mm->pasid = pasid;
> > + ret = ida_alloc_range(&iommu_global_pasid_ida, min, max,
> > GFP_ATOMIC);
> > + if (ret < 0)
> > + goto out;
> > + mm->pasid = ret;
> > + ret = 0;
> > out:
> > mutex_unlock(&iommu_sva_lock);
> > return ret;
> > }
> > -EXPORT_SYMBOL_GPL(iommu_sva_alloc_pasid);
> >
> > /**
> > * iommu_sva_bind_device() - Bind a process address space to a device
> > @@ -221,8 +207,8 @@ iommu_sva_handle_iopf(struct iommu_fault *fault,
> > void *data)
> > void mm_pasid_drop(struct mm_struct *mm)
> > {
> > - if (pasid_valid(mm->pasid)) {
> > - ioasid_free(mm->pasid);
> > - mm->pasid = INVALID_IOASID;
> > - }
> > + if (likely(!pasid_valid(mm->pasid)))
> > + return;
> > +
> > + ida_free(&iommu_global_pasid_ida, mm->pasid);
>
> Any reason why do you drop "mm->pasid = INVALID_IOASID;" here?
>
mm_drop is called when mm gets released because "mm_count" becomes zero. so
there is no more mm_users. No one will see mm->pasid after this.
On the other hand, iommu_sva_bind_device() needs to hold mm_users refcount
so it won;t happen after mm_drop.
> > }
> > diff --git a/drivers/iommu/iommu-sva.h b/drivers/iommu/iommu-sva.h
> > index 102eae1817a2..c22d0174ad61 100644
> > --- a/drivers/iommu/iommu-sva.h
> > +++ b/drivers/iommu/iommu-sva.h
> > @@ -8,8 +8,6 @@
> > #include <linux/ioasid.h>
> > #include <linux/mm_types.h>
> >
> > -int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t
> > max); -
> > /* I/O Page fault */
> > struct device;
> > struct iommu_fault;
>
> Best regards,
> baolu
Thanks,
Jacob
next prev parent reply other threads:[~2023-03-10 17:49 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-09 22:21 [PATCH v5 0/7] Remove VT-d virtual command interface and IOASID Jacob Pan
2023-03-09 22:21 ` Jacob Pan
2023-03-09 22:21 ` [PATCH v5 1/7] iommu/vt-d: Remove virtual command interface Jacob Pan
2023-03-09 22:21 ` [PATCH v5 2/7] iommu/sva: Move PASID helpers to sva code Jacob Pan
2023-03-10 1:43 ` Jason Gunthorpe
2023-03-10 19:23 ` Jacob Pan
2023-03-10 20:00 ` Robin Murphy
2023-03-10 21:36 ` Jacob Pan
2023-03-09 22:21 ` [PATCH v5 3/7] iommu/sva: Remove PASID to mm lookup function Jacob Pan
2023-03-10 3:44 ` Baolu Lu
2023-03-09 22:21 ` [PATCH v5 4/7] iommu/sva: Stop using ioasid_set for SVA Jacob Pan
2023-03-10 5:07 ` Baolu Lu
2023-03-10 17:52 ` Jacob Pan [this message]
2023-03-09 22:21 ` [PATCH v5 5/7] iommu/sva: Use GFP_KERNEL for pasid allocation Jacob Pan
2023-03-09 22:21 ` [PATCH v5 6/7] iommu/ioasid: Rename INVALID_IOASID Jacob Pan
2023-03-09 22:21 ` [PATCH v5 7/7] iommu: Remove ioasid infrastructure 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=20230310095220.5dc3d8ac@jacob-builder \
--to=jacob.jun.pan@linux.intel.com \
--cc=ashok.raj@intel.com \
--cc=baolu.lu@linux.intel.com \
--cc=bp@alien8.de \
--cc=corbet@lwn.net \
--cc=dave.hansen@intel.com \
--cc=dave.jiang@intel.com \
--cc=dmaengine@vger.kernel.org \
--cc=dwmw2@infradead.org \
--cc=fenghua.yu@intel.com \
--cc=hpa@zytor.com \
--cc=iommu@lists.linux.dev \
--cc=jean-philippe@linaro.com \
--cc=jgg@nvidia.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=robin.murphy@arm.com \
--cc=tglx@linutronix.de \
--cc=tony.luck@intel.com \
--cc=vkoul@kernel.org \
--cc=will@kernel.org \
--cc=x86@kernel.org \
--cc=yi.l.liu@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.