diff --git a/Documentation/topics/dpdk/vhost-user.rst b/Documentation/topics/dpdk/vhost-user.rst
index 3c02738cfcc..20e8eb245b9 100644
--- a/Documentation/topics/dpdk/vhost-user.rst
+++ b/Documentation/topics/dpdk/vhost-user.rst
@@ -375,6 +375,21 @@ Tx retries max can be set for vhost-user-client ports::
Configurable vhost tx retries are not supported with vhost-user ports.
+vhost-user-client max queue pairs config
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For vhost-user-client interfaces using the VDUSE backend, the maximum number of
+queue pairs the Virtio device will support can be set at port creation time. If
+not set, the default value is 1 queue pair. This value is ignored for
+Vhost-user backends.
+
+Maximum number of queue pairs can be set for vhost-user-client-ports::
+
+ $ ovs-vsctl add-port br0 vduse0 \
+ -- set Interface vduse0 type=dpdkvhostuserclient \
+ options:vhost-server-path=/dev/vduse/vduse0 \
+ options:vhost-max-queue-pairs=4
+
.. _dpdk-testpmd:
DPDK in the Guest
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 449c660a77d..b88247a2d0f 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -19,6 +19,7 @@
#include
#include
+#include
#include
#include
#include
@@ -153,6 +154,11 @@ typedef uint16_t dpdk_port_t;
/* Legacy default value for vhost tx retries. */
#define VHOST_ENQ_RETRY_DEF 8
+/* VDUSE-only, ignore for vhost-user. */
+#define VHOST_MAX_QUEUE_PAIRS_MIN 1
+#define VHOST_MAX_QUEUE_PAIRS_DEF VHOST_MAX_QUEUE_PAIRS_MIN
+#define VHOST_MAX_QUEUE_PAIRS_MAX 128
+
#define IF_NAME_SZ (PATH_MAX > IFNAMSIZ ? PATH_MAX : IFNAMSIZ)
/* List of required flags advertised by the hardware that will be used
@@ -554,6 +560,9 @@ struct netdev_dpdk {
/* Socket ID detected when vHost device is brought up */
int requested_socket_id;
+ /* Ignored by DPDK for vhost-user backends, only for VDUSE. */
+ uint8_t vhost_max_queue_pairs;
+
/* Denotes whether vHost port is client/server mode */
uint64_t vhost_driver_flags;
@@ -1606,6 +1615,8 @@ vhost_common_construct(struct netdev *netdev)
atomic_init(&dev->vhost_tx_retries_max, VHOST_ENQ_RETRY_DEF);
+ dev->vhost_max_queue_pairs = VHOST_MAX_QUEUE_PAIRS_DEF;
+
return common_construct(netdev, DPDK_ETH_PORT_ID_INVALID,
DPDK_DEV_VHOST, socket_id);
}
@@ -2488,6 +2499,7 @@ netdev_dpdk_vhost_client_set_config(struct netdev *netdev,
struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
const char *path;
int max_tx_retries, cur_max_tx_retries;
+ uint32_t max_queue_pairs;
ovs_mutex_lock(&dev->mutex);
if (!(dev->vhost_driver_flags & RTE_VHOST_USER_CLIENT)) {
@@ -2495,6 +2507,15 @@ netdev_dpdk_vhost_client_set_config(struct netdev *netdev,
if (!nullable_string_is_equal(path, dev->vhost_id)) {
free(dev->vhost_id);
dev->vhost_id = nullable_xstrdup(path);
+
+ max_queue_pairs = smap_get_int(args, "vhost-max-queue-pairs",
+ VHOST_MAX_QUEUE_PAIRS_DEF);
+ if (max_queue_pairs < VHOST_MAX_QUEUE_PAIRS_MIN
+ || max_queue_pairs > VHOST_MAX_QUEUE_PAIRS_MAX) {
+ max_queue_pairs = VHOST_MAX_QUEUE_PAIRS_DEF;
+ }
+ dev->vhost_max_queue_pairs = max_queue_pairs;
+
netdev_request_reconfigure(netdev);
}
}
@@ -6397,6 +6418,18 @@ netdev_dpdk_vhost_client_reconfigure(struct netdev *netdev)
goto unlock;
}
+ /* Setting max queue pairs is only useful and effective with VDUSE. */
+ if (strncmp(dev->vhost_id, "/dev/vduse/", 11) == 0) {
+ uint32_t max_qp = dev->vhost_max_queue_pairs;
+
+ err = rte_vhost_driver_set_max_queue_num(dev->vhost_id, max_qp);
+ if (err) {
+ VLOG_ERR("rte_vhost_driver_set_max_queue_num failed for "
+ "vhost-user client port: %s\n", dev->up.name);
+ goto unlock;
+ }
+ }
+
err = rte_vhost_driver_start(dev->vhost_id);
if (err) {
VLOG_ERR("rte_vhost_driver_start failed for vhost user "
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index 275bcbec0b5..fc844576c20 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -3540,6 +3540,19 @@ ovs-vsctl add-port br0 p0 -- set Interface p0 type=patch options:peer=p1 \
+
+
+ The value specifies the maximum number of queue pairs supported by
+ a vHost device. This is ignored for vhost-user backends, only VDUSE
+ is supported.
+ Only supported by dpdkvhostuserclient interfaces.
+
+
+ Default value is 1.
+
+
+