From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-VE1-obe.outbound.protection.outlook.com (mail-eopbgr20046.outbound.protection.outlook.com [40.107.2.46]) by dpdk.org (Postfix) with ESMTP id 6A92C239 for ; Wed, 23 Jan 2019 06:58:21 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4VIdj49CiRsd4uajfC9pqsDINuBAUDABCzTwb4RHMzA=; b=qewvYwZOFjR0ODIJjOhvsD0f/bH8qmCs6Cn5vnJf4pdoRAcKPLkGwMx80VXwVAZUr3n7UNuKeDQhRu/TCFwX4YiQFC7uzw0L+4awt+dNsOm9MZUyOmhQPp0HnJRtZXQOwbd/9DfQS8Ax40/qZZPwr2PIeXkFULDXWe1VPUXQn9I= Received: from DB3PR0502MB3980.eurprd05.prod.outlook.com (52.134.72.27) by DB3PR0502MB4043.eurprd05.prod.outlook.com (52.134.68.12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1537.26; Wed, 23 Jan 2019 05:58:19 +0000 Received: from DB3PR0502MB3980.eurprd05.prod.outlook.com ([fe80::1da8:cd09:4e78:111c]) by DB3PR0502MB3980.eurprd05.prod.outlook.com ([fe80::1da8:cd09:4e78:111c%2]) with mapi id 15.20.1537.031; Wed, 23 Jan 2019 05:58:19 +0000 From: Yongseok Koh To: eric zhang CC: "stable@dpdk.org" Thread-Topic: [dpdk-stable] [PATCH] net/virtio-user: check negotiated features before set Thread-Index: AQHUsnFBDAxDmuR3uk+XEtRQTezf1aW8XGMA Date: Wed, 23 Jan 2019 05:58:19 +0000 Message-ID: References: <1548175215-7748-1-git-send-email-eric.zhang@windriver.com> In-Reply-To: <1548175215-7748-1-git-send-email-eric.zhang@windriver.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=yskoh@mellanox.com; x-originating-ip: [121.67.5.152] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; DB3PR0502MB4043; 6:Hm/29GnioKzRwZ18u4bhDJxDAPfAilc6t0tDmqTnhopRr0Cvn0vWotiqKB0gEDTex1cm7NfhxKP+s53qlSiE5s+6WN+NLBqBS8j6dz5U8QG05LFlhN14w2OBSDIfoqufcqdQp6o8ko+pzJ9wcXPcnuUmCO6O6M/LU8gLLnazVudUSRYT+nwOOw1DC4pTZVf0b2XfZgjbx75N1F7/rzIhcutAdGiIY9gt++krwTgzpYWQQDk0vPjm793QGVzwJ0ICBXe9mMR6ZuGWINyR1vwBNL/1Vz4K7kY/3Kh35cvr3vnBNZCamd3itXdalnsBnBLRjRK2+RjWhzo1mxaoCkayd/P6LXZ1wUZD5ZU1eIW0Zl4Q+phlw2WrHkAfY3Em9q3/unfqdqDiqpDFZNRB+UdyJXJEOHjo9eJ6OaU9I7VjI2GchMPo+oVnJ4V4VrL3VsmnGQRBiocjG0RV9bRbGtN7Dg==; 5:eTs6YQs0CdKBHABu+xnWWlpzruS8eOn+mx5L9cfZjtgLT1qX0GDidWP7e3NPUF45bEC09JSaAk8c0KQaZ9wlJwjGJ92nC32Ass5C+Y8fa76XmGx+Gs9In+DhfwEOlQEmY4xDy75bX6jwrnp6rGzSeja5DPouCHYwGofa8u8gOXn0ZggyOos/6Yky5rdMOTmn0eHLo60tCdy37i7W+1Wlew==; 7:rAVxJmHt8u7afk2Gnqjz93WreZQoY/Lh1G8kESmPpkOgq/cEbots2FC4rubCbACRI7kkleWeuu8AHRmGM+VUxNHFdKCytovoZZda0p9bNQT+IfYbZBIphEqATcuoXxySPgHXcRiPVnRandbk9dhDeQ== x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-correlation-id: a78029b7-b360-481f-ccb7-08d680f7c686 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600110)(711020)(4605077)(4618075)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060)(7193020); SRVR:DB3PR0502MB4043; x-ms-traffictypediagnostic: DB3PR0502MB4043: x-microsoft-antispam-prvs: x-forefront-prvs: 0926B0E013 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(346002)(39860400002)(396003)(136003)(366004)(376002)(189003)(199004)(76176011)(53546011)(7736002)(6506007)(316002)(25786009)(26005)(68736007)(446003)(82746002)(53936002)(6916009)(6436002)(186003)(14444005)(256004)(4326008)(6486002)(102836004)(3846002)(71200400001)(71190400001)(6116002)(478600001)(33656002)(97736004)(305945005)(14454004)(229853002)(99286004)(83716004)(105586002)(2906002)(11346002)(81156014)(81166006)(106356001)(6246003)(86362001)(6512007)(8936002)(36756003)(2616005)(66066001)(486006)(476003); DIR:OUT; SFP:1101; SCL:1; SRVR:DB3PR0502MB4043; H:DB3PR0502MB3980.eurprd05.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: xzSR+NJ0IvkXYbfpygi8KyTquuxRtLcEy+uH2ydTFMQKeFbF24C5/Eft6G2CD7tQfBvfIjg10oK4HGnDBm18WX9EtFT3Fdq6nj5qWRruutVg8Cmz0bG3c4PUlZZKXSwJtGFnv4sLCywSyqDtnYcToNK3T3YOigmIDV/OGlWtzfgZqnFXsTPW0bKGBnWQlurvaQwbccWwZs/PcXYAc3Qe7FXuocRO+ETSxuP7ZI36ODliPqKq68Dci1lZwcPces0jTReEfF29YLmaJgS4FZ8TwDx8KaKBptwLZAyeFQ1g/KZ9dgl1elzp/A/Nq87QePksETBhcC9FdpIjykCLEFOvddFqfD0T6pOQo+n3B1k0477Qn7PQkRsrZPiIlxXb1E8zGDOh+Rpxpo0gJLbd2kbE34NcUTy6MG6MWpD3BgLPJR0= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-ID: <3C879DC8B9943D4AAF66D3A9015B2545@eurprd05.prod.outlook.com> Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: a78029b7-b360-481f-ccb7-08d680f7c686 X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Jan 2019 05:58:19.4333 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR0502MB4043 Subject: Re: [dpdk-stable] [PATCH] net/virtio-user: check negotiated features before set X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 Jan 2019 05:58:21 -0000 > On Jan 23, 2019, at 1:40 AM, eric zhang wrote: >=20 > From: Eric Zhang >=20 > [ backported from upstream commit 1db4d2330bc849a19b9f18479ae7a5a75bc01df= 2 ] >=20 > 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. >=20 > Fixes: 5e97e4202563 ("net/virtio-user: enable offloading") > Cc: stable@dpdk.org >=20 > Signed-off-by: Eric Zhang > Reviewed-by: Tiwei Bie > --- Applied to stable/17.11 thanks, Yongseok > drivers/net/virtio/virtio_user/vhost_kernel.c | 19 ++++--- > drivers/net/virtio/virtio_user/vhost_kernel_tap.c | 68 ++++++++++++++++++= ----- > drivers/net/virtio/virtio_user/vhost_kernel_tap.h | 3 +- > 3 files changed, 68 insertions(+), 22 deletions(-) >=20 > diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/= virtio/virtio_user/vhost_kernel.c > index 68d28b1..3502001 100644 > --- a/drivers/net/virtio/virtio_user/vhost_kernel.c > +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c > @@ -189,8 +189,8 @@ prepare_vhost_memory_kernel(void) > (1ULL << VIRTIO_NET_F_HOST_TSO6) | \ > (1ULL << VIRTIO_NET_F_CSUM)) >=20 > -static int > -tap_supporte_mq(void) > +static unsigned int > +tap_support_features(void) > { > int tapfd; > unsigned int tap_features; > @@ -209,7 +209,7 @@ tap_supporte_mq(void) > } >=20 > close(tapfd); > - return tap_features & IFF_MULTI_QUEUE; > + return tap_features; > } >=20 > static int > @@ -223,6 +223,7 @@ vhost_kernel_ioctl(struct virtio_user_dev *dev, > struct vhost_memory_kernel *vm =3D NULL; > int vhostfd; > unsigned int queue_sel; > + unsigned int features; >=20 > PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]); >=20 > @@ -276,17 +277,20 @@ vhost_kernel_ioctl(struct virtio_user_dev *dev, > } >=20 > if (!ret && req_kernel =3D=3D VHOST_GET_FEATURES) { > + features =3D tap_support_features(); > /* with tap as the backend, all these features are supported > * but not claimed by vhost-net, so we add them back when > * reporting to upper layer. > */ > - *((uint64_t *)arg) |=3D VHOST_KERNEL_GUEST_OFFLOADS_MASK; > - *((uint64_t *)arg) |=3D VHOST_KERNEL_HOST_OFFLOADS_MASK; > + if (features & IFF_VNET_HDR) { > + *((uint64_t *)arg) |=3D VHOST_KERNEL_GUEST_OFFLOADS_MASK; > + *((uint64_t *)arg) |=3D VHOST_KERNEL_HOST_OFFLOADS_MASK; > + } >=20 > /* vhost_kernel will not declare this feature, but it does > * support multi-queue. > */ > - if (tap_supporte_mq()) > + if (features & IFF_MULTI_QUEUE) > *(uint64_t *)arg |=3D (1ull << VIRTIO_NET_F_MQ); > } >=20 > @@ -380,7 +384,8 @@ vhost_kernel_enable_queue_pair(struct virtio_user_dev= *dev, > else > hdr_size =3D sizeof(struct virtio_net_hdr); >=20 > - tapfd =3D vhost_kernel_open_tap(&dev->ifname, hdr_size, req_mq); > + tapfd =3D vhost_kernel_open_tap(&dev->ifname, hdr_size, req_mq, > + (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 689a5cf..e9ee774 100644 > --- a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c > +++ b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c > @@ -36,26 +36,64 @@ > #include > #include > #include > +#include > #include > #include > #include >=20 > +#include > + > #include "vhost_kernel_tap.h" > #include "../virtio_logs.h" > +#include "../virtio_pci.h" > + > +static int > +vhost_kernel_tap_set_offload(int fd, uint64_t features) > +{ > + unsigned int offload =3D 0; > + > + if (features & (1ULL << VIRTIO_NET_F_GUEST_CSUM)) { > + offload |=3D TUN_F_CSUM; > + if (features & (1ULL << VIRTIO_NET_F_GUEST_TSO4)) > + offload |=3D TUN_F_TSO4; > + if (features & (1ULL << VIRTIO_NET_F_GUEST_TSO6)) > + offload |=3D TUN_F_TSO6; > + if (features & ((1ULL << VIRTIO_NET_F_GUEST_TSO4) | > + (1ULL << VIRTIO_NET_F_GUEST_TSO6)) && > + (features & (1ULL << VIRTIO_NET_F_GUEST_ECN))) > + offload |=3D TUN_F_TSO_ECN; > + if (features & (1ULL << VIRTIO_NET_F_GUEST_UFO)) > + offload |=3D TUN_F_UFO; > + } > + > + if (offload !=3D 0) { > + /* Check if our kernel supports TUNSETOFFLOAD */ > + if (ioctl(fd, TUNSETOFFLOAD, 0) !=3D 0 && errno =3D=3D EINVAL) { > + PMD_DRV_LOG(ERR, "Kernel does't support TUNSETOFFLOAD\n"); > + return -ENOTSUP; > + } > + > + if (ioctl(fd, TUNSETOFFLOAD, offload) !=3D 0) { > + offload &=3D ~TUN_F_UFO; > + if (ioctl(fd, TUNSETOFFLOAD, offload) !=3D 0) { > + PMD_DRV_LOG(ERR, "TUNSETOFFLOAD ioctl() failed: %s\n", > + strerror(errno)); > + return -1; > + } > + } > + } > + > + return 0; > +} >=20 > int > -vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq) > +vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq, > + const char *mac, uint64_t features) > { > unsigned int tap_features; > int sndbuf =3D INT_MAX; > struct ifreq ifr; > int tapfd; > - unsigned int offload =3D > - TUN_F_CSUM | > - TUN_F_TSO4 | > - TUN_F_TSO6 | > - TUN_F_TSO_ECN | > - TUN_F_UFO; >=20 > /* TODO: > * 1. verify we can get/set vnet_hdr_len, tap_probe_vnet_hdr_len > @@ -115,13 +153,15 @@ vhost_kernel_open_tap(char **p_ifname, int hdr_size= , int req_mq) > goto error; > } >=20 > - /* 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) !=3D 0) > - PMD_DRV_LOG(ERR, "TUNSETOFFLOAD ioctl() failed: %s", > - strerror(errno)); > + vhost_kernel_tap_set_offload(tapfd, features); > + > + memset(&ifr, 0, sizeof(ifr)); > + ifr.ifr_hwaddr.sa_family =3D ARPHRD_ETHER; > + memcpy(ifr.ifr_hwaddr.sa_data, mac, ETHER_ADDR_LEN); > + if (ioctl(tapfd, SIOCSIFHWADDR, (void *)&ifr) =3D=3D -1) { > + PMD_DRV_LOG(ERR, "SIOCSIFHWADDR failed: %s", strerror(errno)); > + goto error; > + } >=20 > if (!(*p_ifname)) > *p_ifname =3D strdup(ifr.ifr_name); > diff --git a/drivers/net/virtio/virtio_user/vhost_kernel_tap.h b/drivers/= net/virtio/virtio_user/vhost_kernel_tap.h > index eae340c..ea7a6c9 100644 > --- a/drivers/net/virtio/virtio_user/vhost_kernel_tap.h > +++ b/drivers/net/virtio/virtio_user/vhost_kernel_tap.h > @@ -64,4 +64,5 @@ > /* Constants */ > #define PATH_NET_TUN "/dev/net/tun" >=20 > -int vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq); > +int vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq, > + const char *mac, uint64_t features); > --=20 > 2.7.4 >=20