aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefano Stabellini <sstabellini@kernel.org>2019-01-22 11:26:12 -0800
committerStefano Stabellini <sstabellini@kernel.org>2019-01-22 11:45:10 -0800
commit621253ae4ba3f412f5dd6d0f5c151dc10caee55c (patch)
tree7d2f8ee0096c8465bfb8cb932373b4344c402076
parent787a3b4322763284a594a5dd3680508c0bfb20b0 (diff)
downloadxen-vring-fix.tar.gz
xen: introduce xen_vring_use_dmavring-fix
Export xen_swiotlb on arm and arm64. Use xen_swiotlb to determine when vring should use dma APIs to map the ring: when xen_swiotlb is enabled the dma API is required. When it is disabled, it is not required. Signed-off-by: Stefano Stabellini <stefanos@xilinx.com>
-rw-r--r--arch/arm/include/asm/xen/swiotlb-xen.h1
-rw-r--r--arch/arm/xen/mm.c3
-rw-r--r--arch/arm64/include/asm/xen/swiotlb-xen.h1
-rw-r--r--drivers/virtio/virtio_ring.c2
-rw-r--r--include/xen/arm/swiotlb-xen.h10
-rw-r--r--include/xen/xen.h6
6 files changed, 22 insertions, 1 deletions
diff --git a/arch/arm/include/asm/xen/swiotlb-xen.h b/arch/arm/include/asm/xen/swiotlb-xen.h
new file mode 100644
index 00000000000000..455ade5d532054
--- /dev/null
+++ b/arch/arm/include/asm/xen/swiotlb-xen.h
@@ -0,0 +1 @@
+#include <xen/arm/swiotlb-xen.h>
diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c
index cb44aa290e73c5..8592863dd9d61b 100644
--- a/arch/arm/xen/mm.c
+++ b/arch/arm/xen/mm.c
@@ -21,6 +21,8 @@
#include <asm/xen/hypercall.h>
#include <asm/xen/interface.h>
+int xen_swiotlb __read_mostly;
+
unsigned long xen_get_swiotlb_free_pages(unsigned int order)
{
struct memblock_region *reg;
@@ -189,6 +191,7 @@ int __init xen_mm_init(void)
struct gnttab_cache_flush cflush;
if (!xen_initial_domain())
return 0;
+ xen_swiotlb = 1;
xen_swiotlb_init(1, false);
xen_dma_ops = &xen_swiotlb_dma_ops;
diff --git a/arch/arm64/include/asm/xen/swiotlb-xen.h b/arch/arm64/include/asm/xen/swiotlb-xen.h
new file mode 100644
index 00000000000000..455ade5d532054
--- /dev/null
+++ b/arch/arm64/include/asm/xen/swiotlb-xen.h
@@ -0,0 +1 @@
+#include <xen/arm/swiotlb-xen.h>
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index cd7e755484e3be..bf8badc9e67fe9 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -260,7 +260,7 @@ static bool vring_use_dma_api(struct virtio_device *vdev)
* the DMA API if we're a Xen guest, which at least allows
* all of the sensible Xen configurations to work correctly.
*/
- if (xen_domain())
+ if (xen_vring_use_dma())
return true;
return false;
diff --git a/include/xen/arm/swiotlb-xen.h b/include/xen/arm/swiotlb-xen.h
new file mode 100644
index 00000000000000..2aac7c4bb3ed70
--- /dev/null
+++ b/include/xen/arm/swiotlb-xen.h
@@ -0,0 +1,10 @@
+#ifndef _ASM_ARM_XEN_SWIOTLB_XEN_H
+#define _ASM_ARM_XEN_SWIOTLB_XEN_H
+
+#ifdef CONFIG_SWIOTLB_XEN
+extern int xen_swiotlb;
+#else
+#define xen_swiotlb (0)
+#endif
+
+#endif
diff --git a/include/xen/xen.h b/include/xen/xen.h
index 0e2156786ad29f..74a536d5e2af47 100644
--- a/include/xen/xen.h
+++ b/include/xen/xen.h
@@ -46,4 +46,10 @@ struct bio_vec;
bool xen_biovec_phys_mergeable(const struct bio_vec *vec1,
const struct bio_vec *vec2);
+#include <asm/xen/swiotlb-xen.h>
+static inline int xen_vring_use_dma(void)
+{
+ return !!xen_swiotlb;
+}
+
#endif /* _XEN_XEN_H */