Patchwork [11/14] virtio-net: fix used len for tx

login
register
mail settings
Submitter Michael S. Tsirkin
Date Sept. 24, 2012, 11:05 p.m.
Message ID <18bf1e1e31f0403aabaae66a32a04d67a9bbe7da.1348527749.git.mst@redhat.com>
Download mbox | patch
Permalink /patch/186608/
State New
Headers show

Comments

Michael S. Tsirkin - Sept. 24, 2012, 11:05 p.m.
There is no out sg for TX, so used buf length for tx
should always be 0.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/virtio-net.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Jason Wang - Sept. 25, 2012, 6:15 a.m.
On 09/25/2012 07:05 AM, Michael S. Tsirkin wrote:
> There is no out sg for TX, so used buf length for tx
> should always be 0.

According to the spec, the len is "Total length of the descriptor chain 
which was used (written to)". So I wonder if we need to pass the len 
here, it looks useful for guest how many bytes were sent by the driver 
(consider qemu may truncate the packet).

> Signed-off-by: Michael S. Tsirkin<mst@redhat.com>
> ---
>   hw/virtio-net.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/hw/virtio-net.c b/hw/virtio-net.c
> index 2381ee5..d9a9f8f 100644
> --- a/hw/virtio-net.c
> +++ b/hw/virtio-net.c
> @@ -688,7 +688,7 @@ static void virtio_net_tx_complete(NetClientState *nc, ssize_t len)
>   {
>       VirtIONet *n = DO_UPCAST(NICState, nc, nc)->opaque;
>
> -    virtqueue_push(n->tx_vq,&n->async_tx.elem, n->async_tx.len);
> +    virtqueue_push(n->tx_vq,&n->async_tx.elem, 0);
>       virtio_notify(&n->vdev, n->tx_vq);
>
>       n->async_tx.elem.out_num = n->async_tx.len = 0;
> @@ -754,7 +754,7 @@ static int32_t virtio_net_flush_tx(VirtIONet *n, VirtQueue *vq)
>
>           len += ret;
>
> -        virtqueue_push(vq,&elem, len);
> +        virtqueue_push(vq,&elem, 0);
>           virtio_notify(&n->vdev, vq);
>
>           if (++num_packets>= n->tx_burst) {
Michael S. Tsirkin - Sept. 25, 2012, 7:20 a.m.
On Tue, Sep 25, 2012 at 02:15:07PM +0800, Jason Wang wrote:
> On 09/25/2012 07:05 AM, Michael S. Tsirkin wrote:
> >There is no out sg for TX, so used buf length for tx
> >should always be 0.
> 
> According to the spec, the len is "Total length of the descriptor
> chain which was used (written to)".

Right. And with TX no bytes are written at all.

> So I wonder if we need to pass
> the len here, it looks useful for guest how many bytes were sent by
> the driver (consider qemu may truncate the packet).

I thik qemu may not truncate packet.

> >Signed-off-by: Michael S. Tsirkin<mst@redhat.com>
> >---
> >  hw/virtio-net.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
> >diff --git a/hw/virtio-net.c b/hw/virtio-net.c
> >index 2381ee5..d9a9f8f 100644
> >--- a/hw/virtio-net.c
> >+++ b/hw/virtio-net.c
> >@@ -688,7 +688,7 @@ static void virtio_net_tx_complete(NetClientState *nc, ssize_t len)
> >  {
> >      VirtIONet *n = DO_UPCAST(NICState, nc, nc)->opaque;
> >
> >-    virtqueue_push(n->tx_vq,&n->async_tx.elem, n->async_tx.len);
> >+    virtqueue_push(n->tx_vq,&n->async_tx.elem, 0);
> >      virtio_notify(&n->vdev, n->tx_vq);
> >
> >      n->async_tx.elem.out_num = n->async_tx.len = 0;
> >@@ -754,7 +754,7 @@ static int32_t virtio_net_flush_tx(VirtIONet *n, VirtQueue *vq)
> >
> >          len += ret;
> >
> >-        virtqueue_push(vq,&elem, len);
> >+        virtqueue_push(vq,&elem, 0);
> >          virtio_notify(&n->vdev, vq);
> >
> >          if (++num_packets>= n->tx_burst) {

Patch

diff --git a/hw/virtio-net.c b/hw/virtio-net.c
index 2381ee5..d9a9f8f 100644
--- a/hw/virtio-net.c
+++ b/hw/virtio-net.c
@@ -688,7 +688,7 @@  static void virtio_net_tx_complete(NetClientState *nc, ssize_t len)
 {
     VirtIONet *n = DO_UPCAST(NICState, nc, nc)->opaque;
 
-    virtqueue_push(n->tx_vq, &n->async_tx.elem, n->async_tx.len);
+    virtqueue_push(n->tx_vq, &n->async_tx.elem, 0);
     virtio_notify(&n->vdev, n->tx_vq);
 
     n->async_tx.elem.out_num = n->async_tx.len = 0;
@@ -754,7 +754,7 @@  static int32_t virtio_net_flush_tx(VirtIONet *n, VirtQueue *vq)
 
         len += ret;
 
-        virtqueue_push(vq, &elem, len);
+        virtqueue_push(vq, &elem, 0);
         virtio_notify(&n->vdev, vq);
 
         if (++num_packets >= n->tx_burst) {