From: William Davis <wdavis@nvidia.com>
To: "markh@compro.net" <markh@compro.net>,
Bjorn Helgaas <bhelgaas@google.com>
Cc: "joro@8bytes.org" <joro@8bytes.org>,
"iommu@lists.linux-foundation.org"
<iommu@lists.linux-foundation.org>,
"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
Terence Ripperda <TRipperda@nvidia.com>,
John Hubbard <jhubbard@nvidia.com>,
"jglisse@redhat.com" <jglisse@redhat.com>,
"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>,
Jonathan Corbet <corbet@lwn.net>,
"David S. Miller" <davem@davemloft.net>
Subject: RE: [PATCH v2 4/7] DMA-API: Add dma_(un)map_resource() documentation
Date: Wed, 27 May 2015 18:31:53 +0000 [thread overview]
Message-ID: <6f77384007cd47eea5ecb4b60977fdac@HQMAIL106.nvidia.com> (raw)
In-Reply-To: <555CE97A.1030805@compro.net>
> -----Original Message-----
> From: Mark Hounschell [mailto:markh@compro.net]
> Sent: Wednesday, May 20, 2015 3:07 PM
> To: William Davis; Bjorn Helgaas
> Cc: joro@8bytes.org; iommu@lists.linux-foundation.org; linux-pci@vger.kernel.org; Terence Ripperda;
> John Hubbard; jglisse@redhat.com; konrad.wilk@oracle.com; Jonathan Corbet; David S. Miller
> Subject: Re: [PATCH v2 4/7] DMA-API: Add dma_(un)map_resource() documentation
>
> >>
> >> I currently just do
> >>
> >> page = virt_to_page(__va(bus_address));
> >>
> >> then just use the normal API. Works for writes anyway.
> >>
> >
> > What platform is this on? I don't understand how that could work for
> > peer-to-peer. As I understand it, there are no 'struct page's for MMIO
> > regions, and you could actually end up with a very different page as a
> > result of that unchecked translation (e.g., a "valid" struct page, but
> > not in the peer's MMIO range at all).
> >
>
> This is an x86-64 AMD 990FX chip set. Works fine. Every time. I do have
> the peers memory that is being written to mmap'd by the task that is
> doing this, but this works.
>
> Mark
>
I spent some time looking into this, and I was surprised to find it worked
for me too. At least, it seems like it works, but it is a dangerous
accident that it did, and so I think the patch is still necessary.
In the IOMMU mapping paths, the IOMMU drivers (at least on x86) only
really use the struct page * to get the physical address that it
references, and I think that's usually done exclusively with pointer
arithmetic these days. So you are getting a pointer to a struct page that
actually doesn't exist, because it's either in a hole or off the end of
the memory map.
You can verify this by calling dump_page() on the struct page * returned
by this calculation. On my Intel machine, this BUGs, unable to handle the
paging request when looking at the struct page fields. If I just use the
pointer without dereferencing it, the IOMMU paths can get the correct
physical address without any issues, but this is by accident and not by
design, nor is it portable, so we shouldn't rely on this technique.
Thanks,
Will
--
nvpublic
next prev parent reply other threads:[~2015-05-27 18:31 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-18 18:24 [PATCH v2 0/7] IOMMU/DMA map_resource support for peer-to-peer wdavis
2015-05-18 18:24 ` [PATCH v2 1/7] dma-debug: add checking for map/unmap_resource wdavis
2015-05-18 18:24 ` [PATCH v2 2/7] DMA-API: Introduce dma_(un)map_resource wdavis
2015-05-29 8:16 ` Joerg Roedel
2015-05-18 18:25 ` [PATCH v2 3/7] dma-mapping: pci: add pci_(un)map_resource wdavis
2015-05-18 18:25 ` [PATCH v2 4/7] DMA-API: Add dma_(un)map_resource() documentation wdavis
2015-05-19 23:43 ` Bjorn Helgaas
[not found] ` <20150519234300.GA31666-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2015-05-20 12:11 ` Mark Hounschell
[not found] ` <555C79E5.9040507-n2QNKt385d+sTnJN9+BGXg@public.gmane.org>
2015-05-20 17:30 ` William Davis
2015-05-20 19:15 ` Mark Hounschell
2015-05-20 19:51 ` William Davis
2015-05-20 20:07 ` Mark Hounschell
2015-05-27 18:31 ` William Davis [this message]
2015-05-29 8:24 ` joro
2015-07-07 15:15 ` Bjorn Helgaas
2015-07-07 15:41 ` Alex Williamson
2015-07-07 16:16 ` Bjorn Helgaas
[not found] ` <CAErSpo74X7ny_30L2uDWJ==vQJKq3KgFk8CPVsKuJ7=-DwNo3w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-07-07 16:41 ` Alex Williamson
[not found] ` <20150707151517.GA14215-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2015-07-07 17:14 ` Mark Hounschell
2015-07-07 17:28 ` Alex Williamson
2015-07-07 19:17 ` Mark Hounschell
[not found] ` <559C25B6.5030101-n2QNKt385d+sTnJN9+BGXg@public.gmane.org>
2015-07-07 19:54 ` Alex Williamson
2015-07-08 15:11 ` Bjorn Helgaas
2015-07-08 16:40 ` Mark Hounschell
2015-07-09 0:50 ` Rafael J. Wysocki
[not found] ` <1431973504-5903-5-git-send-email-wdavis-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2015-06-01 21:25 ` Konrad Rzeszutek Wilk
2015-06-02 14:27 ` William Davis
2015-05-18 18:25 ` [PATCH v2 5/7] iommu/amd: Implement (un)map_resource wdavis
2015-05-18 18:25 ` [PATCH v2 6/7] iommu/vt-d: implement (un)map_resource wdavis
2015-05-18 18:25 ` [PATCH v2 7/7] x86: add pci-nommu implementation of map_resource wdavis
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=6f77384007cd47eea5ecb4b60977fdac@HQMAIL106.nvidia.com \
--to=wdavis@nvidia.com \
--cc=TRipperda@nvidia.com \
--cc=bhelgaas@google.com \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=iommu@lists.linux-foundation.org \
--cc=jglisse@redhat.com \
--cc=jhubbard@nvidia.com \
--cc=joro@8bytes.org \
--cc=konrad.wilk@oracle.com \
--cc=linux-pci@vger.kernel.org \
--cc=markh@compro.net \
/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