mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 14:21:47 +00:00
virtio_net: fix the missing of the dma cpu sync
Commit295525e29a
("virtio_net: merge dma operations when filling mergeable buffers") unmaps the buffer with DMA_ATTR_SKIP_CPU_SYNC when the dma->ref is zero. We do that with DMA_ATTR_SKIP_CPU_SYNC, because we do not want to do the sync for the entire page_frag. But that misses the sync for the current area. This patch does cpu sync regardless of whether the ref is zero or not. Fixes:295525e29a
("virtio_net: merge dma operations when filling mergeable buffers") Reported-by: Michael Roth <michael.roth@amd.com> Closes: http://lore.kernel.org/all/20230926130451.axgodaa6tvwqs3ut@amd.com Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Acked-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
11d3f72613
commit
5720c43d52
@ -607,17 +607,17 @@ static void virtnet_rq_unmap(struct receive_queue *rq, void *buf, u32 len)
|
||||
|
||||
--dma->ref;
|
||||
|
||||
if (dma->ref) {
|
||||
if (dma->need_sync && len) {
|
||||
offset = buf - (head + sizeof(*dma));
|
||||
if (dma->need_sync && len) {
|
||||
offset = buf - (head + sizeof(*dma));
|
||||
|
||||
virtqueue_dma_sync_single_range_for_cpu(rq->vq, dma->addr, offset,
|
||||
len, DMA_FROM_DEVICE);
|
||||
}
|
||||
|
||||
return;
|
||||
virtqueue_dma_sync_single_range_for_cpu(rq->vq, dma->addr,
|
||||
offset, len,
|
||||
DMA_FROM_DEVICE);
|
||||
}
|
||||
|
||||
if (dma->ref)
|
||||
return;
|
||||
|
||||
virtqueue_dma_unmap_single_attrs(rq->vq, dma->addr, dma->len,
|
||||
DMA_FROM_DEVICE, DMA_ATTR_SKIP_CPU_SYNC);
|
||||
put_page(page);
|
||||
|
Loading…
Reference in New Issue
Block a user