diff options
| author | Andy Lutomirski <luto@kernel.org> | 2016-02-03 00:46:35 -0500 |
|---|---|---|
| committer | Michael S. Tsirkin <mst@redhat.com> | 2016-03-02 10:01:56 -0500 |
| commit | d26c96c8102549f91eb0bea6196d54711ab52176 (patch) | |
| tree | 12204a8326e31940402e0725ea99d71bbeb0e408 | |
| parent | e82becfc1879a43aa29492ae90ea6eb6c68b60fc (diff) | |
vring: Introduce vring_use_dma_api()
This is a kludge, but no one has come up with a a better idea yet.
We'll introduce DMA API support guarded by vring_use_dma_api().
Eventually we may be able to return true on more and more systems,
and hopefully we can get rid of vring_use_dma_api() entirely some
day.
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
| -rw-r--r-- | drivers/virtio/virtio_ring.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index e12e385f7ac3..ab0be6c084f6 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c | |||
| @@ -104,6 +104,30 @@ struct vring_virtqueue { | |||
| 104 | 104 | ||
| 105 | #define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq) | 105 | #define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq) |
| 106 | 106 | ||
| 107 | /* | ||
| 108 | * The interaction between virtio and a possible IOMMU is a mess. | ||
| 109 | * | ||
| 110 | * On most systems with virtio, physical addresses match bus addresses, | ||
| 111 | * and it doesn't particularly matter whether we use the DMA API. | ||
| 112 | * | ||
| 113 | * On some systems, including Xen and any system with a physical device | ||
| 114 | * that speaks virtio behind a physical IOMMU, we must use the DMA API | ||
| 115 | * for virtio DMA to work at all. | ||
| 116 | * | ||
| 117 | * On other systems, including SPARC and PPC64, virtio-pci devices are | ||
| 118 | * enumerated as though they are behind an IOMMU, but the virtio host | ||
| 119 | * ignores the IOMMU, so we must either pretend that the IOMMU isn't | ||
| 120 | * there or somehow map everything as the identity. | ||
| 121 | * | ||
| 122 | * For the time being, we preserve historic behavior and bypass the DMA | ||
| 123 | * API. | ||
| 124 | */ | ||
| 125 | |||
| 126 | static bool vring_use_dma_api(struct virtio_device *vdev) | ||
| 127 | { | ||
| 128 | return false; | ||
| 129 | } | ||
| 130 | |||
| 107 | static struct vring_desc *alloc_indirect(struct virtqueue *_vq, | 131 | static struct vring_desc *alloc_indirect(struct virtqueue *_vq, |
| 108 | unsigned int total_sg, gfp_t gfp) | 132 | unsigned int total_sg, gfp_t gfp) |
| 109 | { | 133 | { |
