qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Jason Wang <jasowang@redhat.com>
To: Vincenzo Maffione <v.maffione@gmail.com>, qemu-devel@nongnu.org
Cc: g.lettieri@iet.unipi.it, rizzo@iet.unipi.it
Subject: Re: [Qemu-devel] [PATCH] net: netmap: probe netmap interface for virtio-net header
Date: Thu, 18 Feb 2016 10:52:45 +0800	[thread overview]
Message-ID: <56C531FD.5080905@redhat.com> (raw)
In-Reply-To: <47884767b4d9df94dc2660d1aef7b6124e6d701f.1454667697.git.v.maffione@gmail.com>



On 02/05/2016 06:30 PM, Vincenzo Maffione wrote:
> Previous implementation of has_ufo, has_vnet_hdr, has_vnet_hdr_len, etc.
> did not really probe for virtio-net header support for the netmap
> interface attached to the backend. These callbacks were correct for
> VALE ports, but incorrect for hardware NICs, pipes, monitors, etc.
>
> This patch fixes the implementation to work properly with all kinds
> of netmap ports.
>
> Signed-off-by: Vincenzo Maffione <v.maffione@gmail.com>
> ---
>  net/netmap.c | 70 ++++++++++++++++++++++++++++++++++++++----------------------
>  1 file changed, 44 insertions(+), 26 deletions(-)
>
> diff --git a/net/netmap.c b/net/netmap.c
> index 9710321..f2dcaeb 100644
> --- a/net/netmap.c
> +++ b/net/netmap.c
> @@ -323,20 +323,55 @@ static void netmap_cleanup(NetClientState *nc)
>  }
>  
>  /* Offloading manipulation support callbacks. */
> -static bool netmap_has_ufo(NetClientState *nc)
> +static int netmap_do_set_vnet_hdr_len(NetmapState *s, int len, bool err_report)

Passing something like err_report usually means it was the
responsibility of caller to report. So let's remove the err_report and
let caller to decide based on the return value.

>  {
> -    return true;
> +    struct nmreq req;
> +    int err;
> +
> +    /* Issue a NETMAP_BDG_VNET_HDR command to change the virtio-net header
> +     * length for the netmap adapter associated to 's->ifname'.
> +     */
> +    memset(&req, 0, sizeof(req));
> +    pstrcpy(req.nr_name, sizeof(req.nr_name), s->ifname);
> +    req.nr_version = NETMAP_API;
> +    req.nr_cmd = NETMAP_BDG_VNET_HDR;
> +    req.nr_arg1 = len;
> +    err = ioctl(s->nmd->fd, NIOCREGIF, &req);
> +    if (err) {
> +        if (err_report) {
> +            error_report("Unable to execute NETMAP_BDG_VNET_HDR on %s: %s",
> +                         s->ifname, strerror(errno));
> +        }
> +        return -1;
> +    }
> +
> +    /* Keep track of the current length. */
> +    s->vnet_hdr_len = len;
> +
> +    return 0;
>  }
>  
> -static bool netmap_has_vnet_hdr(NetClientState *nc)
> +static bool netmap_has_vnet_hdr_len(NetClientState *nc, int len)
>  {
> +    NetmapState *s = DO_UPCAST(NetmapState, nc, nc);
> +    int prev_len = s->vnet_hdr_len;
> +
> +    /* Check that we can set the new length. */
> +    if (netmap_do_set_vnet_hdr_len(s, len, false)) {
> +        return false;
> +    }
> +
> +    /* Restore the previous length. */
> +    netmap_do_set_vnet_hdr_len(s, prev_len, true);
> +
>      return true;
>  }
>  
> -static bool netmap_has_vnet_hdr_len(NetClientState *nc, int len)
> +/* A netmap interface that supports virtio-net headers always
> + * supports UFO, so we use this callback also for the has_ufo hook. */
> +static bool netmap_has_vnet_hdr(NetClientState *nc)
>  {
> -    return len == 0 || len == sizeof(struct virtio_net_hdr) ||
> -                len == sizeof(struct virtio_net_hdr_mrg_rxbuf);
> +    return netmap_has_vnet_hdr_len(nc, sizeof(struct virtio_net_hdr));
>  }
>  
>  static void netmap_using_vnet_hdr(NetClientState *nc, bool enable)
> @@ -346,25 +381,8 @@ static void netmap_using_vnet_hdr(NetClientState *nc, bool enable)
>  static void netmap_set_vnet_hdr_len(NetClientState *nc, int len)
>  {
>      NetmapState *s = DO_UPCAST(NetmapState, nc, nc);
> -    int err;
> -    struct nmreq req;
>  
> -    /* Issue a NETMAP_BDG_VNET_HDR command to change the virtio-net header
> -     * length for the netmap adapter associated to 's->ifname'.
> -     */
> -    memset(&req, 0, sizeof(req));
> -    pstrcpy(req.nr_name, sizeof(req.nr_name), s->ifname);
> -    req.nr_version = NETMAP_API;
> -    req.nr_cmd = NETMAP_BDG_VNET_HDR;
> -    req.nr_arg1 = len;
> -    err = ioctl(s->nmd->fd, NIOCREGIF, &req);
> -    if (err) {
> -        error_report("Unable to execute NETMAP_BDG_VNET_HDR on %s: %s",
> -                     s->ifname, strerror(errno));
> -    } else {
> -        /* Keep track of the current length. */
> -        s->vnet_hdr_len = len;
> -    }
> +    netmap_do_set_vnet_hdr_len(s, len, true);
>  }
>  
>  static void netmap_set_offload(NetClientState *nc, int csum, int tso4, int tso6,
> @@ -376,7 +394,7 @@ static void netmap_set_offload(NetClientState *nc, int csum, int tso4, int tso6,
>       * enables the offloadings.
>       */
>      if (!s->vnet_hdr_len) {
> -        netmap_set_vnet_hdr_len(nc, sizeof(struct virtio_net_hdr));
> +        netmap_do_set_vnet_hdr_len(s, sizeof(struct virtio_net_hdr), true);
>      }
>  }
>  
> @@ -388,7 +406,7 @@ static NetClientInfo net_netmap_info = {
>      .receive_iov = netmap_receive_iov,
>      .poll = netmap_poll,
>      .cleanup = netmap_cleanup,
> -    .has_ufo = netmap_has_ufo,
> +    .has_ufo = netmap_has_vnet_hdr,

This look suspicious, I'm not sure this is correct for netmap. May need
a comment to explain. Usually vnet hdr does not imply ufo.

>      .has_vnet_hdr = netmap_has_vnet_hdr,
>      .has_vnet_hdr_len = netmap_has_vnet_hdr_len,
>      .using_vnet_hdr = netmap_using_vnet_hdr,

  reply	other threads:[~2016-02-18  2:53 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-05 10:30 [Qemu-devel] [PATCH] net: netmap: implement virtio-net header probe Vincenzo Maffione
2016-02-05 10:30 ` [Qemu-devel] [PATCH] net: netmap: probe netmap interface for virtio-net header Vincenzo Maffione
2016-02-18  2:52   ` Jason Wang [this message]
2016-02-18 13:34     ` Vincenzo Maffione
2016-02-23  3:29       ` 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=56C531FD.5080905@redhat.com \
    --to=jasowang@redhat.com \
    --cc=g.lettieri@iet.unipi.it \
    --cc=qemu-devel@nongnu.org \
    --cc=rizzo@iet.unipi.it \
    --cc=v.maffione@gmail.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).