[dpdk-dev,v2] net/virtio-user: fix multiple queues fail in server mode

Message ID 20180510093623.82588-1-zhiyong.yang@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
ci/checkpatch warning coding style issues

Commit Message

Yang, Zhiyong May 10, 2018, 9:36 a.m. UTC
  This patch fixes multiple queues failure when virtio-user works in
server mode.

This patch adds feature negotiation in the processing of virtio-user
reccnnection.

Fixes: bd8f50a45d0f ("net/virtio-user: support server mode")

Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
---

Changes in V2:
1. fix a comment typo.
2. add feature negotiation in the processing of reconnection.

 drivers/net/virtio/virtio_user/vhost_user.c      |  3 +++
 drivers/net/virtio/virtio_user/virtio_user_dev.c | 14 ++++++++++----
 drivers/net/virtio/virtio_user_ethdev.c          | 20 ++++++++++++++++++++
 3 files changed, 33 insertions(+), 4 deletions(-)
  

Comments

Tiwei Bie May 10, 2018, 10:23 a.m. UTC | #1
On Thu, May 10, 2018 at 05:36:23PM +0800, zhiyong.yang@intel.com wrote:
> This patch fixes multiple queues failure when virtio-user works in
> server mode.
> 
> This patch adds feature negotiation in the processing of virtio-user
> reccnnection.

typo: reccnnection

> 
> Fixes: bd8f50a45d0f ("net/virtio-user: support server mode")
> 
> Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
> ---
> 
> Changes in V2:
> 1. fix a comment typo.
> 2. add feature negotiation in the processing of reconnection.
> 
>  drivers/net/virtio/virtio_user/vhost_user.c      |  3 +++
>  drivers/net/virtio/virtio_user/virtio_user_dev.c | 14 ++++++++++----
>  drivers/net/virtio/virtio_user_ethdev.c          | 20 ++++++++++++++++++++
>  3 files changed, 33 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c
> index a6df97a..93e4d92 100644
> --- a/drivers/net/virtio/virtio_user/vhost_user.c
> +++ b/drivers/net/virtio/virtio_user/vhost_user.c
> @@ -263,6 +263,9 @@ struct hugepage_file_info {
>  
>  	PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]);
>  
> +	if (dev->is_server && vhostfd < 0)
> +		return -1;
> +
>  	msg.request = req;
>  	msg.flags = VHOST_USER_VERSION;
>  	msg.size = 0;
> diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> index 38b8bc9..b7e1915 100644
> --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> @@ -447,10 +447,16 @@ int virtio_user_stop_device(struct virtio_user_dev *dev)
>  		return -1;
>  	}
>  
> -	for (i = 0; i < q_pairs; ++i)
> -		ret |= dev->ops->enable_qp(dev, i, 1);
> -	for (i = q_pairs; i < dev->max_queue_pairs; ++i)
> -		ret |= dev->ops->enable_qp(dev, i, 0);
> +	/* Server mode can't enable queue pairs if vhostfd is invalid,
> +	 * always return 0 in this case.
> +	 */
> +	if (dev->vhostfd >= 0)  {
> +		for (i = 0; i < q_pairs; ++i)
> +			ret |= dev->ops->enable_qp(dev, i, 1);
> +		for (i = q_pairs; i < dev->max_queue_pairs; ++i)
> +			ret |= dev->ops->enable_qp(dev, i, 0);
> +	} else if (!dev->is_server)
> +		ret = ~0;

You need to find a chance to enable these queue pairs
when the connection is established.

>  
>  	dev->queue_pairs = q_pairs;
>  
> diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c
> index 4e7b3c3..91a0c44 100644
> --- a/drivers/net/virtio/virtio_user_ethdev.c
> +++ b/drivers/net/virtio/virtio_user_ethdev.c
> @@ -30,6 +30,7 @@
>  	int ret;
>  	int flag;
>  	int connectfd;
> +	uint64_t features = dev->device_features, status;
>  	struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id];
>  
>  	connectfd = accept(dev->listenfd, NULL, NULL);
> @@ -37,6 +38,25 @@
>  		return -1;
>  
>  	dev->vhostfd = connectfd;
> +	if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES,
> +				   &dev->device_features) < 0) {
> +		PMD_INIT_LOG(ERR, "get_features failed: %s",
> +			     strerror(errno));
> +		return -1;
> +	}
> +
> +	status = features & ~dev->device_features;

There is no need to introduce `status`.

