Hi Maxime, > -----Original Message----- > From: Maxime Coquelin <maxime.coque...@redhat.com> > Sent: Friday, March 31, 2023 11:43 PM > To: dev@dpdk.org; david.march...@redhat.com; Xia, Chenbo > <chenbo....@intel.com>; m...@redhat.com; f...@redhat.com; > jasow...@redhat.com; Liang, Cunming <cunming.li...@intel.com>; Xie, Yongji > <xieyon...@bytedance.com>; echau...@redhat.com; epere...@redhat.com; > amore...@redhat.com > Cc: Maxime Coquelin <maxime.coque...@redhat.com> > Subject: [RFC 15/27] 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 <maxime.coque...@redhat.com> > --- > doc/guides/prog_guide/vhost_lib.rst | 4 ++++ > lib/vhost/rte_vhost.h | 17 ++++++++++++++ > lib/vhost/socket.c | 36 +++++++++++++++++++++++++++-- > lib/vhost/version.map | 3 +++ > 4 files changed, 58 insertions(+), 2 deletions(-)
Also add changes in release notes? Btw: somewhere we should also mention vduse support is added in release notes. Thanks, Chenbo > > diff --git a/doc/guides/prog_guide/vhost_lib.rst > b/doc/guides/prog_guide/vhost_lib.rst > index e8bb8c9b7b..cd4b109139 100644 > --- a/doc/guides/prog_guide/vhost_lib.rst > +++ b/doc/guides/prog_guide/vhost_lib.rst > @@ -334,6 +334,10 @@ The following is an overview of some key Vhost API > functions: > Clean DMA vChannel finished to use. After this function is called, > the specified DMA vChannel should no longer be used by the Vhost > library. > > +* ``rte_vhost_driver_set_max_queue_num(path, max_queue_pairs)`` > + > + Set the maximum number of queue pairs supported by the device. > + > Vhost-user Implementations > -------------------------- > > diff --git a/lib/vhost/rte_vhost.h b/lib/vhost/rte_vhost.h > index 58a5d4be92..44cbfcb469 100644 > --- a/lib/vhost/rte_vhost.h > +++ b/lib/vhost/rte_vhost.h > @@ -588,6 +588,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 ba54263824..e95c3ffeac 100644 > --- a/lib/vhost/socket.c > +++ b/lib/vhost/socket.c > @@ -56,6 +56,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; > @@ -821,7 +823,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; > } > > @@ -831,7 +833,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); > @@ -890,6 +921,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 d322a4a888..dffb126aa8 100644 > --- a/lib/vhost/version.map > +++ b/lib/vhost/version.map > @@ -98,6 +98,9 @@ EXPERIMENTAL { > # added in 22.11 > rte_vhost_async_dma_unconfigure; > rte_vhost_vring_call_nonblock; > + > + # added in 23.07 > + rte_vhost_driver_set_max_queue_num; > }; > > INTERNAL { > -- > 2.39.2