• Stefano Stabellini's avatar
    xen/arm: reimplement xen_dma_unmap_page & friends · 340720be
    Stefano Stabellini authored
    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: default avatarStefano Stabellini <stefano.stabellini@eu.citrix.com>
    Tested-by: default avatarDenis Schneider <v1ne2go@gmail.com>
    340720be
page-coherent.h 1.27 KB