net/virtio-user: fix multiqueue support with vhost kernel

Message ID 20190312071307.19393-1-tiwei.bie@intel.com (mailing list archive)
State Accepted, archived
Delegated to: Maxime Coquelin
Headers
Series net/virtio-user: fix multiqueue support with vhost kernel |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/intel-Performance-Testing success Performance Testing PASS
ci/mellanox-Performance-Testing success Performance Testing PASS
ci/Intel-compilation success Compilation OK

Commit Message

Tiwei Bie March 12, 2019, 7:13 a.m. UTC
The multiqueue support in virtio-user with vhost kernel backend
is broken when tap name isn't specified by users explicitly,
because the tap name returned by ioctl(TUNSETIFF) isn't saved
properly, and multiple tap interfaces will be created in this
case. Fix this by saving the dynamically allocated tap name
first before reusing the ifr structure. Besides, also make it
possible to support the format string in tap name (e.g. foo%d)
specified by users explicitly.

Fixes: 791b43e08842 ("net/virtio-user: specify MAC of the tap")
Cc: stable@dpdk.org

Reported-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
---
 drivers/net/virtio/virtio_user/vhost_kernel_tap.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)
  

Comments

Maxime Coquelin March 12, 2019, 12:53 p.m. UTC | #1
On 3/12/19 8:13 AM, Tiwei Bie wrote:
> The multiqueue support in virtio-user with vhost kernel backend
> is broken when tap name isn't specified by users explicitly,
> because the tap name returned by ioctl(TUNSETIFF) isn't saved
> properly, and multiple tap interfaces will be created in this
> case. Fix this by saving the dynamically allocated tap name
> first before reusing the ifr structure. Besides, also make it
> possible to support the format string in tap name (e.g. foo%d)
> specified by users explicitly.
> 
> Fixes: 791b43e08842 ("net/virtio-user: specify MAC of the tap")
> Cc: stable@dpdk.org
> 
> Reported-by: Stephen Hemminger <stephen@networkplumber.org>
> Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
> ---
>   drivers/net/virtio/virtio_user/vhost_kernel_tap.c | 12 ++++++++++--
>   1 file changed, 10 insertions(+), 2 deletions(-)
> 

Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
  
Stephen Hemminger March 12, 2019, 5:42 p.m. UTC | #2
On Tue, 12 Mar 2019 15:13:07 +0800
Tiwei Bie <tiwei.bie@intel.com> wrote:

> The multiqueue support in virtio-user with vhost kernel backend
> is broken when tap name isn't specified by users explicitly,
> because the tap name returned by ioctl(TUNSETIFF) isn't saved
> properly, and multiple tap interfaces will be created in this
> case. Fix this by saving the dynamically allocated tap name
> first before reusing the ifr structure. Besides, also make it
> possible to support the format string in tap name (e.g. foo%d)
> specified by users explicitly.
> 
> Fixes: 791b43e08842 ("net/virtio-user: specify MAC of the tap")
> Cc: stable@dpdk.org
> 
> Reported-by: Stephen Hemminger <stephen@networkplumber.org>
> Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>

Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>

Does this have any impact on primary/secondary support?
  
Tiwei Bie March 13, 2019, 6:14 a.m. UTC | #3
On Tue, Mar 12, 2019 at 10:42:39AM -0700, Stephen Hemminger wrote:
> On Tue, 12 Mar 2019 15:13:07 +0800
> Tiwei Bie <tiwei.bie@intel.com> wrote:
> 
> > The multiqueue support in virtio-user with vhost kernel backend
> > is broken when tap name isn't specified by users explicitly,
> > because the tap name returned by ioctl(TUNSETIFF) isn't saved
> > properly, and multiple tap interfaces will be created in this
> > case. Fix this by saving the dynamically allocated tap name
> > first before reusing the ifr structure. Besides, also make it
> > possible to support the format string in tap name (e.g. foo%d)
> > specified by users explicitly.
> > 
> > Fixes: 791b43e08842 ("net/virtio-user: specify MAC of the tap")
> > Cc: stable@dpdk.org
> > 
> > Reported-by: Stephen Hemminger <stephen@networkplumber.org>
> > Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
> 
> Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
> 
> Does this have any impact on primary/secondary support?

No. But I think there are some other issues with virtio-user
on primary/secondary support currently. I plan to send some
fixes for it later.

Thanks,
Tiwei
  
Maxime Coquelin March 20, 2019, 7:35 a.m. UTC | #4
On 3/12/19 8:13 AM, Tiwei Bie wrote:
> The multiqueue support in virtio-user with vhost kernel backend
> is broken when tap name isn't specified by users explicitly,
> because the tap name returned by ioctl(TUNSETIFF) isn't saved
> properly, and multiple tap interfaces will be created in this
> case. Fix this by saving the dynamically allocated tap name
> first before reusing the ifr structure. Besides, also make it
> possible to support the format string in tap name (e.g. foo%d)
> specified by users explicitly.
> 
> Fixes: 791b43e08842 ("net/virtio-user: specify MAC of the tap")
> Cc: stable@dpdk.org
> 
> Reported-by: Stephen Hemminger <stephen@networkplumber.org>
> Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
> ---
>   drivers/net/virtio/virtio_user/vhost_kernel_tap.c | 12 ++++++++++--
>   1 file changed, 10 insertions(+), 2 deletions(-)
> 

Applied to dpdk-next-virtio/master branch.

Thanks,
Maxime
  

Patch

diff --git a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c
index a3faf1d0c..fbd9e979d 100644
--- a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c
+++ b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c
@@ -62,6 +62,7 @@  vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq,
 			 const char *mac, uint64_t features)
 {
 	unsigned int tap_features;
+	char *tap_name = NULL;
 	int sndbuf = INT_MAX;
 	struct ifreq ifr;
 	int tapfd;
@@ -112,6 +113,12 @@  vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq,
 		goto error;
 	}
 
+	tap_name = strdup(ifr.ifr_name);
+	if (!tap_name) {
+		PMD_DRV_LOG(ERR, "strdup ifname failed: %s", strerror(errno));
+		goto error;
+	}
+
 	fcntl(tapfd, F_SETFL, O_NONBLOCK);
 
 	if (ioctl(tapfd, TUNSETVNETHDRSZ, &hdr_size) < 0) {
@@ -134,11 +141,12 @@  vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq,
 		goto error;
 	}
 
-	if (!(*p_ifname))
-		*p_ifname = strdup(ifr.ifr_name);
+	free(*p_ifname);
+	*p_ifname = tap_name;
 
 	return tapfd;
 error:
+	free(tap_name);
 	close(tapfd);
 	return -1;
 }