[dpdk-dev] vhost: fix multiple queue not being enabled for older kernels
Checks
Commit Message
Some macros (say VIRTIO_NET_F_MQ) are needed for enabling multiple queue,
however they are introduced since kernel v3.8, meaning build error happens
if we build DPDK vhost on those platforms.
71dfdbe66a66 ("vhost: fix build with kernel < 3.8") meant to fix it, but
in a wrong way: it completely disables the MQ features for those kernels.
However, the MQ feature doesn't depend on the kernel at all (except the
macros dependency stated above), that we could still enable the MQ feature
even the host kernel has no such support.
The right fix is to define the macro if it's not defined.
Fixes: 71dfdbe66a66 ("vhost: fix build with kernel < 3.8")
Cc: stable@dpdk.org
Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
---
lib/librte_vhost/vhost.c | 2 +-
lib/librte_vhost/vhost.h | 11 ++++-------
lib/librte_vhost/vhost_user.c | 2 +-
3 files changed, 6 insertions(+), 9 deletions(-)
Comments
On 02/23/2017 09:45 AM, Yuanhan Liu wrote:
> Some macros (say VIRTIO_NET_F_MQ) are needed for enabling multiple queue,
> however they are introduced since kernel v3.8, meaning build error happens
> if we build DPDK vhost on those platforms.
>
> 71dfdbe66a66 ("vhost: fix build with kernel < 3.8") meant to fix it, but
> in a wrong way: it completely disables the MQ features for those kernels.
> However, the MQ feature doesn't depend on the kernel at all (except the
> macros dependency stated above), that we could still enable the MQ feature
> even the host kernel has no such support.
>
> The right fix is to define the macro if it's not defined.
>
> Fixes: 71dfdbe66a66 ("vhost: fix build with kernel < 3.8")
>
> Cc: stable@dpdk.org
> Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
> ---
> lib/librte_vhost/vhost.c | 2 +-
> lib/librte_vhost/vhost.h | 11 ++++-------
> lib/librte_vhost/vhost_user.c | 2 +-
> 3 files changed, 6 insertions(+), 9 deletions(-)
>
Agree this is the right fix:
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Thanks!
Maxime
@@ -56,7 +56,7 @@
(1ULL << VIRTIO_NET_F_CTRL_VQ) | \
(1ULL << VIRTIO_NET_F_CTRL_RX) | \
(1ULL << VIRTIO_NET_F_GUEST_ANNOUNCE) | \
- (VHOST_SUPPORTS_MQ) | \
+ (1ULL << VIRTIO_NET_F_MQ) | \
(1ULL << VIRTIO_F_VERSION_1) | \
(1ULL << VHOST_F_LOG_ALL) | \
(1ULL << VHOST_USER_F_PROTOCOL_FEATURES) | \
@@ -122,12 +122,9 @@ struct vhost_virtqueue {
* introduced since kernel v3.8. This makes our
* code buildable for older kernel.
*/
-#ifdef VIRTIO_NET_F_MQ
- #define VHOST_MAX_QUEUE_PAIRS VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX
- #define VHOST_SUPPORTS_MQ (1ULL << VIRTIO_NET_F_MQ)
-#else
- #define VHOST_MAX_QUEUE_PAIRS 1
- #define VHOST_SUPPORTS_MQ 0
+#ifndef VIRTIO_NET_F_MQ
+ #define VIRTIO_NET_F_MQ 22
+ #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX 0x8000
#endif
/*
@@ -159,7 +156,7 @@ struct virtio_net {
rte_atomic16_t broadcast_rarp;
uint32_t virt_qp_nb;
int dequeue_zero_copy;
- struct vhost_virtqueue *virtqueue[VHOST_MAX_QUEUE_PAIRS * 2];
+ struct vhost_virtqueue *virtqueue[VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX * 2];
#define IF_NAME_SZ (PATH_MAX > IFNAMSIZ ? PATH_MAX : IFNAMSIZ)
char ifname[IF_NAME_SZ];
uint64_t log_size;
@@ -1015,7 +1015,7 @@
break;
case VHOST_USER_GET_QUEUE_NUM:
- msg.payload.u64 = VHOST_MAX_QUEUE_PAIRS;
+ msg.payload.u64 = VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX;
msg.size = sizeof(msg.payload.u64);
send_vhost_message(fd, &msg);
break;