[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v1 11/16] virtio-net: fill head desc after done all
From: |
wexu |
Subject: |
[Qemu-devel] [PATCH v1 11/16] virtio-net: fill head desc after done all in a chain |
Date: |
Thu, 22 Nov 2018 09:06:16 -0500 |
From: Wei Xu <address@hidden>
With the support of marking a descriptor used/unused in 'flags'
field for 1.1, the current way of filling a chained descriptors
does not work since driver side may get the wrong 'num_buffer'
information in case of the head descriptor has been filled in
while the subsequent ones are still in processing in device side.
This patch fills the head one after done all the others one.
Signed-off-by: Wei Xu <address@hidden>
---
hw/net/virtio-net.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 385b1a0..2db0e8b 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -1198,6 +1198,8 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc,
const uint8_t *buf,
struct virtio_net_hdr_mrg_rxbuf mhdr;
unsigned mhdr_cnt = 0;
size_t offset, i, guest_offset;
+ VirtQueueElement head;
+ int head_len = 0;
if (!virtio_net_can_receive(nc)) {
return -1;
@@ -1275,7 +1277,13 @@ static ssize_t virtio_net_receive_rcu(NetClientState
*nc, const uint8_t *buf,
}
/* signal other side */
- virtqueue_fill(q->rx_vq, elem, total, i++);
+ if (i == 0) {
+ head_len = total;
+ head = *elem;
+ } else {
+ virtqueue_fill(q->rx_vq, elem, len, i);
+ }
+ i++;
g_free(elem);
}
@@ -1286,6 +1294,7 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc,
const uint8_t *buf,
&mhdr.num_buffers, sizeof mhdr.num_buffers);
}
+ virtqueue_fill(q->rx_vq, &head, head_len, 0);
virtqueue_flush(q->rx_vq, i);
virtio_notify(vdev, q->rx_vq);
--
1.8.3.1
- [Qemu-devel] [PATCH v1 03/16] virtio: redefine structure & memory cache for packed ring, (continued)
- [Qemu-devel] [PATCH v1 03/16] virtio: redefine structure & memory cache for packed ring, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 04/16] virtio: expand offset calculation for packed ring, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 05/16] virtio: add memory region init for packed ring, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 06/16] virtio: init wrap counter for packed ring, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 07/16] virtio: init and desc empty check for packed ring, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 08/16] virtio: get avail bytes check for packed ring, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 09/16] virtio: fill/flush/pop for packed ring, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 10/16] virtio: event suppression support for packed ring, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 12/16] virtio: add userspace migration of packed ring, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 11/16] virtio-net: fill head desc after done all in a chain,
wexu <=
- [Qemu-devel] [PATCH v1 13/16] virtio: add vhost-net migration of packed ring, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 14/16] virtio: packed ring feature bit for userspace backend, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 16/16] virtio: enable packed ring via a new command line, wexu, 2018/11/22
- [Qemu-devel] [PATCH v1 15/16] vhost: enable packed ring, wexu, 2018/11/22
- Re: [Qemu-devel] [PATCH v1 00/16] packed ring virtio-net backend support, Maxime Coquelin, 2018/11/22
- Re: [Qemu-devel] [PATCH v1 00/16] packed ring virtio-net backend support, no-reply, 2018/11/23