> -----Original Message----- > From: Maxime Coquelin <[email protected]> > Sent: Friday, June 2, 2023 4:08 AM > To: [email protected]; Xia, Chenbo <[email protected]>; > [email protected]; [email protected]; [email protected]; > [email protected]; Liang, Cunming <[email protected]>; Xie, Yongji > <[email protected]>; [email protected]; [email protected]; > [email protected]; [email protected] > Cc: Maxime Coquelin <[email protected]> > Subject: [PATCH v4 13/26] vhost: add API to set max queue pairs > > This patch introduces a new rte_vhost_driver_set_max_queues > API as preliminary work for multiqueue support with VDUSE. > > Indeed, with VDUSE we need to pre-allocate the vrings at > device creation time, so we need such API not to allocate > the 128 queue pairs supported by the Vhost library. > > Calling the API is optional, 128 queue pairs remaining the > default. > > Signed-off-by: Maxime Coquelin <[email protected]> > --- > doc/guides/prog_guide/vhost_lib.rst | 4 +++ > doc/guides/rel_notes/release_23_07.rst | 5 ++++ > lib/vhost/rte_vhost.h | 17 ++++++++++++ > lib/vhost/socket.c | 36 ++++++++++++++++++++++++-- > lib/vhost/version.map | 1 + > 5 files changed, 61 insertions(+), 2 deletions(-) > > diff --git a/doc/guides/prog_guide/vhost_lib.rst > b/doc/guides/prog_guide/vhost_lib.rst > index 0f964d7a4a..0c2b4d020a 100644 > --- a/doc/guides/prog_guide/vhost_lib.rst > +++ b/doc/guides/prog_guide/vhost_lib.rst > @@ -339,6 +339,10 @@ The following is an overview of some key Vhost API > functions: > Inject the offloaded interrupt received by the 'guest_notify' callback, > into the vhost device's queue. > > +* ``rte_vhost_driver_set_max_queue_num(const char *path, uint32_t > max_queue_pairs)`` > + > + Set the maximum number of queue pairs supported by the device. > + > Vhost-user Implementations > -------------------------- > > diff --git a/doc/guides/rel_notes/release_23_07.rst > b/doc/guides/rel_notes/release_23_07.rst > index 3eed8ac561..7034fb664c 100644 > --- a/doc/guides/rel_notes/release_23_07.rst > +++ b/doc/guides/rel_notes/release_23_07.rst > @@ -62,6 +62,11 @@ New Features > rte_vhost_notify_guest(), is added to raise the interrupt outside of > the > fast path. > > +* **Added Vhost API to set maximum queue pairs supported.** > + > + Introduced ``rte_vhost_driver_set_max_queue_num()`` to be able to limit > the > + maximum number of supported queue pairs, required for VDUSE support. > + > > Removed Items > ------------- > diff --git a/lib/vhost/rte_vhost.h b/lib/vhost/rte_vhost.h > index 7a10bc36cf..7844c9f142 100644 > --- a/lib/vhost/rte_vhost.h > +++ b/lib/vhost/rte_vhost.h > @@ -609,6 +609,23 @@ rte_vhost_driver_get_protocol_features(const char > *path, > int > rte_vhost_driver_get_queue_num(const char *path, uint32_t *queue_num); > > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change, or be removed, without prior > notice. > + * > + * Set the maximum number of queue pairs supported by the device. > + * > + * @param path > + * The vhost-user socket file path > + * @param max_queue_pairs > + * The maximum number of queue pairs > + * @return > + * 0 on success, -1 on failure > + */ > +__rte_experimental > +int > +rte_vhost_driver_set_max_queue_num(const char *path, uint32_t > max_queue_pairs); > + > /** > * Get the feature bits after negotiation > * > diff --git a/lib/vhost/socket.c b/lib/vhost/socket.c > index 407d0011c3..29f7a8cece 100644 > --- a/lib/vhost/socket.c > +++ b/lib/vhost/socket.c > @@ -57,6 +57,8 @@ struct vhost_user_socket { > > uint64_t protocol_features; > > + uint32_t max_queue_pairs; > + > struct rte_vdpa_device *vdpa_dev; > > struct rte_vhost_device_ops const *notify_ops; > @@ -823,7 +825,7 @@ rte_vhost_driver_get_queue_num(const char *path, > uint32_t *queue_num) > > vdpa_dev = vsocket->vdpa_dev; > if (!vdpa_dev) { > - *queue_num = VHOST_MAX_QUEUE_PAIRS; > + *queue_num = vsocket->max_queue_pairs; > goto unlock_exit; > } > > @@ -833,7 +835,36 @@ rte_vhost_driver_get_queue_num(const char *path, > uint32_t *queue_num) > goto unlock_exit; > } > > - *queue_num = RTE_MIN((uint32_t)VHOST_MAX_QUEUE_PAIRS, > vdpa_queue_num); > + *queue_num = RTE_MIN(vsocket->max_queue_pairs, vdpa_queue_num); > + > +unlock_exit: > + pthread_mutex_unlock(&vhost_user.mutex); > + return ret; > +} > + > +int > +rte_vhost_driver_set_max_queue_num(const char *path, uint32_t > max_queue_pairs) > +{ > + struct vhost_user_socket *vsocket; > + int ret = 0; > + > + VHOST_LOG_CONFIG(path, INFO, "Setting max queue pairs to %u\n", > max_queue_pairs); > + > + if (max_queue_pairs > VHOST_MAX_QUEUE_PAIRS) { > + VHOST_LOG_CONFIG(path, ERR, "Library only supports up to %u > queue pairs\n", > + VHOST_MAX_QUEUE_PAIRS); > + return -1; > + } > + > + pthread_mutex_lock(&vhost_user.mutex); > + vsocket = find_vhost_user_socket(path); > + if (!vsocket) { > + VHOST_LOG_CONFIG(path, ERR, "socket file is not registered > yet.\n"); > + ret = -1; > + goto unlock_exit; > + } > + > + vsocket->max_queue_pairs = max_queue_pairs; > > unlock_exit: > pthread_mutex_unlock(&vhost_user.mutex); > @@ -889,6 +920,7 @@ rte_vhost_driver_register(const char *path, uint64_t > flags) > goto out_free; > } > vsocket->vdpa_dev = NULL; > + vsocket->max_queue_pairs = VHOST_MAX_QUEUE_PAIRS; > vsocket->extbuf = flags & RTE_VHOST_USER_EXTBUF_SUPPORT; > vsocket->linearbuf = flags & RTE_VHOST_USER_LINEARBUF_SUPPORT; > vsocket->async_copy = flags & RTE_VHOST_USER_ASYNC_COPY; > diff --git a/lib/vhost/version.map b/lib/vhost/version.map > index 7bcbfd12cf..5051c29022 100644 > --- a/lib/vhost/version.map > +++ b/lib/vhost/version.map > @@ -107,6 +107,7 @@ EXPERIMENTAL { > > # added in 23.07 > rte_vhost_notify_guest; > + rte_vhost_driver_set_max_queue_num; > }; > > INTERNAL { > -- > 2.40.1
Reviewed-by: Chenbo Xia <[email protected]>

