Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Message-Id: <20250821064641.5025-3-jasowang@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Tested-by: Lei Yang <leiyang@redhat.com>
Reviewed-by: Eugenio Pérez <eperezma@redhat.com>

authored by

Jason Wang and committed by
Michael S. Tsirkin
447beec8 7d096cb3

+23 -32
+23 -32
drivers/virtio/virtio_ring.c
··· 405 405 if (!vq->use_dma_api) 406 406 return (dma_addr_t)virt_to_phys(cpu_addr); 407 407 408 - return dma_map_single(vring_dma_dev(vq), 409 - cpu_addr, size, direction); 408 + return virtqueue_dma_map_single_attrs(&vq->vq, cpu_addr, 409 + size, direction, 0); 410 410 } 411 411 412 412 static int vring_mapping_error(const struct vring_virtqueue *vq, ··· 451 451 if (flags & VRING_DESC_F_INDIRECT) { 452 452 if (!vq->use_dma_api) 453 453 goto out; 454 + } else if (!vring_need_unmap_buffer(vq, extra)) 455 + goto out; 454 456 455 - dma_unmap_single(vring_dma_dev(vq), 456 - extra->addr, 457 - extra->len, 458 - (flags & VRING_DESC_F_WRITE) ? 459 - DMA_FROM_DEVICE : DMA_TO_DEVICE); 460 - } else { 461 - if (!vring_need_unmap_buffer(vq, extra)) 462 - goto out; 463 - 464 - dma_unmap_page(vring_dma_dev(vq), 465 - extra->addr, 466 - extra->len, 467 - (flags & VRING_DESC_F_WRITE) ? 468 - DMA_FROM_DEVICE : DMA_TO_DEVICE); 469 - } 457 + dma_unmap_page(vring_dma_dev(vq), 458 + extra->addr, 459 + extra->len, 460 + (flags & VRING_DESC_F_WRITE) ? 461 + DMA_FROM_DEVICE : DMA_TO_DEVICE); 470 462 471 463 out: 472 464 return extra->next; ··· 1268 1276 if (flags & VRING_DESC_F_INDIRECT) { 1269 1277 if (!vq->use_dma_api) 1270 1278 return; 1279 + } else if (!vring_need_unmap_buffer(vq, extra)) 1280 + return; 1271 1281 1272 - dma_unmap_single(vring_dma_dev(vq), 1273 - extra->addr, extra->len, 1274 - (flags & VRING_DESC_F_WRITE) ? 1275 - DMA_FROM_DEVICE : DMA_TO_DEVICE); 1276 - } else { 1277 - if (!vring_need_unmap_buffer(vq, extra)) 1278 - return; 1279 - 1280 - dma_unmap_page(vring_dma_dev(vq), 1281 - extra->addr, extra->len, 1282 - (flags & VRING_DESC_F_WRITE) ? 1283 - DMA_FROM_DEVICE : DMA_TO_DEVICE); 1284 - } 1282 + dma_unmap_page(vring_dma_dev(vq), 1283 + extra->addr, extra->len, 1284 + (flags & VRING_DESC_F_WRITE) ? 1285 + DMA_FROM_DEVICE : DMA_TO_DEVICE); 1285 1286 } 1286 1287 1287 1288 static struct vring_packed_desc *alloc_indirect_packed(unsigned int total_sg, ··· 3146 3161 return (dma_addr_t)virt_to_phys(ptr); 3147 3162 } 3148 3163 3149 - return dma_map_single_attrs(vring_dma_dev(vq), ptr, size, dir, attrs); 3164 + /* DMA must never operate on areas that might be remapped. */ 3165 + if (dev_WARN_ONCE(&_vq->vdev->dev, is_vmalloc_addr(ptr), 3166 + "rejecting DMA map of vmalloc memory\n")) 3167 + return DMA_MAPPING_ERROR; 3168 + 3169 + return dma_map_page_attrs(vring_dma_dev(vq), virt_to_page(ptr), 3170 + offset_in_page(ptr), size, dir, attrs); 3150 3171 } 3151 3172 EXPORT_SYMBOL_GPL(virtqueue_dma_map_single_attrs); 3152 3173 ··· 3177 3186 if (!vq->use_dma_api) 3178 3187 return; 3179 3188 3180 - dma_unmap_single_attrs(vring_dma_dev(vq), addr, size, dir, attrs); 3189 + dma_unmap_page_attrs(vring_dma_dev(vq), addr, size, dir, attrs); 3181 3190 } 3182 3191 EXPORT_SYMBOL_GPL(virtqueue_dma_unmap_single_attrs); 3183 3192