Skip to content

Commit

Permalink
netdev-dpdk: Set Vhost port maximum number of queue pairs.
Browse files Browse the repository at this point in the history
This patch uses the new rte_vhost_driver_set_max_queue_num
API to set the maximum number of queue pairs supported by
the Vhost-user port.

This is required for VDUSE which needs to specify the
maximum number of queue pairs at creation time. Without it
128 queue pairs metadata would be allocated.

To configure it, a new 'vhost-queue-pairs-max' option is
introduced.

Signed-off-by: Maxime Coquelin <[email protected]>
Acked-by: Eelco Chaudron <[email protected]>
Signed-off-by: 0-day Robot <[email protected]>
  • Loading branch information
mcoquelin authored and ovsrobot committed Dec 4, 2024
1 parent 77ac0b2 commit e29d1b7
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
15 changes: 15 additions & 0 deletions Documentation/topics/dpdk/vhost-user.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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 umber 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. As of DPDK v24.11, 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-queue-pairs-max=4

.. _dpdk-testpmd:

DPDK in the Guest
Expand Down
27 changes: 27 additions & 0 deletions lib/netdev-dpdk.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include <errno.h>
#include <signal.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
Expand Down Expand Up @@ -153,6 +154,9 @@ 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_QUEUE_PAIRS_MAX_DEF 1

#define IF_NAME_SZ (PATH_MAX > IFNAMSIZ ? PATH_MAX : IFNAMSIZ)

/* List of required flags advertised by the hardware that will be used
Expand Down Expand Up @@ -497,6 +501,9 @@ struct netdev_dpdk {

atomic_uint8_t vhost_tx_retries_max;

/* Ignored by DPDK for Vhost-user backends, only for VDUSE */
uint32_t vhost_queue_pairs_max;

/* Flags for virtio features recovery mechanism. */
uint8_t virtio_features_state;

Expand Down Expand Up @@ -1609,6 +1616,8 @@ vhost_common_construct(struct netdev *netdev)

atomic_init(&dev->vhost_tx_retries_max, VHOST_ENQ_RETRY_DEF);

dev->vhost_queue_pairs_max = VHOST_QUEUE_PAIRS_MAX_DEF;

return common_construct(netdev, DPDK_ETH_PORT_ID_INVALID,
DPDK_DEV_VHOST, socket_id);
}
Expand Down Expand Up @@ -2491,13 +2500,22 @@ 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 queue_pairs_max;

ovs_mutex_lock(&dev->mutex);
if (!(dev->vhost_driver_flags & RTE_VHOST_USER_CLIENT)) {
path = smap_get(args, "vhost-server-path");
if (!nullable_string_is_equal(path, dev->vhost_id)) {
free(dev->vhost_id);
dev->vhost_id = nullable_xstrdup(path);

queue_pairs_max = smap_get_int(args, "vhost-queue-pairs-max",
VHOST_QUEUE_PAIRS_MAX_DEF);
if (queue_pairs_max < 1) {
queue_pairs_max = VHOST_QUEUE_PAIRS_MAX_DEF;
}
dev->vhost_queue_pairs_max = queue_pairs_max;

netdev_request_reconfigure(netdev);
}
}
Expand All @@ -2514,6 +2532,7 @@ netdev_dpdk_vhost_client_set_config(struct netdev *netdev,
VLOG_INFO("Max Tx retries for vhost device '%s' set to %d",
netdev_get_name(netdev), max_tx_retries);
}

ovs_mutex_unlock(&dev->mutex);

return 0;
Expand Down Expand Up @@ -6400,6 +6419,14 @@ netdev_dpdk_vhost_client_reconfigure(struct netdev *netdev)
goto unlock;
}

err = rte_vhost_driver_set_max_queue_num(dev->vhost_id,
dev->vhost_queue_pairs_max);
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 "
Expand Down

0 comments on commit e29d1b7

Please sign in to comment.