From: Jean-Philippe Brucker <jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
To: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
Cc: kevin.tian-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org,
rafael-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org,
will.deacon-5wv7dgnIgG8@public.gmane.org,
christian.koenig-5C7GfCeVMHo@public.gmane.org,
alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
robin.murphy-5wv7dgnIgG8@public.gmane.org
Subject: [RFC PATCH 3/6] iommu/sva: Use external PASID allocator
Date: Fri, 19 Oct 2018 19:11:55 +0100 [thread overview]
Message-ID: <20181019181158.2395-4-jean-philippe.brucker@arm.com> (raw)
In-Reply-To: <20181019181158.2395-1-jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
Now that the IOASID allocator is in place, use it to allocate shared
PASIDs.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
---
drivers/iommu/Kconfig | 1 +
drivers/iommu/iommu-sva.c | 80 ++++++++++++++++++++++-----------------
2 files changed, 46 insertions(+), 35 deletions(-)
diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig
index e89f5a97d3c4..83a62634bbc4 100644
--- a/drivers/iommu/Kconfig
+++ b/drivers/iommu/Kconfig
@@ -116,6 +116,7 @@ config IOMMU_SVA
bool
select IOMMU_API
select MMU_NOTIFIER
+ select IOASID
config IOMMU_PAGE_FAULT
bool
diff --git a/drivers/iommu/iommu-sva.c b/drivers/iommu/iommu-sva.c
index ea34e7383ab4..28eaa617b4f0 100644
--- a/drivers/iommu/iommu-sva.c
+++ b/drivers/iommu/iommu-sva.c
@@ -6,6 +6,7 @@
*/
#include <linux/idr.h>
+#include <linux/ioasid.h>
#include <linux/iommu.h>
#include <linux/mmu_notifier.h>
#include <linux/sched/mm.h>
@@ -115,12 +116,7 @@ struct iommu_bond {
void *drvdata;
};
-/*
- * Because we're using an IDR, PASIDs are limited to 31 bits (the sign bit is
- * used for returning errors). In practice implementations will use at most 20
- * bits, which is the PCI limit.
- */
-static DEFINE_IDR(iommu_pasid_idr);
+static DECLARE_IOASID_SET(ioasid_shared);
/*
* For the moment this is an all-purpose lock. It serializes
@@ -163,18 +159,13 @@ static struct io_mm *io_mm_alloc(struct device *dev, struct mm_struct *mm,
INIT_LIST_HEAD(&io_mm->devices);
/* Leave kref as zero until the io_mm is fully initialized */
- idr_preload(GFP_KERNEL);
- spin_lock(&iommu_sva_lock);
- pasid = idr_alloc(&iommu_pasid_idr, io_mm, param->min_pasid,
- param->max_pasid + 1, GFP_ATOMIC);
- io_mm->pasid = pasid;
- spin_unlock(&iommu_sva_lock);
- idr_preload_end();
-
+ pasid = ioasid_alloc(&ioasid_shared, param->min_pasid,
+ param->max_pasid + 1, io_mm);
if (pasid < 0) {
ret = pasid;
goto err_free_mm;
}
+ io_mm->pasid = pasid;
ret = mmu_notifier_register(&io_mm->notifier, mm);
if (ret)
@@ -201,7 +192,7 @@ static struct io_mm *io_mm_alloc(struct device *dev, struct mm_struct *mm,
* 0 so no user could get a reference to it. Free it manually.
*/
spin_lock(&iommu_sva_lock);
- idr_remove(&iommu_pasid_idr, io_mm->pasid);
+ ioasid_free(pasid);
spin_unlock(&iommu_sva_lock);
err_free_mm:
@@ -231,7 +222,7 @@ static void io_mm_release(struct kref *kref)
io_mm = container_of(kref, struct io_mm, kref);
WARN_ON(!list_empty(&io_mm->devices));
- idr_remove(&iommu_pasid_idr, io_mm->pasid);
+ ioasid_free(io_mm->pasid);
/*
* If we're being released from mm exit, the notifier callback ->release
@@ -491,15 +482,44 @@ static struct mmu_notifier_ops iommu_mmu_notifier = {
.invalidate_range = iommu_notifier_invalidate_range,
};
+struct io_mm_bond_info {
+ struct device *dev;
+ struct mm_struct *mm;
+ struct io_mm *io_mm;
+};
+
+static int io_mm_compare_bond(ioasid_t pasid, void *priv, void *data)
+{
+ struct iommu_bond *bond;
+ struct io_mm *io_mm = priv;
+ struct io_mm_bond_info *info = data;
+
+ if (io_mm->mm != info->mm || !io_mm_get_locked(io_mm))
+ /* Keep looking */
+ return 0;
+
+ /* Is it already bound to this device? */
+ list_for_each_entry(bond, &io_mm->devices, mm_head) {
+ if (bond->dev == info->dev) {
+ io_mm_put_locked(io_mm);
+ return -EEXIST;
+ }
+ }
+ info->io_mm = io_mm;
+ return 1;
+}
+
int __iommu_sva_bind_device(struct device *dev, struct mm_struct *mm, int *pasid,
unsigned long flags, void *drvdata)
{
- int i;
int ret = 0;
- struct iommu_bond *bond;
- struct io_mm *io_mm = NULL;
+ struct io_mm *io_mm;
struct iommu_sva_param *param;
const struct iommu_ops *ops = dev->bus->iommu_ops;
+ struct io_mm_bond_info bond_info = {
+ .dev = dev,
+ .mm = mm,
+ };
if (!ops || !dev->iommu_param)
return -ENODEV;
@@ -511,25 +531,15 @@ int __iommu_sva_bind_device(struct device *dev, struct mm_struct *mm, int *pasid
goto out_unlock;
}
- /* If an io_mm already exists, use it */
+ /* If an io_mm already exists, get a reference and use it */
spin_lock(&iommu_sva_lock);
- idr_for_each_entry(&iommu_pasid_idr, io_mm, i) {
- if (io_mm->mm == mm && io_mm_get_locked(io_mm)) {
- /* ... Unless it's already bound to this device */
- list_for_each_entry(bond, &io_mm->devices, mm_head) {
- if (bond->dev == dev) {
- ret = -EEXIST;
- io_mm_put_locked(io_mm);
- break;
- }
- }
- break;
- }
- }
+ ret = ioasid_for_each(&ioasid_shared, io_mm_compare_bond, &bond_info);
spin_unlock(&iommu_sva_lock);
- if (ret)
+ if (ret < 0)
goto out_unlock;
+ io_mm = bond_info.io_mm;
+
/* Require identical features within an io_mm for now */
if (io_mm && (flags != io_mm->flags)) {
io_mm_put(io_mm);
@@ -640,7 +650,7 @@ struct mm_struct *iommu_sva_find(int pasid)
struct mm_struct *mm = NULL;
spin_lock(&iommu_sva_lock);
- io_mm = idr_find(&iommu_pasid_idr, pasid);
+ io_mm = ioasid_find(&ioasid_shared, pasid);
if (io_mm && io_mm_get_locked(io_mm)) {
if (mmget_not_zero(io_mm->mm))
mm = io_mm->mm;
--
2.19.1
next prev parent reply other threads:[~2018-10-19 18:11 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-19 18:11 [RFC PATCH 0/6] Auxiliary IOMMU domains and Arm SMMUv3 Jean-Philippe Brucker
[not found] ` <20181019181158.2395-1-jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
2018-10-19 18:11 ` [RFC PATCH 1/6] iommu: Adapt attach/detach_dev() for auxiliary domains Jean-Philippe Brucker
[not found] ` <20181019181158.2395-2-jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
2018-10-22 2:32 ` Lu Baolu
2018-10-19 18:11 ` [RFC PATCH 2/6] drivers core: Add I/O ASID allocator Jean-Philippe Brucker
[not found] ` <20181019181158.2395-3-jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org>
2018-10-22 4:49 ` Lu Baolu
[not found] ` <9c6cd6c1-3569-4251-8344-fc9df0e743bc-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-10-22 10:22 ` Raj, Ashok
[not found] ` <20181022102254.GA25399-7RUrO8UaCDyr4tA6zuQqW9h3ngVCH38I@public.gmane.org>
2018-10-23 6:56 ` Lu Baolu
[not found] ` <02006e4f-2acf-6ff8-b695-c54c99509b46-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-10-23 22:13 ` Tian, Kevin
2018-11-07 4:53 ` Lu Baolu
[not found] ` <fb2bd5fe-5742-fcd8-b8f0-1885040e8d4f-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-11-08 18:51 ` Jean-Philippe Brucker
2018-11-12 14:40 ` Joerg Roedel
[not found] ` <20181112144039.GA25808-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-21 11:16 ` Jean-Philippe Brucker
[not found] ` <8f17757a-c657-aab9-a6a0-fb0cc9c610a8-5wv7dgnIgG8@public.gmane.org>
2018-11-21 19:10 ` Koenig, Christian
[not found] ` <62f05552-df46-6e12-10ed-820429dfda59-5C7GfCeVMHo@public.gmane.org>
2018-11-22 6:59 ` Tian, Kevin
2018-11-22 8:38 ` Joerg Roedel
2018-11-22 8:44 ` Joerg Roedel
[not found] ` <20181122084429.GB1586-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-22 11:17 ` Jean-Philippe Brucker
2018-10-19 18:11 ` Jean-Philippe Brucker [this message]
2018-10-19 18:11 ` [RFC PATCH 4/6] iommu/sva: Support AUXD feature Jean-Philippe Brucker
2018-10-19 18:11 ` [RFC PATCH 5/6] iommu/arm-smmu-v3: Implement detach_dev op Jean-Philippe Brucker
2018-10-19 18:11 ` [RFC PATCH 6/6] iommu/arm-smmu-v3: Add support for auxiliary domains Jean-Philippe Brucker
2018-10-20 3:36 ` [RFC PATCH 0/6] Auxiliary IOMMU domains and Arm SMMUv3 Xu Zaibo
2018-10-22 6:53 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE0E176-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-10-22 11:50 ` Robin Murphy
[not found] ` <11f88122-afd3-a34c-3cd4-db681bf5498b-5wv7dgnIgG8@public.gmane.org>
2018-10-22 15:35 ` Jordan Crouse
2018-10-22 18:01 ` Jean-Philippe Brucker
2018-11-06 16:25 ` joro-zLv9SwRftAIdnm+yROfE0A
[not found] ` <20181106162539.4gmkvg57mja3bn7k-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-07 3:40 ` Lu Baolu
[not found] ` <e22e3631-2ecb-664d-5666-8e0f865dec83-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-11-07 16:43 ` joro-zLv9SwRftAIdnm+yROfE0A
[not found] ` <20181107164323.GA19831-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-07 17:23 ` Alex Williamson
2018-11-21 4:40 ` Lu Baolu
[not found] ` <758bb120-5bc0-1e2d-ccd0-9be0bcc5d8bc-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-11-23 11:21 ` joro-zLv9SwRftAIdnm+yROfE0A
[not found] ` <20181123112125.GF1586-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-25 6:51 ` Lu Baolu
2018-11-26 3:01 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE68777@SHSMSX101.ccr.corp.intel.com>
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE68777-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-11-26 7:29 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE689B8-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-12-07 10:29 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
[not found] ` <20181207102926.GM16835-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-12-10 2:06 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE95394-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-12-10 8:57 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
[not found] ` <20181210085745.GN16835-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-12-11 18:34 ` Jean-Philippe Brucker
[not found] ` <4be63d12-fa1c-b180-761b-5e8ceed58545-5wv7dgnIgG8@public.gmane.org>
2018-12-12 9:22 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
2018-12-12 9:31 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE9D6CA-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-12-12 9:54 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
[not found] ` <20181212095403.GU16835-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-12-12 10:03 ` Tian, Kevin
2018-12-10 2:57 ` Lu Baolu
[not found] ` <bf1ee4a3-6d3f-e0db-a02a-1db819843a60-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2018-12-10 8:59 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
2018-12-11 13:35 ` Jean-Philippe Brucker
[not found] ` <fc173d9f-57e2-dd87-95d0-1c615f2e14e3-5wv7dgnIgG8@public.gmane.org>
2018-12-12 9:29 ` 'joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org'
2018-11-08 18:29 ` Jean-Philippe Brucker
[not found] ` <42949d93-e22c-dd4d-cd49-46efc0b73cdb-5wv7dgnIgG8@public.gmane.org>
2018-11-12 14:55 ` joro-zLv9SwRftAIdnm+yROfE0A
[not found] ` <20181112145541.GB25808-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2018-11-21 19:05 ` Jean-Philippe Brucker
[not found] ` <5dcf9238-62b2-8df6-b378-183ee09c5951-5wv7dgnIgG8@public.gmane.org>
2018-11-23 12:50 ` joro-zLv9SwRftAIdnm+yROfE0A
2018-11-22 8:39 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D19BE5A7A7-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2018-11-23 12:14 ` joro-zLv9SwRftAIdnm+yROfE0A
2018-10-22 10:07 ` Raj, Ashok
[not found] ` <20181021194426.GA11201-7RUrO8UaCDyr4tA6zuQqW9h3ngVCH38I@public.gmane.org>
2018-10-22 16:03 ` Jean-Philippe Brucker
[not found] ` <d45c5222-68e9-1d6e-730b-bb8dbc060586-5wv7dgnIgG8@public.gmane.org>
2018-10-23 17:16 ` Raj, Ashok
[not found] ` <1540314963.21962.20.camel-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2018-10-23 22:08 ` Tian, Kevin
2018-10-26 3:00 ` Lu Baolu
2018-10-22 16:48 ` Jordan Crouse
[not found] ` <20181022164834.GH26762-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-11-02 3:19 ` Lu Baolu
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=20181019181158.2395-4-jean-philippe.brucker@arm.com \
--to=jean-philippe.brucker-5wv7dgnigg8@public.gmane.org \
--cc=alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=christian.koenig-5C7GfCeVMHo@public.gmane.org \
--cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=kevin.tian-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=rafael-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=robin.murphy-5wv7dgnIgG8@public.gmane.org \
--cc=will.deacon-5wv7dgnIgG8@public.gmane.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).