> +	/* For following bits, vhost-user doesn't really need to know */
> +	status &= ~(1ull << VIRTIO_NET_F_MAC);
> +	status &= ~(1ull << VIRTIO_NET_F_CTRL_VLAN);
> +	status &= ~(1ull << VIRTIO_NET_F_CTRL_MAC_ADDR);
> +	status &= ~(1ull << VIRTIO_NET_F_STATUS);
> +	if (status)
> +		PMD_INIT_LOG(ERR, "WARNING: Some features (0x%lx) are not supported by vhost-user!",

You will want to use PRIx64 here.

Thanks

> +			     status);
> +
> +	dev->features &= dev->device_features;
> +
>  	flag = fcntl(connectfd, F_GETFD);
>  	fcntl(connectfd, F_SETFL, flag | O_NONBLOCK);
>  
> -- 
> 1.8.3.1
>
  
Yang, Zhiyong May 10, 2018, 2:01 p.m. UTC | #2
Hi tiwei,

Thanks for your review firstly.  Reply inline.

> -----Original Message-----

> From: Bie, Tiwei

> Sent: Thursday, May 10, 2018 6:23 PM

> To: Yang, Zhiyong <zhiyong.yang@intel.com>

> Cc: dev@dpdk.org; stable@dpdk.org; maxime.coquelin@redhat.com; Yigit,

> Ferruh <ferruh.yigit@intel.com>

> Subject: Re: [PATCH v2] net/virtio-user: fix multiple queues fail in server

> mode

> 

> On Thu, May 10, 2018 at 05:36:23PM +0800, zhiyong.yang@intel.com wrote:

> > This patch fixes multiple queues failure when virtio-user works in

> > server mode.

> >

> > This patch adds feature negotiation in the processing of virtio-user

> > reccnnection.

> 

> typo: reccnnection

> 


Fix it.

> >

> > Fixes: bd8f50a45d0f ("net/virtio-user: support server mode")

> >

> > Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>

> > ---

> >

> > Changes in V2:

> > 1. fix a comment typo.

> > 2. add feature negotiation in the processing of reconnection.

> >

> >  drivers/net/virtio/virtio_user/vhost_user.c      |  3 +++

> >  drivers/net/virtio/virtio_user/virtio_user_dev.c | 14 ++++++++++----

> >  drivers/net/virtio/virtio_user_ethdev.c          | 20

> ++++++++++++++++++++

> >  3 files changed, 33 insertions(+), 4 deletions(-)

> >

> > diff --git a/drivers/net/virtio/virtio_user/vhost_user.c

> > b/drivers/net/virtio/virtio_user/vhost_user.c

> > index a6df97a..93e4d92 100644

> > --- a/drivers/net/virtio/virtio_user/vhost_user.c

> > +++ b/drivers/net/virtio/virtio_user/vhost_user.c

> > @@ -263,6 +263,9 @@ struct hugepage_file_info {

> >

> >  	PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]);

> >

> > +	if (dev->is_server && vhostfd < 0)

> > +		return -1;

> > +

> >  	msg.request = req;

> >  	msg.flags = VHOST_USER_VERSION;

> >  	msg.size = 0;

> > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c

> > b/drivers/net/virtio/virtio_user/virtio_user_dev.c

> > index 38b8bc9..b7e1915 100644

> > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c

> > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c

> > @@ -447,10 +447,16 @@ int virtio_user_stop_device(struct

> virtio_user_dev *dev)

> >  		return -1;

> >  	}

> >

> > -	for (i = 0; i < q_pairs; ++i)

> > -		ret |= dev->ops->enable_qp(dev, i, 1);

> > -	for (i = q_pairs; i < dev->max_queue_pairs; ++i)

> > -		ret |= dev->ops->enable_qp(dev, i, 0);

> > +	/* Server mode can't enable queue pairs if vhostfd is invalid,

> > +	 * always return 0 in this case.

> > +	 */

> > +	if (dev->vhostfd >= 0)  {

> > +		for (i = 0; i < q_pairs; ++i)

> > +			ret |= dev->ops->enable_qp(dev, i, 1);

> > +		for (i = q_pairs; i < dev->max_queue_pairs; ++i)

> > +			ret |= dev->ops->enable_qp(dev, i, 0);

> > +	} else if (!dev->is_server)

> > +		ret = ~0;

> 

> You need to find a chance to enable these queue pairs when the connection

> is established.

> 

Enable only one queue pairs in virtio_user_start_device.
 I want to call virtio_user_handle_mq after virtio_user_start_device in virtio_user_server_reconnect. How about ?

