|
@@ -25,6 +25,7 @@
|
|
|
#include <linux/hrtimer.h>
|
|
|
#include <linux/kmemleak.h>
|
|
|
#include <linux/dma-mapping.h>
|
|
|
+#include <xen/xen.h>
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
/* For development, we want to crash whenever the ring is screwed. */
|
|
@@ -136,6 +137,17 @@ struct vring_virtqueue {
|
|
|
|
|
|
static bool vring_use_dma_api(struct virtio_device *vdev)
|
|
|
{
|
|
|
+ /*
|
|
|
+ * In theory, it's possible to have a buggy QEMU-supposed
|
|
|
+ * emulated Q35 IOMMU and Xen enabled at the same time. On
|
|
|
+ * such a configuration, virtio has never worked and will
|
|
|
+ * not work without an even larger kludge. Instead, enable
|
|
|
+ * 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())
|
|
|
+ return true;
|
|
|
+
|
|
|
return false;
|
|
|
}
|
|
|
|