From: Tiwei Bie <tiwei.bie@intel.com>
To: Allain Legacy <allain.legacy@windriver.com>
Cc: maxime.coquelin@redhat.com, zhihong.wang@intel.com, dev@dpdk.org,
matt.peters@windriver.com, eric.zhang@windriver.com
Subject: Re: [PATCH] net/virtio-user: check negotiated features before set
Date: Wed, 15 Aug 2018 11:40:01 +0800 [thread overview]
Message-ID: <20180815034001.GA21177@debian.sh.intel.com> (raw)
In-Reply-To: <20180809183455.32442-1-allain.legacy@windriver.com>
On Thu, Aug 09, 2018 at 01:34:55PM -0500, Allain Legacy wrote:
> From: eric zhang <eric.zhang@windriver.com>
>
> This patch checks negotiated features to see if necessary to offload
> before set the tap device offload capabilities. It also checks if kernel
> support the TUNSETOFFLOAD operation.
>
> Signed-off-by: eric zhang <eric.zhang@windriver.com>
> Signed-off-by: Allain Legacy <allain.legacy@windriver.com>
> ---
> drivers/net/virtio/virtio_user/vhost_kernel.c | 2 +-
> drivers/net/virtio/virtio_user/vhost_kernel_tap.c | 56 +++++++++++++++++------
> drivers/net/virtio/virtio_user/vhost_kernel_tap.h | 2 +-
> 3 files changed, 44 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c
> index b2444096c..66f2eaca9 100644
> --- a/drivers/net/virtio/virtio_user/vhost_kernel.c
> +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c
> @@ -339,7 +339,7 @@ vhost_kernel_enable_queue_pair(struct virtio_user_dev *dev,
> hdr_size = sizeof(struct virtio_net_hdr);
>
> tapfd = vhost_kernel_open_tap(&dev->ifname, hdr_size, req_mq,
> - (char *)dev->mac_addr);
> + (char *)dev->mac_addr, dev->features);
> if (tapfd < 0) {
> PMD_DRV_LOG(ERR, "fail to open tap for vhost kernel");
> return -1;
> diff --git a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c
> index 9ea7ade74..eda9fb78c 100644
> --- a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c
> +++ b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c
> @@ -16,21 +16,54 @@
>
> #include "vhost_kernel_tap.h"
> #include "../virtio_logs.h"
> +#include "../virtio_pci.h"
> +
> +static int
> +vhost_kernel_tap_set_offload(int fd, uint64_t feature)
> +{
> + unsigned int offload = 0;
> +
> + if (feature & (1ULL << VIRTIO_NET_F_GUEST_CSUM))
> + offload |= TUN_F_CSUM;
> + if (feature & (1ULL << VIRTIO_NET_F_GUEST_TSO4))
> + offload |= TUN_F_TSO4;
> + if (feature & (1ULL << VIRTIO_NET_F_GUEST_TSO6))
> + offload |= TUN_F_TSO6;
> + if (feature & ((1ULL << VIRTIO_NET_F_GUEST_TSO4) |
> + (1ULL << VIRTIO_NET_F_GUEST_TSO6)) &&
> + (feature & (1ULL << VIRTIO_NET_F_GUEST_ECN)))
> + offload |= TUN_F_TSO_ECN;
> + if (feature & (1ULL << VIRTIO_NET_F_GUEST_UFO))
> + offload |= TUN_F_UFO;
> +
> + if (offload != 0) {
> + /* Check if our kernel supports TUNSETOFFLOAD */
> + if (ioctl(fd, TUNSETOFFLOAD, 0) != 0 && errno == EINVAL) {
> + PMD_DRV_LOG(ERR, "Kernel does't support TUNSETOFFLOAD\n");
> + return -ENOTSUP;
> + }
> +
> + if (ioctl(fd, TUNSETOFFLOAD, offload) != 0) {
> + offload &= ~TUN_F_UFO;
> + if (ioctl(fd, TUNSETOFFLOAD, offload) != 0) {
> + PMD_DRV_LOG(ERR, "TUNSETOFFLOAD ioctl() failed: %s\n",
> + strerror(errno));
> + return -1;
> + }
> + }
I'm not quite sure whether it's a good idea to
return failure when failed to set offloads to
tap. And QEMU also doesn't do this:
https://github.com/qemu/qemu/blob/6ad90805383e/net/tap-linux.c#L261
We should also check whether offloads available
when handling VHOST_GET_FEATURES.
Thanks
> + }
> +
> + return 0;
> +}
>
> int
> vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq,
> - const char *mac)
> + const char *mac, uint64_t features)
> {
> unsigned int tap_features;
> int sndbuf = INT_MAX;
> struct ifreq ifr;
> int tapfd;
> - unsigned int offload =
> - TUN_F_CSUM |
> - TUN_F_TSO4 |
> - TUN_F_TSO6 |
> - TUN_F_TSO_ECN |
> - TUN_F_UFO;
>
> /* TODO:
> * 1. verify we can get/set vnet_hdr_len, tap_probe_vnet_hdr_len
> @@ -90,13 +123,8 @@ vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq,
> goto error;
> }
>
> - /* TODO: before set the offload capabilities, we'd better (1) check
> - * negotiated features to see if necessary to offload; (2) query tap
> - * to see if it supports the offload capabilities.
> - */
> - if (ioctl(tapfd, TUNSETOFFLOAD, offload) != 0)
> - PMD_DRV_LOG(ERR, "TUNSETOFFLOAD ioctl() failed: %s",
> - strerror(errno));
> + if (vhost_kernel_tap_set_offload(tapfd, features) != 0)
> + goto error;
>
> memset(&ifr, 0, sizeof(ifr));
> ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
> diff --git a/drivers/net/virtio/virtio_user/vhost_kernel_tap.h b/drivers/net/virtio/virtio_user/vhost_kernel_tap.h
> index 01a026f50..e0e95b4f5 100644
> --- a/drivers/net/virtio/virtio_user/vhost_kernel_tap.h
> +++ b/drivers/net/virtio/virtio_user/vhost_kernel_tap.h
> @@ -36,4 +36,4 @@
> #define PATH_NET_TUN "/dev/net/tun"
>
> int vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq,
> - const char *mac);
> + const char *mac, uint64_t features);
> --
> 2.12.1
>
next prev parent reply other threads:[~2018-08-15 3:42 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-09 18:34 [PATCH] net/virtio-user: check negotiated features before set Allain Legacy
2018-08-10 7:07 ` Jens Freimann
2018-08-15 3:40 ` Tiwei Bie [this message]
2018-08-15 12:28 ` Legacy, Allain
2018-08-16 5:38 ` Tiwei Bie
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=20180815034001.GA21177@debian.sh.intel.com \
--to=tiwei.bie@intel.com \
--cc=allain.legacy@windriver.com \
--cc=dev@dpdk.org \
--cc=eric.zhang@windriver.com \
--cc=matt.peters@windriver.com \
--cc=maxime.coquelin@redhat.com \
--cc=zhihong.wang@intel.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 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.