> >

> >  	dev->queue_pairs = q_pairs;

> >

> > diff --git a/drivers/net/virtio/virtio_user_ethdev.c

> > b/drivers/net/virtio/virtio_user_ethdev.c

> > index 4e7b3c3..91a0c44 100644

> > --- a/drivers/net/virtio/virtio_user_ethdev.c

> > +++ b/drivers/net/virtio/virtio_user_ethdev.c

> > @@ -30,6 +30,7 @@

> >  	int ret;

> >  	int flag;

> >  	int connectfd;

> > +	uint64_t features = dev->device_features, status;

> >  	struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id];

> >

> >  	connectfd = accept(dev->listenfd, NULL, NULL); @@ -37,6 +38,25

> @@

> >  		return -1;

> >

> >  	dev->vhostfd = connectfd;

> > +	if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES,

> > +				   &dev->device_features) < 0) {

> > +		PMD_INIT_LOG(ERR, "get_features failed: %s",

> > +			     strerror(errno));

> > +		return -1;

> > +	}

> > +

> > +	status = features & ~dev->device_features;

> 

> There is no need to introduce `status`.

> 

Ok, remove it.

> > +	/* For following bits, vhost-user doesn't really need to know */

> > +	status &= ~(1ull << VIRTIO_NET_F_MAC);

> > +	status &= ~(1ull << VIRTIO_NET_F_CTRL_VLAN);

> > +	status &= ~(1ull << VIRTIO_NET_F_CTRL_MAC_ADDR);

> > +	status &= ~(1ull << VIRTIO_NET_F_STATUS);

> > +	if (status)

> > +		PMD_INIT_LOG(ERR, "WARNING: Some features (0x%lx) are

> not supported

> > +by vhost-user!",

> 

> You will want to use PRIx64 here.

> 

Ok.

Thanks
Zhiyong
  
Tiwei Bie May 10, 2018, 2:19 p.m. UTC | #3
On Thu, May 10, 2018 at 10:01:55PM +0800, Yang, Zhiyong wrote:
> Hi tiwei,
> 
> Thanks for your review firstly.  Reply inline.
> 
> > -----Original Message-----
> > From: Bie, Tiwei
> > Sent: Thursday, May 10, 2018 6:23 PM
> > To: Yang, Zhiyong <zhiyong.yang@intel.com>
> > Cc: dev@dpdk.org; stable@dpdk.org; maxime.coquelin@redhat.com; Yigit,
> > Ferruh <ferruh.yigit@intel.com>
> > Subject: Re: [PATCH v2] net/virtio-user: fix multiple queues fail in server
> > mode
> > 
> > On Thu, May 10, 2018 at 05:36:23PM +0800, zhiyong.yang@intel.com wrote:
> > > This patch fixes multiple queues failure when virtio-user works in
> > > server mode.
> > >
> > > This patch adds feature negotiation in the processing of virtio-user
> > > reccnnection.
> > 
> > typo: reccnnection
> > 
> 
> Fix it.
> 
> > >
> > > Fixes: bd8f50a45d0f ("net/virtio-user: support server mode")
> > >
> > > Signed-off-by: Zhiyong Yang <zhiyong.yang@intel.com>
> > > ---
> > >
> > > Changes in V2:
> > > 1. fix a comment typo.
> > > 2. add feature negotiation in the processing of reconnection.
> > >
> > >  drivers/net/virtio/virtio_user/vhost_user.c      |  3 +++
> > >  drivers/net/virtio/virtio_user/virtio_user_dev.c | 14 ++++++++++----
> > >  drivers/net/virtio/virtio_user_ethdev.c          | 20
> > ++++++++++++++++++++
> > >  3 files changed, 33 insertions(+), 4 deletions(-)
> > >
> > > diff --git a/drivers/net/virtio/virtio_user/vhost_user.c
> > > b/drivers/net/virtio/virtio_user/vhost_user.c
> > > index a6df97a..93e4d92 100644
> > > --- a/drivers/net/virtio/virtio_user/vhost_user.c
> > > +++ b/drivers/net/virtio/virtio_user/vhost_user.c
> > > @@ -263,6 +263,9 @@ struct hugepage_file_info {
> > >
> > >  	PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]);
> > >
> > > +	if (dev->is_server && vhostfd < 0)
> > > +		return -1;
> > > +
> > >  	msg.request = req;
> > >  	msg.flags = VHOST_USER_VERSION;
> > >  	msg.size = 0;
> > > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> > > b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> > > index 38b8bc9..b7e1915 100644
> > > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> > > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> > > @@ -447,10 +447,16 @@ int virtio_user_stop_device(struct
> > virtio_user_dev *dev)
> > >  		return -1;
> > >  	}
> > >
> > > -	for (i = 0; i < q_pairs; ++i)
> > > -		ret |= dev->ops->enable_qp(dev, i, 1);
> > > -	for (i = q_pairs; i < dev->max_queue_pairs; ++i)
> > > -		ret |= dev->ops->enable_qp(dev, i, 0);
> > > +	/* Server mode can't enable queue pairs if vhostfd is invalid,
> > > +	 * always return 0 in this case.
> > > +	 */
> > > +	if (dev->vhostfd >= 0)  {
> > > +		for (i = 0; i < q_pairs; ++i)
> > > +			ret |= dev->ops->enable_qp(dev, i, 1);
> > > +		for (i = q_pairs; i < dev->max_queue_pairs; ++i)
> > > +			ret |= dev->ops->enable_qp(dev, i, 0);
> > > +	} else if (!dev->is_server)
> > > +		ret = ~0;
> > 
> > You need to find a chance to enable these queue pairs when the connection
> > is established.
> > 
> Enable only one queue pairs in virtio_user_start_device.
>  I want to call virtio_user_handle_mq after virtio_user_start_device in virtio_user_server_reconnect. How about ?

