All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RFC] xen: arm: use uncached foreign mappings when building guests
@ 2013-12-18 17:28 Ian Campbell
  2013-12-18 17:30 ` [PATCH LINUX RFC] xen: privcmd: implement IOCTL_PRIVCMD_MMAPBATCH_V2_UNCACHED Ian Campbell
                   ` (4 more replies)
  0 siblings, 5 replies; 22+ messages in thread
From: Ian Campbell @ 2013-12-18 17:28 UTC (permalink / raw)
  To: xen-devel
  Cc: Ian Jackson, Tim Deegan, Julien Grall, Stefano.Stabellini,
	David Vrabel, Boris Ostrovsky

When building an ARM guest we need to take care of cache maintenance
because the guest starts with MMU and cache disabled, which means we
need to make sure that the initial images (kernel, initrd, dtb) which we
write to guest memory are not in the cache.

We thought we had solved this with "tools: libxc: flush data cache after
loading images into guest memory" (a0035ecc0d82) however it turns out
that there are a couple of issues with this approach:

Firstly we need to do a cache flush from userspace, on arm64 this is
possible by directly using the instructions from userspace, but on arm32
this is not possible and so we need to use a system call. Unfortunately
the system call provided by Linux for this purpose does not flush far
enough down the cache hierarchy. Extending the system call would not be
an insurmountable barrier, were it not for the second issue:

Secondly, and more importantly, Catalin Marinas points out (via Marc
Zyngier) that there is a race between the cache flush and the point
where we tear down the mappings, where the processor might speculatively
pull some data into the cache (cache flushes are by Virtual Address, so
this race is unavoidable).

If this happens then guest kernels which modify some code/data before
enabling MMUs + caches may see stale data in the cache.

The solution to this is to use a non-cacheable mapping to populate the
guest RAM, which prevents the processor from pulling anything into the
cache lines. Since we need to write all the way through to RAM anyway
there is not any downside to this.

In order to do this we need a new privcmd ioctl which creates uncached
mappings and a libxc patch to use it. Both of these will follow.

I'm sending this out early to validate that this approach does actually
work and makes sense.

I've tried this on arm64 and it seems ok, Julien, please can you give
this a go in your midway test case which exposes this issue.

The libxc patch here is especially RFC and not at all ready to go, the
kernel patch is pretty simple and probably OK, but still flagged as RFC
since it is part of the whole pair.

Ian.

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2014-01-06 12:10 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-18 17:28 [PATCH RFC] xen: arm: use uncached foreign mappings when building guests Ian Campbell
2013-12-18 17:30 ` [PATCH LINUX RFC] xen: privcmd: implement IOCTL_PRIVCMD_MMAPBATCH_V2_UNCACHED Ian Campbell
2013-12-18 19:24   ` Stefano Stabellini
2013-12-18 21:16   ` Konrad Rzeszutek Wilk
2013-12-20  9:19     ` Ian Campbell
2013-12-20 14:13       ` Konrad Rzeszutek Wilk
2013-12-20 14:18         ` Ian Campbell
2013-12-20 14:38           ` Konrad Rzeszutek Wilk
2013-12-20 14:44             ` Ian Campbell
2013-12-18 17:30 ` [PATCH XEN RFC] libxc: use an uncached mapping of guest ram in domain builder Ian Campbell
2013-12-18 21:14   ` Konrad Rzeszutek Wilk
2013-12-20  9:19     ` Ian Campbell
2013-12-18 18:41 ` [PATCH RFC] xen: arm: use uncached foreign mappings when building guests David Vrabel
2013-12-19 10:10   ` Ian Campbell
2013-12-19 11:23     ` Stefano Stabellini
2013-12-19 11:29       ` Ian Campbell
2014-01-02 15:10     ` David Vrabel
2014-01-06 10:05       ` Ian Campbell
2013-12-19  4:16 ` Julien Grall
2013-12-19  4:26 ` Julien Grall
2013-12-19 14:30   ` Ian Campbell
2014-01-06 12:10     ` Ian Campbell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.