@@ -405,8 +405,8 @@ static dma_addr_t vring_map_single(const struct vring_virtqueue *vq,
405405 if (!vq -> use_dma_api )
406406 return (dma_addr_t )virt_to_phys (cpu_addr );
407407
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 );
410410}
411411
412412static int vring_mapping_error (const struct vring_virtqueue * vq ,
@@ -451,22 +451,14 @@ static unsigned int vring_unmap_one_split(const struct vring_virtqueue *vq,
451451 if (flags & VRING_DESC_F_INDIRECT ) {
452452 if (!vq -> use_dma_api )
453453 goto out ;
454+ } else if (!vring_need_unmap_buffer (vq , extra ))
455+ goto out ;
454456
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 );
470462
471463out :
472464 return extra -> next ;
@@ -1276,20 +1268,13 @@ static void vring_unmap_extra_packed(const struct vring_virtqueue *vq,
12761268 if (flags & VRING_DESC_F_INDIRECT ) {
12771269 if (!vq -> use_dma_api )
12781270 return ;
1271+ } else if (!vring_need_unmap_buffer (vq , extra ))
1272+ return ;
12791273
1280- dma_unmap_single (vring_dma_dev (vq ),
1281- extra -> addr , extra -> len ,
1282- (flags & VRING_DESC_F_WRITE ) ?
1283- DMA_FROM_DEVICE : DMA_TO_DEVICE );
1284- } else {
1285- if (!vring_need_unmap_buffer (vq , extra ))
1286- return ;
1287-
1288- dma_unmap_page (vring_dma_dev (vq ),
1289- extra -> addr , extra -> len ,
1290- (flags & VRING_DESC_F_WRITE ) ?
1291- DMA_FROM_DEVICE : DMA_TO_DEVICE );
1292- }
1274+ dma_unmap_page (vring_dma_dev (vq ),
1275+ extra -> addr , extra -> len ,
1276+ (flags & VRING_DESC_F_WRITE ) ?
1277+ DMA_FROM_DEVICE : DMA_TO_DEVICE );
12931278}
12941279
12951280static struct vring_packed_desc * alloc_indirect_packed (unsigned int total_sg ,
@@ -3161,7 +3146,13 @@ dma_addr_t virtqueue_dma_map_single_attrs(const struct virtqueue *_vq, void *ptr
31613146 return (dma_addr_t )virt_to_phys (ptr );
31623147 }
31633148
3164- return dma_map_single_attrs (vring_dma_dev (vq ), ptr , size , dir , attrs );
3149+ /* DMA must never operate on areas that might be remapped. */
3150+ if (dev_WARN_ONCE (& _vq -> vdev -> dev , is_vmalloc_addr (ptr ),
3151+ "rejecting DMA map of vmalloc memory\n" ))
3152+ return DMA_MAPPING_ERROR ;
3153+
3154+ return dma_map_page_attrs (vring_dma_dev (vq ), virt_to_page (ptr ),
3155+ offset_in_page (ptr ), size , dir , attrs );
31653156}
31663157EXPORT_SYMBOL_GPL (virtqueue_dma_map_single_attrs );
31673158
@@ -3186,7 +3177,7 @@ void virtqueue_dma_unmap_single_attrs(const struct virtqueue *_vq,
31863177 if (!vq -> use_dma_api )
31873178 return ;
31883179
3189- dma_unmap_single_attrs (vring_dma_dev (vq ), addr , size , dir , attrs );
3180+ dma_unmap_page_attrs (vring_dma_dev (vq ), addr , size , dir , attrs );
31903181}
31913182EXPORT_SYMBOL_GPL (virtqueue_dma_unmap_single_attrs );
31923183
0 commit comments