Commit 447beec8 authored by Jason Wang's avatar Jason Wang Committed by Michael S. Tsirkin
Browse files

virtio_ring: switch to use dma_{map|unmap}_page()



This patch switches to use dma_{map|unmap}_page() to reduce the
coverage of DMA operations. This would help for the following rework
on the virtio map operations.

Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Message-Id: <20250821064641.5025-3-jasowang@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Tested-by: default avatarLei Yang <leiyang@redhat.com>
Reviewed-by: default avatarEugenio Pérez <eperezma@redhat.com>
parent 7d096cb3
Loading
Loading
Loading
Loading
+23 −32
Original line number Diff line number Diff line
@@ -405,8 +405,8 @@ static dma_addr_t vring_map_single(const struct vring_virtqueue *vq,
	if (!vq->use_dma_api)
		return (dma_addr_t)virt_to_phys(cpu_addr);

	return dma_map_single(vring_dma_dev(vq),
			      cpu_addr, size, direction);
	return virtqueue_dma_map_single_attrs(&vq->vq, cpu_addr,
					      size, direction, 0);
}

static int vring_mapping_error(const struct vring_virtqueue *vq,
@@ -451,14 +451,7 @@ static unsigned int vring_unmap_one_split(const struct vring_virtqueue *vq,
	if (flags & VRING_DESC_F_INDIRECT) {
		if (!vq->use_dma_api)
			goto out;

		dma_unmap_single(vring_dma_dev(vq),
				 extra->addr,
				 extra->len,
				 (flags & VRING_DESC_F_WRITE) ?
				 DMA_FROM_DEVICE : DMA_TO_DEVICE);
	} else {
		if (!vring_need_unmap_buffer(vq, extra))
	} else if (!vring_need_unmap_buffer(vq, extra))
		goto out;

	dma_unmap_page(vring_dma_dev(vq),
@@ -466,7 +459,6 @@ static unsigned int vring_unmap_one_split(const struct vring_virtqueue *vq,
		       extra->len,
		       (flags & VRING_DESC_F_WRITE) ?
		       DMA_FROM_DEVICE : DMA_TO_DEVICE);
	}

out:
	return extra->next;
@@ -1276,13 +1268,7 @@ static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
	if (flags & VRING_DESC_F_INDIRECT) {
		if (!vq->use_dma_api)
			return;

		dma_unmap_single(vring_dma_dev(vq),
				 extra->addr, extra->len,
				 (flags & VRING_DESC_F_WRITE) ?
				 DMA_FROM_DEVICE : DMA_TO_DEVICE);
	} else {
		if (!vring_need_unmap_buffer(vq, extra))
	} else if (!vring_need_unmap_buffer(vq, extra))
		return;

	dma_unmap_page(vring_dma_dev(vq),
@@ -1290,7 +1276,6 @@ static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
		       (flags & VRING_DESC_F_WRITE) ?
		       DMA_FROM_DEVICE : DMA_TO_DEVICE);
}
}

static struct vring_packed_desc *alloc_indirect_packed(unsigned int total_sg,
						       gfp_t gfp)
@@ -3161,7 +3146,13 @@ dma_addr_t virtqueue_dma_map_single_attrs(const struct virtqueue *_vq, void *ptr
		return (dma_addr_t)virt_to_phys(ptr);
	}

	return dma_map_single_attrs(vring_dma_dev(vq), ptr, size, dir, attrs);
	/* DMA must never operate on areas that might be remapped. */
	if (dev_WARN_ONCE(&_vq->vdev->dev, is_vmalloc_addr(ptr),
			  "rejecting DMA map of vmalloc memory\n"))
		return DMA_MAPPING_ERROR;

	return dma_map_page_attrs(vring_dma_dev(vq), virt_to_page(ptr),
				  offset_in_page(ptr), size, dir, attrs);
}
EXPORT_SYMBOL_GPL(virtqueue_dma_map_single_attrs);

@@ -3186,7 +3177,7 @@ void virtqueue_dma_unmap_single_attrs(const struct virtqueue *_vq,
	if (!vq->use_dma_api)
		return;

	dma_unmap_single_attrs(vring_dma_dev(vq), addr, size, dir, attrs);
	dma_unmap_page_attrs(vring_dma_dev(vq), addr, size, dir, attrs);
}
EXPORT_SYMBOL_GPL(virtqueue_dma_unmap_single_attrs);