From: Wei Yang <richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
jroedel-l3A5Bk7waGM@public.gmane.org,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org
Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
Subject: [PATCH 2/2] iommu: narrow the search range by iterating on current bus
Date: Fri, 5 Aug 2016 13:47:47 +0000 [thread overview]
Message-ID: <1470404867-26783-2-git-send-email-richard.weiyang@gmail.com> (raw)
In-Reply-To: <1470404867-26783-1-git-send-email-richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
According to the comments and code, get_pci_function_alias_group() and
get_pci_alias_group() do the search on the same pci bus. This means we can
just iterate on the bus the pci device attaches to.
This patch narrows the search range by just iterating on the current bus
and fix one typo in comment.
Signed-off-by: Wei Yang <richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/iommu/iommu.c | 100 +++++++++++++++++++++++++++++++-------------------
1 file changed, 63 insertions(+), 37 deletions(-)
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 3000051..2fae2c6 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -634,29 +634,45 @@ static struct iommu_group *get_pci_alias_group(struct pci_dev *pdev,
* each function, we also need to look for aliases to or from other devices
* that may already have a group.
*/
+
+struct alias_group_cb_data {
+ struct pci_dev *pdev;
+ struct iommu_group *group;
+ unsigned long *devfns;
+};
+
+static int __get_pci_function_alias_group(struct pci_dev *tmp, void *data)
+{
+ struct alias_group_cb_data *cb_data =
+ (struct alias_group_cb_data *)data;
+ struct pci_dev *pdev = cb_data->pdev;
+
+ if (tmp == pdev ||
+ PCI_SLOT(tmp->devfn) != PCI_SLOT(pdev->devfn) ||
+ pci_acs_enabled(tmp, REQ_ACS_FLAGS))
+ return 0;
+
+ cb_data->group = get_pci_alias_group(tmp, cb_data->devfns);
+ if (cb_data->group)
+ return 1;
+ else
+ return 0;
+}
+
static struct iommu_group *get_pci_function_alias_group(struct pci_dev *pdev,
unsigned long *devfns)
{
- struct pci_dev *tmp = NULL;
- struct iommu_group *group;
+ struct alias_group_cb_data data;
if (!pdev->multifunction || pci_acs_enabled(pdev, REQ_ACS_FLAGS))
return NULL;
- for_each_pci_dev(tmp) {
- if (tmp == pdev || tmp->bus != pdev->bus ||
- PCI_SLOT(tmp->devfn) != PCI_SLOT(pdev->devfn) ||
- pci_acs_enabled(tmp, REQ_ACS_FLAGS))
- continue;
-
- group = get_pci_alias_group(tmp, devfns);
- if (group) {
- pci_dev_put(tmp);
- return group;
- }
- }
+ data.pdev = pdev;
+ data.group = NULL;
+ data.devfns = devfns;
+ pci_walk_bus_local(pdev->bus, __get_pci_function_alias_group, &data);
- return NULL;
+ return data.group;
}
/*
@@ -668,11 +684,36 @@ static struct iommu_group *get_pci_function_alias_group(struct pci_dev *pdev,
* multifunction devices could have aliases between them that would cause a
* loop. To prevent this, we use a bitmap to track where we've been.
*/
+static int __get_pci_alias_group(struct pci_dev *tmp, void *data)
+{
+ struct alias_group_cb_data *cb_data =
+ (struct alias_group_cb_data *)data;
+ struct pci_dev *pdev = cb_data->pdev;
+
+ if (tmp == pdev)
+ return 0;
+
+ /* We alias them or they alias us */
+ if (pci_devs_are_dma_aliases(pdev, tmp)) {
+ cb_data->group = get_pci_alias_group(tmp, cb_data->devfns);
+ if (cb_data->group)
+ return 1;
+
+ cb_data->group = get_pci_function_alias_group(tmp,
+ cb_data->devfns);
+ if (cb_data->group)
+ return 1;
+ }
+
+ return 0;
+}
+
+
static struct iommu_group *get_pci_alias_group(struct pci_dev *pdev,
unsigned long *devfns)
{
- struct pci_dev *tmp = NULL;
struct iommu_group *group;
+ struct alias_group_cb_data data;
if (test_and_set_bit(pdev->devfn & 0xff, devfns))
return NULL;
@@ -681,27 +722,12 @@ static struct iommu_group *get_pci_alias_group(struct pci_dev *pdev,
if (group)
return group;
- for_each_pci_dev(tmp) {
- if (tmp == pdev || tmp->bus != pdev->bus)
- continue;
-
- /* We alias them or they alias us */
- if (pci_devs_are_dma_aliases(pdev, tmp)) {
- group = get_pci_alias_group(tmp, devfns);
- if (group) {
- pci_dev_put(tmp);
- return group;
- }
-
- group = get_pci_function_alias_group(tmp, devfns);
- if (group) {
- pci_dev_put(tmp);
- return group;
- }
- }
- }
+ data.pdev = pdev;
+ data.group = NULL;
+ data.devfns = devfns;
+ pci_walk_bus_local(pdev->bus, __get_pci_alias_group, &data);
- return NULL;
+ return data.group;
}
struct group_for_pci_data {
@@ -794,7 +820,7 @@ struct iommu_group *pci_device_group(struct device *dev)
/*
* Look for existing groups on non-isolated functions on the same
- * slot and aliases of those funcions, if any. No need to clear
+ * slot and aliases of those functions, if any. No need to clear
* the search bitmap, the tested devfns are still valid.
*/
group = get_pci_function_alias_group(pdev, (unsigned long *)devfns);
--
2.5.0
next prev parent reply other threads:[~2016-08-05 13:47 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-28 14:52 [PATCH] iommu: narrow the search range by iterating on current bus Wei Yang
[not found] ` <1469717579-8244-1-git-send-email-richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-07-28 15:01 ` Alex Williamson
[not found] ` <20160728090132.42c6ebc1-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>
2016-08-05 13:47 ` [PATCH 1/2] PCI: add a function to walk on local bus Wei Yang
[not found] ` <1470404867-26783-1-git-send-email-richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-05 13:47 ` Wei Yang [this message]
2016-08-05 14:03 ` [PATCH] iommu: narrow the search range by iterating on current bus Wei Yang
[not found] ` <20160805140317.GA26921-yrDqe6+Pica9sAcnBtTtJQ@public.gmane.org>
2016-08-18 23:00 ` Wei Yang
[not found] ` <20160818230026.GA2631-yrDqe6+Pica9sAcnBtTtJQ@public.gmane.org>
2016-09-28 19:51 ` Wei Yang
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=1470404867-26783-2-git-send-email-richard.weiyang@gmail.com \
--to=richard.weiyang-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=bhelgaas-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=jroedel-l3A5Bk7waGM@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).