[PATCH 08/33] virtio_ring: introduce dma sync api for virtio
From: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Date: 2023-02-02 11:01:35
Also in:
bpf, netdev
Subsystem:
the rest, virtio core · Maintainers:
Linus Torvalds, "Michael S. Tsirkin", Jason Wang, Eugenio Pérez
In the process of dma sync, we involved whether virtio uses dma api. On the other hand, it is also necessary to read vdev->dev.parent. So these API has been introduced. Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> --- drivers/virtio/virtio_ring.c | 61 ++++++++++++++++++++++++++++++++++++ include/linux/virtio.h | 8 +++++ 2 files changed, 69 insertions(+)
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 67eda7bc23ea..7b393133fd27 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c@@ -3102,4 +3102,65 @@ void virtio_dma_unmap(struct device *dev, dma_addr_t dma, unsigned int length, } EXPORT_SYMBOL_GPL(virtio_dma_unmap); +/** + * virtio_dma_need_sync - check dma address need sync + * @dev: virtio device + * @addr: DMA address + */ +bool virtio_dma_need_sync(struct device *dev, dma_addr_t addr) +{ + struct virtio_device *vdev = dev_to_virtio(dev); + + if (!vring_use_dma_api(vdev)) + return 0; + + return dma_need_sync(vdev->dev.parent, addr); +} +EXPORT_SYMBOL_GPL(virtio_dma_need_sync); + +/** + * virtio_dma_sync_signle_range_for_cpu - dma sync for cpu + * @dev: virtio device + * @addr: DMA address + * @offset: DMA address offset + * @size: mem size for sync + * @dir: DMA direction + * + * Before calling this function, use virtio_dma_need_sync() to confirm that the + * DMA address really needs to be synchronized + */ +void virtio_dma_sync_signle_range_for_cpu(struct device *dev, dma_addr_t addr, + unsigned long offset, size_t size, + enum dma_data_direction dir) +{ + struct virtio_device *vdev = dev_to_virtio(dev); + + dma_sync_single_range_for_cpu(vdev->dev.parent, addr, offset, + size, DMA_BIDIRECTIONAL); +} +EXPORT_SYMBOL_GPL(virtio_dma_sync_signle_range_for_cpu); + +/** + * virtio_dma_sync_signle_range_for_device - dma sync for device + * @dev: virtio device + * @addr: DMA address + * @offset: DMA address offset + * @size: mem size for sync + * @dir: DMA direction + * + * Before calling this function, use virtio_dma_need_sync() to confirm that the + * DMA address really needs to be synchronized + */ +void virtio_dma_sync_signle_range_for_device(struct device *dev, + dma_addr_t addr, + unsigned long offset, size_t size, + enum dma_data_direction dir) +{ + struct virtio_device *vdev = dev_to_virtio(dev); + + dma_sync_single_range_for_device(vdev->dev.parent, addr, offset, + size, DMA_BIDIRECTIONAL); +} +EXPORT_SYMBOL_GPL(virtio_dma_sync_signle_range_for_device); + MODULE_LICENSE("GPL");
diff --git a/include/linux/virtio.h b/include/linux/virtio.h
index ce89126becc5..8c2fae318b0c 100644
--- a/include/linux/virtio.h
+++ b/include/linux/virtio.h@@ -227,4 +227,12 @@ dma_addr_t virtio_dma_map(struct device *dev, void *addr, unsigned int length, int virtio_dma_mapping_error(struct device *dev, dma_addr_t addr); void virtio_dma_unmap(struct device *dev, dma_addr_t dma, unsigned int length, enum dma_data_direction dir); +bool virtio_dma_need_sync(struct device *dev, dma_addr_t addr); +void virtio_dma_sync_signle_range_for_cpu(struct device *dev, dma_addr_t addr, + unsigned long offset, size_t size, + enum dma_data_direction dir); +void virtio_dma_sync_signle_range_for_device(struct device *dev, + dma_addr_t addr, + unsigned long offset, size_t size, + enum dma_data_direction dir); #endif /* _LINUX_VIRTIO_H */
--
2.32.0.3.g01195cf9f
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization