From: David Woodhouse <dwmw2@infradead.org>
To: Chris Wright <chrisw@sous-sol.org>
Cc: Fenghua Yu <fenghua.yu@intel.com>,
"'Linus Torvalds'" <torvalds@linux-foundation.org>,
"'Stephen Rothwell'" <sfr@canb.auug.org.au>,
"'Andrew Morton'" <akpm@linux-foundation.org>,
"'Ingo Molnar'" <mingo@elte.hu>,
"'Christopher Wright'" <chrisw@redhat.com>,
"'Allen Kay'" <allen.m.kay@intel.com>,
"'iommu'" <iommu@lists.linux-foundation.org>,
"'lkml'" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 1/2] IOMMU Identity Mapping Support: iommu_identity_mapping definition
Date: Sat, 04 Jul 2009 19:40:18 +0100 [thread overview]
Message-ID: <1246732818.3892.446.camel@macbook.infradead.org> (raw)
In-Reply-To: <20090618181335.GB19771@sequoia.sous-sol.org>
On Thu, 2009-06-18 at 11:13 -0700, Chris Wright wrote:
> * Fenghua Yu (fenghua.yu@intel.com) wrote:
> > IOMMU Identity Mapping Support: iommu_identity_mapping definition
> >
> > Identity mapping for IOMMU defines a single domain to 1:1 map all pci devices
> > to all usable memory.
> >
> > This will reduces map/unmap overhead in DMA API's and improve IOMMU performance.
> > On 10Gb network cards, Netperf shows no performance degradation compared to
> > non-IOMMU performance.
> >
> > This method may lose some of DMA remapping benefits like isolation.
> >
> > The first patch defines iommu_identity_mapping varialbe which controls the
> > identity mapping code and is 0 by default.
>
> The only real difference between "pt" and "identity" is hardware support.
> We should have a single value we don't have to tell users to do different
> things depending on their hardware (they won't even know what they have)
> to achieve the same result.
The _code_ ought to be a lot more shared than it is, too. Currently, the
hardware pass-through support has bugs that the software identity
mapping doesn't. It doesn't remove devices from the identity map if they
are limited to 32-bit DMA and a driver tries to set up mappings, which
is quite suboptimal. And it doesn't put them _back_ into the identity
map after they're detached from a VM, AFAICT.
I was going to fix that and unify the code paths, but then I found a bug
with the software identity mapping too -- if you have a PCI device which
is only capable of 32-bit DMA and it's behind a bridge (such as the
ohci1394 device on a Tylersburg SDV, although you'll have to hack the
kernel to pretend not to have the hardware PT support), it'll cause a
BUG() when it first sets up a mapping. What happens is this:
First it removes that device from si_domain because it can only address
4GiB of RAM, then get_domain_for_dev() will put it right back _in_ the
si_domain again, because it inherits its domain from the upstream PCI
bridge. And then we BUG() in domain_get_iommu() which _really_ doesn't
want to see the si_domain.
I _think_ this is the best fix for that...
>From 3dfc813d94bba2046c6aed216e0fd69ac93a8e03 Mon Sep 17 00:00:00 2001
From: David Woodhouse <David.Woodhouse@intel.com>
Date: Sat, 4 Jul 2009 19:11:08 +0100
Subject: [PATCH] intel-iommu: Don't use identity mapping for PCI devices behind bridges
Our current strategy for pass-through mode is to put all devices into
the 1:1 domain at startup (which is before we know what their dma_mask
will be), and only _later_ take them out of that domain, if it turns out
that they really can't address all of memory.
However, when there are a bunch of PCI devices behind a bridge, they all
end up with the same source-id on their DMA transactions, and hence in
the same IOMMU domain. This means that we _can't_ easily move them from
the 1:1 domain into their own domain at runtime, because there might be DMA
in-flight from their siblings.
So we have to adjust our pass-through strategy: For PCI devices not on
the root bus, and for the bridges which will take responsibility for
their transactions, we have to start up _out_ of the 1:1 domain, just in
case.
This fixes the BUG() we see when we have 32-bit-capable devices behind a
PCI-PCI bridge, and use the software identity mapping.
It does mean that we might end up using 'normal' mapping mode for some
devices which could actually live with the faster 1:1 mapping -- but
this is only for PCI devices behind bridges, which presumably aren't the
devices for which people are most concerned about performance.
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
---
drivers/pci/intel-iommu.c | 30 ++++++++++++++++++++++++++++++
1 files changed, 30 insertions(+), 0 deletions(-)
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
index f9fc4f3..360fb67 100644
--- a/drivers/pci/intel-iommu.c
+++ b/drivers/pci/intel-iommu.c
@@ -2122,6 +2122,36 @@ static int iommu_should_identity_map(struct pci_dev *pdev, int startup)
if (iommu_identity_mapping == 2)
return IS_GFX_DEVICE(pdev);
+ /*
+ * We want to start off with all devices in the 1:1 domain, and
+ * take them out later if we find they can't access all of memory.
+ *
+ * However, we can't do this for PCI devices behind bridges,
+ * because all PCI devices behind the same bridge will end up
+ * with the same source-id on their transactions.
+ *
+ * Practically speaking, we can't change things around for these
+ * devices at run-time, because we can't be sure there'll be no
+ * DMA transactions in flight for any of their siblings.
+ *
+ * So PCI devices (unless they're on the root bus) as well as
+ * their parent PCI-PCI or PCIe-PCI bridges must be left _out_ of
+ * the 1:1 domain, just in _case_ one of their siblings turns out
+ * not to be able to map all of memory.
+ */
+ if (!pdev->is_pcie) {
+ if (!pci_is_root_bus(pdev->bus))
+ return 0;
+ if (pdev->class >> 8 == PCI_CLASS_BRIDGE_PCI)
+ return 0;
+ } else if (pdev->pcie_type == PCI_EXP_TYPE_PCI_BRIDGE)
+ return 0;
+
+ /*
+ * At boot time, we don't yet know if devices will be 64-bit capable.
+ * Assume that they will -- if they turn out not to be, then we can
+ * take them out of the 1:1 domain later.
+ */
if (!startup)
return pdev->dma_mask > DMA_BIT_MASK(32);
--
1.6.2.5
--
David Woodhouse Open Source Technology Centre
David.Woodhouse@intel.com Intel Corporation
next prev parent reply other threads:[~2009-07-04 18:40 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20090327212241.234500000@intel.com>
2009-03-28 14:24 ` [patch 0/4] Intel IOMMU Supspend/Resume Support Andrew Lutomirski
2009-03-30 23:01 ` David Woodhouse
[not found] ` <20090327212321.520992000@intel.com>
2009-04-03 12:37 ` [patch 4/4] Intel IOMMU Suspend/Resume Support - Code Clean Up David Woodhouse
[not found] ` <20090327212321.070229000@intel.com>
2009-04-16 0:19 ` [PATCH] Intel IOMMU Pass Through Support Fenghua Yu
2009-04-16 2:13 ` Han, Weidong
2009-04-19 10:05 ` David Woodhouse
2009-04-20 17:27 ` Yu, Fenghua
2009-05-13 23:13 ` [PATCH] Fix Intel IOMMU Compilation Warnings on IA64 Fenghua Yu
2009-05-14 15:17 ` David Woodhouse
2009-05-14 15:31 ` Matthew Wilcox
2009-05-14 17:59 ` Fenghua Yu
2009-06-18 18:05 ` [PATCH 1/2] IOMMU Identity Mapping Support: iommu_identity_mapping definition Fenghua Yu
2009-06-18 18:08 ` Muli Ben-Yehuda
2009-06-18 18:13 ` Chris Wright
2009-06-18 18:14 ` Yu, Fenghua
2009-06-18 18:25 ` Muli Ben-Yehuda
2009-06-18 18:31 ` Chris Wright
2009-06-18 18:41 ` Muli Ben-Yehuda
2009-06-18 18:50 ` Yu, Fenghua
2009-06-18 18:51 ` Chris Wright
2009-06-18 19:09 ` Yu, Fenghua
2009-06-25 0:38 ` [PATCH] IA64 Compilation Error Fix for Intel IOMMU Identity Mapping Support Fenghua Yu
2009-06-25 1:00 ` FUJITA Tomonori
2009-06-25 4:16 ` [PATCH v2] " Fenghua Yu
2009-06-25 4:48 ` FUJITA Tomonori
2009-06-25 7:11 ` David Woodhouse
2009-06-25 21:52 ` David Woodhouse
2009-06-25 21:56 ` Yu, Fenghua
2009-06-26 18:21 ` David Woodhouse
2009-06-25 22:00 ` Linus Torvalds
2009-06-25 22:46 ` Tony Luck
2009-06-25 23:43 ` Chris Wright
2009-06-26 1:35 ` Linus Torvalds
2009-06-26 1:52 ` Chris Wright
2009-06-26 2:00 ` Linus Torvalds
2009-06-26 2:08 ` Chris Wright
2009-06-26 11:15 ` David Woodhouse
2009-06-27 0:03 ` Chris Wright
2009-06-27 11:44 ` David Woodhouse
2009-06-18 18:13 ` [PATCH 1/2] IOMMU Identity Mapping Support: iommu_identity_mapping definition Chris Wright
2009-06-18 18:28 ` Yu, Fenghua
2009-06-18 18:34 ` Chris Wright
2009-07-04 18:40 ` David Woodhouse [this message]
2009-05-20 17:42 ` [PATCH] Time out for possible dead loops during queued invalidation wait Fenghua Yu
2009-05-27 5:51 ` Andrew Morton
2009-05-27 22:40 ` Yu, Fenghua
2009-05-27 22:48 ` Andrew Morton
2009-05-27 23:25 ` Yu, Fenghua
2009-05-27 23:51 ` Andrew Morton
2009-05-28 0:47 ` Yu, Fenghua
2009-06-18 18:05 ` [PATCH 2/2] IOMMU Identity Mapping Support: Intel IOMMU implementation Fenghua Yu
2009-06-18 19:15 ` Chris Wright
2009-06-18 19:40 ` Yu, Fenghua
2009-06-18 20:02 ` Chris Wright
2009-06-19 20:47 ` [PATCH v2] IOMMU Identity Mapping Support (drivers/pci/intel_iommu.c) Fenghua Yu
2009-04-30 23:29 ` [PATCH] Intel IOMMU Pass Through Support Andrew Morton
2009-04-30 23:37 ` Randy Dunlap
2009-05-01 0:00 ` Andrew Morton
2009-05-01 0:57 ` Fenghua Yu
2009-05-01 0:05 ` Fenghua Yu
2009-05-01 0:14 ` Andrew Morton
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=1246732818.3892.446.camel@macbook.infradead.org \
--to=dwmw2@infradead.org \
--cc=akpm@linux-foundation.org \
--cc=allen.m.kay@intel.com \
--cc=chrisw@redhat.com \
--cc=chrisw@sous-sol.org \
--cc=fenghua.yu@intel.com \
--cc=iommu@lists.linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=sfr@canb.auug.org.au \
--cc=torvalds@linux-foundation.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
Powered by JetHome