All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Jason Wang <jasowang@redhat.com>, mst@redhat.com, qemu-devel@nongnu.org
Cc: clg@fr.ibm.com, qemu-stable@nongnu.org
Subject: Re: [Qemu-devel] [PATCH V2] virtio-net: unbreak any layout
Date: Wed, 15 Jul 2015 10:00:52 +0200	[thread overview]
Message-ID: <55A61334.9060600@redhat.com> (raw)
In-Reply-To: <1436946967-26349-1-git-send-email-jasowang@redhat.com>



On 15/07/2015 09:56, Jason Wang wrote:
> Commit 032a74a1c0fcdd5fd1c69e56126b4c857ee36611
> ("virtio-net: byteswap virtio-net header") breaks any layout by
> requiring out_sg[0].iov_len >= n->guest_hdr_len. Fixing this by
> copying header to temporary buffer if swap is needed, and then use
> this buffer as part of out_sg.
> 
> Fixes 032a74a1c0fcdd5fd1c69e56126b4c857ee36611
> ("virtio-net: byteswap virtio-net header")
> Cc: qemu-stable@nongnu.org
> Cc: clg@fr.ibm.com
> Signed-off-by: Jason Wang <jasowang@redhat.com>
> ---
> Changes from V1:
> - avoid header copying if there's no need to do header swap
> - don't write the header back
> ---
>  hw/net/virtio-net.c               | 17 ++++++++++++++---
>  include/hw/virtio/virtio-access.h |  9 +++++++++
>  2 files changed, 23 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index e3c2db3..12322bd 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -1142,7 +1142,8 @@ static int32_t virtio_net_flush_tx(VirtIONetQueue *q)
>          ssize_t ret, len;
>          unsigned int out_num = elem.out_num;
>          struct iovec *out_sg = &elem.out_sg[0];
> -        struct iovec sg[VIRTQUEUE_MAX_SIZE];
> +        struct iovec sg[VIRTQUEUE_MAX_SIZE], sg2[VIRTQUEUE_MAX_SIZE];
> +        struct virtio_net_hdr hdr;
>  
>          if (out_num < 1) {
>              error_report("virtio-net header not in first element");
> @@ -1150,11 +1151,21 @@ static int32_t virtio_net_flush_tx(VirtIONetQueue *q)
>          }
>  
>          if (n->has_vnet_hdr) {
> -            if (out_sg[0].iov_len < n->guest_hdr_len) {
> +            if (iov_size(out_sg, out_num) < n->guest_hdr_len) {
>                  error_report("virtio-net header incorrect");
>                  exit(1);
>              }
> -            virtio_net_hdr_swap(vdev, (void *) out_sg[0].iov_base);
> +            if (virtio_needs_swap(vdev)) {
> +                iov_to_buf(out_sg, out_num, 0, &hdr, sizeof(hdr));
> +                virtio_net_hdr_swap(vdev, (void *) &hdr);
> +                sg2[0].iov_base = &hdr;
> +                sg2[0].iov_len = sizeof(hdr);
> +                out_num = iov_copy(&sg2[1], ARRAY_SIZE(sg2) - 1,
> +                                   out_sg, out_num,
> +                                   sizeof(hdr), -1);
> +                out_num += 1;
> +                out_sg = sg2;
> +            }
>          }
>  
>          /*
> diff --git a/include/hw/virtio/virtio-access.h b/include/hw/virtio/virtio-access.h
> index cee5dd7..1ec1dfd 100644
> --- a/include/hw/virtio/virtio-access.h
> +++ b/include/hw/virtio/virtio-access.h
> @@ -143,6 +143,15 @@ static inline uint64_t virtio_ldq_p(VirtIODevice *vdev, const void *ptr)
>      }
>  }
>  
> +static inline bool virtio_needs_swap(VirtIODevice *vdev)
> +{
> +#ifdef HOST_WORDS_BIGENDIAN
> +    return virtio_access_is_big_endian(vdev) ? false : true;
> +#else
> +    return virtio_access_is_big_endian(vdev) ? true : false;
> +#endif
> +}
> +
>  static inline uint16_t virtio_tswap16(VirtIODevice *vdev, uint16_t s)
>  {
>  #ifdef HOST_WORDS_BIGENDIAN
> 

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

  reply	other threads:[~2015-07-15  8:01 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-15  7:56 [Qemu-devel] [PATCH V2] virtio-net: unbreak any layout Jason Wang
2015-07-15  8:00 ` Paolo Bonzini [this message]
2015-07-15 11:23 ` Michael S. Tsirkin
2015-07-16  5:54   ` Jason Wang
2015-07-16  6:19     ` Michael S. Tsirkin
2015-07-16  6:42 ` Michael S. Tsirkin
2015-07-16  6:49   ` Jason Wang
2015-07-16  7:29     ` Michael S. Tsirkin
2015-07-16  8:00       ` Jason Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55A61334.9060600@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=clg@fr.ibm.com \
    --cc=jasowang@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.