Sound good.

Thanks
  

Patch

diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c
index a6df97a..93e4d92 100644
--- a/drivers/net/virtio/virtio_user/vhost_user.c
+++ b/drivers/net/virtio/virtio_user/vhost_user.c
@@ -263,6 +263,9 @@  struct hugepage_file_info {
 
 	PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]);
 
+	if (dev->is_server && vhostfd < 0)
+		return -1;
+
 	msg.request = req;
 	msg.flags = VHOST_USER_VERSION;
 	msg.size = 0;
diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c
index 38b8bc9..b7e1915 100644
--- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
@@ -447,10 +447,16 @@  int virtio_user_stop_device(struct virtio_user_dev *dev)
 		return -1;
 	}
 
-	for (i = 0; i < q_pairs; ++i)
-		ret |= dev->ops->enable_qp(dev, i, 1);
-	for (i = q_pairs; i < dev->max_queue_pairs; ++i)
-		ret |= dev->ops->enable_qp(dev, i, 0);
+	/* Server mode can't enable queue pairs if vhostfd is invalid,
+	 * always return 0 in this case.
+	 */
+	if (dev->vhostfd >= 0)  {
+		for (i = 0; i < q_pairs; ++i)
+			ret |= dev->ops->enable_qp(dev, i, 1);
+		for (i = q_pairs; i < dev->max_queue_pairs; ++i)
+			ret |= dev->ops->enable_qp(dev, i, 0);
+	} else if (!dev->is_server)
+		ret = ~0;
 
 	dev->queue_pairs = q_pairs;
 
diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c
index 4e7b3c3..91a0c44 100644
--- a/drivers/net/virtio/virtio_user_ethdev.c
+++ b/drivers/net/virtio/virtio_user_ethdev.c
@@ -30,6 +30,7 @@ 
 	int ret;
 	int flag;
 	int connectfd;
+	uint64_t features = dev->device_features, status;
 	struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id];
 
 	connectfd = accept(dev->listenfd, NULL, NULL);
@@ -37,6 +38,25 @@ 
 		return -1;
 
 	dev->vhostfd = connectfd;
+	if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES,
+				   &dev->device_features) < 0) {
+		PMD_INIT_LOG(ERR, "get_features failed: %s",
+			     strerror(errno));
+		return -1;
+	}
+
+	status = features & ~dev->device_features;
+	/* For following bits, vhost-user doesn't really need to know */
+	status &= ~(1ull << VIRTIO_NET_F_MAC);
+	status &= ~(1ull << VIRTIO_NET_F_CTRL_VLAN);
+	status &= ~(1ull << VIRTIO_NET_F_CTRL_MAC_ADDR);
+	status &= ~(1ull << VIRTIO_NET_F_STATUS);
+	if (status)
+		PMD_INIT_LOG(ERR, "WARNING: Some features (0x%lx) are not supported by vhost-user!",
+			     status);
+
+	dev->features &= dev->device_features;
+
 	flag = fcntl(connectfd, F_GETFD);
 	fcntl(connectfd, F_SETFL, flag | O_NONBLOCK);