From: Marc Zyngier <marc.zyngier@arm.com>
To: Andrew Jones <drjones@redhat.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>,
Laszlo Ersek <lersek@redhat.com>,
"kvmarm@lists.cs.columbia.edu" <kvmarm@lists.cs.columbia.edu>
Subject: Re: issues with emulated PCI MMIO backed by host memory under KVM
Date: Mon, 27 Jun 2016 09:17:45 +0100 [thread overview]
Message-ID: <5770E129.10101@arm.com> (raw)
In-Reply-To: <20160624145748.e2uwqrdv2fik46wc@hawk.localdomain>
On 24/06/16 15:57, Andrew Jones wrote:
>
> Hi Ard,
>
> Thanks for bringing this back up again (I think :-)
>
> On Fri, Jun 24, 2016 at 04:04:45PM +0200, Ard Biesheuvel wrote:
>> Hi all,
>>
>> This old subject came up again in a discussion related to PCIe support
>> for QEMU/KVM under Tianocore. The fact that we need to map PCI MMIO
>> regions as cacheable is preventing us from reusing a significant slice
>> of the PCIe support infrastructure, and so I'd like to bring this up
>> again, perhaps just to reiterate why we're simply out of luck.
>>
>> To refresh your memories, the issue is that on ARM, PCI MMIO regions
>> for emulated devices may be backed by memory that is mapped cacheable
>> by the host. Note that this has nothing to do with the device being
>> DMA coherent or not: in this case, we are dealing with regions that
>> are not memory from the POV of the guest, and it is reasonable for the
>> guest to assume that accesses to such a region are not visible to the
>> device before they hit the actual PCI MMIO window and are translated
>> into cycles on the PCI bus. That means that mapping such a region
>> cacheable is a strange thing to do, in fact, and it is unlikely that
>> patches implementing this against the generic PCI stack in Tianocore
>> will be accepted by the maintainers.
>>
>> Note that this issue not only affects framebuffers on PCI cards, it
>> also affects emulated USB host controllers (perhaps Alex can remind us
>> which one exactly?) and likely other emulated generic PCI devices as
>> well.
>>
>> Since the issue exists only for emulated PCI devices whose MMIO
>> regions are backed by host memory, is there any way we can already
>> distinguish such memslots from ordinary ones? If we can, is there
>
> When I was looking at this I didn't see any way to identify these
> memslots. I wrote some patches to add a new flag, KVM_MEM_NONCACHEABLE,
> allowing userspace to point them out. That was the easy part (although
> I didn't like that userspace developers would have to go around finding
> all memory regions that needed to be flagged, and new devices would
> likely not be flagged when developed on non-arm architectures, so we'd
> always be chasing it...) However what really slowed/stopped me was
> trying to figure out what to do with those identified memslots.
>
> My last idea, which had implementation issues (probably because I was
> getting in over my head), was
>
> 1) introduce PAGE_S2_NORMAL_NC and use it when mapping the guest's pages
> 2) flush the userspace pages and update all PTEs to be NC
>
> The reasoning was that, while we can't force a guest to use cacheable
> memory, we can take advantage of the noncacheable precedence of the
> architecture, forcing the memory accesses to be noncached by way of
> S2 attributes. And of course userspace mappings also need to become NC
> to finally have coherency.
I think this is a sensible course of action, as long as you can identify
a specific memblock on which to apply this. You may even not have to
"repaint" the PTEs, but instead obtain a non-cacheable mapping from the
kernel (at a different address).
I'm more worried if we end-up having both cacheable and non-cacheable
pages inside the same VMA (and Alex seems to point at USB having weird
requirements around this).
Thanks,
M.
--
Jazz is not dead. It just smells funny...
next prev parent reply other threads:[~2016-06-27 8:12 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-24 14:04 issues with emulated PCI MMIO backed by host memory under KVM Ard Biesheuvel
2016-06-24 14:57 ` Andrew Jones
2016-06-27 8:17 ` Marc Zyngier [this message]
2016-06-24 18:16 ` Ard Biesheuvel
2016-06-25 7:15 ` Alexander Graf
2016-06-25 7:19 ` Alexander Graf
2016-06-27 8:11 ` Marc Zyngier
2016-06-27 9:16 ` Christoffer Dall
2016-06-27 9:47 ` Ard Biesheuvel
2016-06-27 10:34 ` Christoffer Dall
2016-06-27 12:30 ` Ard Biesheuvel
2016-06-27 13:35 ` Christoffer Dall
2016-06-27 13:57 ` Ard Biesheuvel
2016-06-27 14:29 ` Alexander Graf
2016-06-28 11:02 ` Laszlo Ersek
2016-06-28 10:04 ` Christoffer Dall
2016-06-28 11:06 ` Laszlo Ersek
2016-06-28 12:20 ` Christoffer Dall
2016-06-28 13:10 ` Catalin Marinas
2016-06-28 13:19 ` Ard Biesheuvel
2016-06-28 13:25 ` Catalin Marinas
2016-06-28 14:02 ` Andrew Jones
2016-06-27 14:24 ` Alexander Graf
2016-06-28 10:55 ` Laszlo Ersek
2016-06-28 13:14 ` Ard Biesheuvel
2016-06-28 13:32 ` Laszlo Ersek
2016-06-29 7:12 ` Gerd Hoffmann
2016-06-28 15:23 ` Alexander Graf
2016-06-27 13:15 ` Peter Maydell
2016-06-27 13:49 ` Mark Rutland
2016-06-27 14:10 ` Peter Maydell
2016-06-28 10:05 ` Christoffer Dall
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=5770E129.10101@arm.com \
--to=marc.zyngier@arm.com \
--cc=ard.biesheuvel@linaro.org \
--cc=catalin.marinas@arm.com \
--cc=drjones@redhat.com \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=lersek@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox