[dpdk-dev] [PATCH 1/3] net/virtio_user: fix queue pair not enabled

2016-09-06 Thread Yuanhan Liu
On Fri, Aug 05, 2016 at 11:36:41AM +, Jianfeng Tan wrote:
> When virtio_user is used with OVS-DPDK (with mq disabled), it cannot
> receive any packets.
> 
> It's because when vhost provides VHOST_USER_GET_PROTOCOL_FEATURES,
> all queue pairs are initialized in the disabled state. Quote
> QEMU/docs/specs/vhost-user.txt:
> If VHOST_USER_F_PROTOCOL_FEATURES has not been negotiated, the
> ring is initialized in an enabled state.
> If VHOST_USER_F_PROTOCOL_FEATURES has been negotiated, the ring
> is initialized in a disabled state.
> 
> In OVS-DPDK, all queue pairs are in the disabled state by default.
> When used with QEMU, QEMU will set it as enabled in the process of
> initialization. So the fix here is to include similar logic in
> virtio_user.

The behaviour is actually defined by virtio spec; the vhost-user just
follows it (5.1.6.5.5 Automatic receive steering in multiqueue mode):

Multiqueue is disabled by default. The driver enables multiqueue by
executing the VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET command, specifying
the number of the transmit and receive queues to be used up to
max_virtqueue_pairs 

That is to say, it has nothing to do with OVS-DPDK; yet it's not caused
by vhost-user. For QEMU, as the the virtio-net device emulator, it just
follows the spec: it enables the 1st queue pair whenever MQ is enabled
or not. Even the MQ __feature__ is enabled and queue=2 is given, only
the 1st queue pair will be enabled. For linux virtio-net driver, you
have to use ethtool to enable more queues if you want.

However, for virtio-user, the yet another virtio-net device emulator,
it didn't follow the rule, thus something went wrong.

Put simply, you need make sure the 1st queue pair is enabled by default
and the rest (if any, say when queues=2 is given) are disabled in the
virtio-user initial stage (say, at virtio_user_dev_init()).

--yliu
> 
> Fixes: 37a7eb2ae816 ("net/virtio-user: add device emulation layer")
> 
> Reported-by: Ning Li 
> Signed-off-by: Jianfeng Tan 
> ---
>  drivers/net/virtio/virtio_user/virtio_user_dev.c | 7 +++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c 
> b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> index 376c9cf..2c4e999 100644
> --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> @@ -131,6 +131,13 @@ virtio_user_start_device(struct virtio_user_dev *dev)
>   }
>   }
>  
> + /* As this feature is negotiated from the vhost, all queues are
> +  * initialized in the disabled state. For non-mq case, we enable
> +  * the 1st queue pair by default.
> +  */
> + if (dev->features & (1ull << VHOST_USER_GET_PROTOCOL_FEATURES))
> + vhost_user_enable_queue_pair(dev->vhostfd, 0, 1);
> +
>   /* After setup all virtqueues, we need to set_features so that these
>* features can be set into each virtqueue in vhost side. And before
>* that, make sure VHOST_USER_F_PROTOCOL_FEATURES is added if mq is
> -- 
> 2.7.4


[dpdk-dev] [PATCH 1/3] net/virtio_user: fix queue pair not enabled

2016-08-05 Thread Jianfeng Tan
When virtio_user is used with OVS-DPDK (with mq disabled), it cannot
receive any packets.

It's because when vhost provides VHOST_USER_GET_PROTOCOL_FEATURES,
all queue pairs are initialized in the disabled state. Quote
QEMU/docs/specs/vhost-user.txt:
If VHOST_USER_F_PROTOCOL_FEATURES has not been negotiated, the
ring is initialized in an enabled state.
If VHOST_USER_F_PROTOCOL_FEATURES has been negotiated, the ring
is initialized in a disabled state.

In OVS-DPDK, all queue pairs are in the disabled state by default.
When used with QEMU, QEMU will set it as enabled in the process of
initialization. So the fix here is to include similar logic in
virtio_user.

Fixes: 37a7eb2ae816 ("net/virtio-user: add device emulation layer")

Reported-by: Ning Li 
Signed-off-by: Jianfeng Tan 
---
 drivers/net/virtio/virtio_user/virtio_user_dev.c | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c 
b/drivers/net/virtio/virtio_user/virtio_user_dev.c
index 376c9cf..2c4e999 100644
--- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
@@ -131,6 +131,13 @@ virtio_user_start_device(struct virtio_user_dev *dev)
}
}

+   /* As this feature is negotiated from the vhost, all queues are
+* initialized in the disabled state. For non-mq case, we enable
+* the 1st queue pair by default.
+*/
+   if (dev->features & (1ull << VHOST_USER_GET_PROTOCOL_FEATURES))
+   vhost_user_enable_queue_pair(dev->vhostfd, 0, 1);
+
/* After setup all virtqueues, we need to set_features so that these
 * features can be set into each virtqueue in vhost side. And before
 * that, make sure VHOST_USER_F_PROTOCOL_FEATURES is added if mq is
-- 
2.7.4