diff options
author | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2014-09-10 22:49:41 +0000 |
---|---|---|
committer | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2014-09-11 18:11:53 +0000 |
commit | 340720be32d458ee11d1117719a8e4b6b82981b2 (patch) | |
tree | 11489bb337f841f9bf3cce1a77771c2412c566c2 /arch/arm/xen/Makefile | |
parent | 5ebc77de83c7b74543de774afa7395b3b790e65e (diff) | |
download | op-kernel-dev-340720be32d458ee11d1117719a8e4b6b82981b2.zip op-kernel-dev-340720be32d458ee11d1117719a8e4b6b82981b2.tar.gz |
xen/arm: reimplement xen_dma_unmap_page & friends
xen_dma_unmap_page, xen_dma_sync_single_for_cpu and
xen_dma_sync_single_for_device are currently implemented by calling into
the corresponding generic ARM implementation of these functions. In
order to do this, firstly the dma_addr_t handle, that on Xen is a
machine address, needs to be translated into a physical address. The
operation is expensive and inaccurate, given that a single machine
address can correspond to multiple physical addresses in one domain,
because the same page can be granted multiple times by the frontend.
To avoid this problem, we introduce a Xen specific implementation of
xen_dma_unmap_page, xen_dma_sync_single_for_cpu and
xen_dma_sync_single_for_device, that can operate on machine addresses
directly.
The new implementation relies on the fact that the hypervisor creates a
second p2m mapping of any grant pages at physical address == machine
address of the page for dom0. Therefore we can access memory at physical
address == dma_addr_r handle and perform the cache flushing there. Some
cache maintenance operations require a virtual address. Instead of using
ioremap_cache, that is not safe in interrupt context, we allocate a
per-cpu PAGE_KERNEL scratch page and we manually update the pte for it.
arm64 doesn't need cache maintenance operations on unmap for now.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Tested-by: Denis Schneider <v1ne2go@gmail.com>
Diffstat (limited to 'arch/arm/xen/Makefile')
-rw-r--r-- | arch/arm/xen/Makefile | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/arm/xen/Makefile b/arch/arm/xen/Makefile index 1296952..1f85bfe 100644 --- a/arch/arm/xen/Makefile +++ b/arch/arm/xen/Makefile @@ -1 +1 @@ -obj-y := enlighten.o hypercall.o grant-table.o p2m.o mm.o +obj-y := enlighten.o hypercall.o grant-table.o p2m.o mm.o mm32.o |