[RFC,15/27] vhost: add API to set max queue pairs

Message ID 20230331154259.1447831-16-maxime.coquelin@redhat.com (mailing list archive)
State Superseded, archived
Delegated to: Maxime Coquelin
Headers
Series Add VDUSE support to Vhost library |

Commit Message

Maxime Coquelin March 31, 2023, 3:42 p.m. UTC
  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.coquelin@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(-)
  

Comments

Chenbo Xia May 5, 2023, 5:07 a.m. UTC | #1
Hi Maxime,

> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> Sent: Friday, March 31, 2023 11:43 PM
> To: dev@dpdk.org; david.marchand@redhat.com; Xia, Chenbo
> <chenbo.xia@intel.com>; mkp@redhat.com; fbl@redhat.com;
> jasowang@redhat.com; Liang, Cunming <cunming.liang@intel.com>; Xie, Yongji
> <xieyongji@bytedance.com>; echaudro@redhat.com; eperezma@redhat.com;
> amorenoz@redhat.com
> Cc: Maxime Coquelin <maxime.coquelin@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.coquelin@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
  
Maxime Coquelin May 25, 2023, 11:23 a.m. UTC | #2
On 5/5/23 07:07, Xia, Chenbo wrote:
> Hi Maxime,
> 
>> -----Original Message-----
>> From: Maxime Coquelin <maxime.coquelin@redhat.com>
>> Sent: Friday, March 31, 2023 11:43 PM
>> To: dev@dpdk.org; david.marchand@redhat.com; Xia, Chenbo
>> <chenbo.xia@intel.com>; mkp@redhat.com; fbl@redhat.com;
>> jasowang@redhat.com; Liang, Cunming <cunming.liang@intel.com>; Xie, Yongji
>> <xieyongji@bytedance.com>; echaudro@redhat.com; eperezma@redhat.com;
>> amorenoz@redhat.com
>> Cc: Maxime Coquelin <maxime.coquelin@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.coquelin@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.
Correct, I need to update the release note in v2.

Thanks,
Maxime

> 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
>
  

Patch

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 {