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: determine descriptor flags at one time

Let's determine the last descriptor by counting the number of sg. This
would be consistent with packed virtqueue implementation and ease the
future in-order implementation.

Acked-by: Eugenio Pérez <eperezma@redhat.com>
Reviewed-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Message-Id: <20251230064649.55597-15-jasowang@redhat.com>

authored by

Jason Wang and committed by
Michael S. Tsirkin
03f05c4e 1208473f

+13 -15
+13 -15
drivers/virtio/virtio_ring.c
··· 574 574 struct vring_desc_extra *extra; 575 575 struct scatterlist *sg; 576 576 struct vring_desc *desc; 577 - unsigned int i, n, avail, descs_used, prev, err_idx; 577 + unsigned int i, n, avail, descs_used, err_idx, sg_count = 0; 578 578 int head; 579 579 bool indirect; 580 580 ··· 634 634 for (sg = sgs[n]; sg; sg = sg_next(sg)) { 635 635 dma_addr_t addr; 636 636 u32 len; 637 + u16 flags = 0; 638 + 639 + if (++sg_count != total_sg) 640 + flags |= VRING_DESC_F_NEXT; 637 641 638 642 if (vring_map_one_sg(vq, sg, DMA_TO_DEVICE, &addr, &len, premapped)) 639 643 goto unmap_release; 640 644 641 - prev = i; 642 645 /* Note that we trust indirect descriptor 643 646 * table since it use stream DMA mapping. 644 647 */ 645 - i = virtqueue_add_desc_split(vq, desc, extra, i, addr, len, 646 - VRING_DESC_F_NEXT, 647 - premapped); 648 + i = virtqueue_add_desc_split(vq, desc, extra, i, addr, 649 + len, flags, premapped); 648 650 } 649 651 } 650 652 for (; n < (out_sgs + in_sgs); n++) { 651 653 for (sg = sgs[n]; sg; sg = sg_next(sg)) { 652 654 dma_addr_t addr; 653 655 u32 len; 656 + u16 flags = VRING_DESC_F_WRITE; 657 + 658 + if (++sg_count != total_sg) 659 + flags |= VRING_DESC_F_NEXT; 654 660 655 661 if (vring_map_one_sg(vq, sg, DMA_FROM_DEVICE, &addr, &len, premapped)) 656 662 goto unmap_release; 657 663 658 - prev = i; 659 664 /* Note that we trust indirect descriptor 660 665 * table since it use stream DMA mapping. 661 666 */ 662 - i = virtqueue_add_desc_split(vq, desc, extra, i, addr, len, 663 - VRING_DESC_F_NEXT | 664 - VRING_DESC_F_WRITE, 665 - premapped); 667 + i = virtqueue_add_desc_split(vq, desc, extra, i, addr, 668 + len, flags, premapped); 666 669 } 667 670 } 668 - /* Last one doesn't continue. */ 669 - desc[prev].flags &= cpu_to_virtio16(vq->vq.vdev, ~VRING_DESC_F_NEXT); 670 - if (!indirect && vring_need_unmap_buffer(vq, &extra[prev])) 671 - vq->split.desc_extra[prev & (vq->split.vring.num - 1)].flags &= 672 - ~VRING_DESC_F_NEXT; 673 671 674 672 if (indirect) { 675 673 /* Now that the indirect table is filled in, map it. */