[v4,2/5] lib/mbuf: introduce helper to create mempool with flags

Message ID 20190322130129.109964-3-xiaolong.ye@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series Introduce AF_XDP PMD |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation fail Compilation issues

Commit Message

Xiaolong Ye March 22, 2019, 1:01 p.m. UTC
  This allows applications to create mbuf mempool with specific flags
such as MEMPOOL_F_NO_SPREAD if they want fixed size memory objects.

Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
---
 lib/librte_mbuf/rte_mbuf.c | 29 +++++++++++++++++++-----
 lib/librte_mbuf/rte_mbuf.h | 45 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+), 5 deletions(-)
  

Comments

Maxime Coquelin March 22, 2019, 2:36 p.m. UTC | #1
On 3/22/19 2:01 PM, Xiaolong Ye wrote:
> This allows applications to create mbuf mempool with specific flags
> such as MEMPOOL_F_NO_SPREAD if they want fixed size memory objects.
> 
> Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
> Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
> ---
>   lib/librte_mbuf/rte_mbuf.c | 29 +++++++++++++++++++-----
>   lib/librte_mbuf/rte_mbuf.h | 45 ++++++++++++++++++++++++++++++++++++++
>   2 files changed, 69 insertions(+), 5 deletions(-)
> 

> +/**
> + * Create a mbuf pool with flags.
> + *
> + * This function creates and initializes a packet mbuf pool. It is
> + * a wrapper to rte_mempool functions.
> + *
> + * @warning
> + * @b EXPERIMENTAL: This API may change without prior notice.
> + *
> + * @param name
> + *   The name of the mbuf pool.
> + * @param n
> + *   The number of elements in the mbuf pool. The optimum size (in terms
> + *   of memory usage) for a mempool is when n is a power of two minus one:
> + *   n = (2^q - 1).
> + * @param cache_size
> + *   Size of the per-core object cache. See rte_mempool_create() for
> + *   details.
> + * @param priv_size
> + *   Size of application private are between the rte_mbuf structure
> + *   and the data buffer. This value must be aligned to RTE_MBUF_PRIV_ALIGN.
> + * @param data_room_size
> + *   Size of data buffer in each mbuf, including RTE_PKTMBUF_HEADROOM.
> + * @param flags
> + *   Flags controlling the behavior of the mempool. See
> + *   rte_mempool_create() for details.
> + * @param socket_id
> + *   The socket identifier where the memory should be allocated. The
> + *   value can be *SOCKET_ID_ANY* if there is no NUMA constraint for the
> + *   reserved zone.
> + * @return
> + *   The pointer to the new allocated mempool, on success. NULL on error
> + *   with rte_errno set appropriately. Possible rte_errno values include:
> + *    - E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
> + *    - E_RTE_SECONDARY - function was called from a secondary process instance
> + *    - EINVAL - cache size provided is too large, or priv_size is not aligned.
> + *    - ENOSPC - the maximum number of memzones has already been allocated
> + *    - EEXIST - a memzone with the same name already exists
> + *    - ENOMEM - no appropriate memory area found in which to create memzone
> + */
> +struct rte_mempool * __rte_experimental
> +rte_pktmbuf_pool_create_with_flags(const char *name, unsigned int n,
> +	unsigned int cache_size, uint16_t priv_size, uint16_t data_room_size,
> +	unsigned int flags, int socket_id);
> +
>   /**
>    * Create a mbuf pool with a given mempool ops name
>    *
> 

You need to add it to rte_mbuf_version.map too.
  
Xiaolong Ye March 24, 2019, 9:08 a.m. UTC | #2
On 03/22, Maxime Coquelin wrote:
>
>
>On 3/22/19 2:01 PM, Xiaolong Ye wrote:
>> This allows applications to create mbuf mempool with specific flags
>> such as MEMPOOL_F_NO_SPREAD if they want fixed size memory objects.
>> 
>> Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
>> Signed-off-by: Xiaolong Ye <xiaolong.ye@intel.com>
>> ---
>>   lib/librte_mbuf/rte_mbuf.c | 29 +++++++++++++++++++-----
>>   lib/librte_mbuf/rte_mbuf.h | 45 ++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 69 insertions(+), 5 deletions(-)
>> 
>
>> +/**
>> + * Create a mbuf pool with flags.
>> + *
>> + * This function creates and initializes a packet mbuf pool. It is
>> + * a wrapper to rte_mempool functions.
>> + *
>> + * @warning
>> + * @b EXPERIMENTAL: This API may change without prior notice.
>> + *
>> + * @param name
>> + *   The name of the mbuf pool.
>> + * @param n
>> + *   The number of elements in the mbuf pool. The optimum size (in terms
>> + *   of memory usage) for a mempool is when n is a power of two minus one:
>> + *   n = (2^q - 1).
>> + * @param cache_size
>> + *   Size of the per-core object cache. See rte_mempool_create() for
>> + *   details.
>> + * @param priv_size
>> + *   Size of application private are between the rte_mbuf structure
>> + *   and the data buffer. This value must be aligned to RTE_MBUF_PRIV_ALIGN.
>> + * @param data_room_size
>> + *   Size of data buffer in each mbuf, including RTE_PKTMBUF_HEADROOM.
>> + * @param flags
>> + *   Flags controlling the behavior of the mempool. See
>> + *   rte_mempool_create() for details.
>> + * @param socket_id
>> + *   The socket identifier where the memory should be allocated. The
>> + *   value can be *SOCKET_ID_ANY* if there is no NUMA constraint for the
>> + *   reserved zone.
>> + * @return
>> + *   The pointer to the new allocated mempool, on success. NULL on error
>> + *   with rte_errno set appropriately. Possible rte_errno values include:
>> + *    - E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
>> + *    - E_RTE_SECONDARY - function was called from a secondary process instance
>> + *    - EINVAL - cache size provided is too large, or priv_size is not aligned.
>> + *    - ENOSPC - the maximum number of memzones has already been allocated
>> + *    - EEXIST - a memzone with the same name already exists
>> + *    - ENOMEM - no appropriate memory area found in which to create memzone
>> + */
>> +struct rte_mempool * __rte_experimental
>> +rte_pktmbuf_pool_create_with_flags(const char *name, unsigned int n,
>> +	unsigned int cache_size, uint16_t priv_size, uint16_t data_room_size,
>> +	unsigned int flags, int socket_id);
>> +
>>   /**
>>    * Create a mbuf pool with a given mempool ops name
>>    *
>> 
>
>You need to add it to rte_mbuf_version.map too.

Got it, will add in next version.

Thanks,
Xiaolong
  

Patch

diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c
index 21f6f7404..c1db9e298 100644
--- a/lib/librte_mbuf/rte_mbuf.c
+++ b/lib/librte_mbuf/rte_mbuf.c
@@ -106,11 +106,10 @@  rte_pktmbuf_init(struct rte_mempool *mp,
 	m->next = NULL;
 }
 
-/* Helper to create a mbuf pool with given mempool ops name*/
-struct rte_mempool *
-rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n,
+static struct rte_mempool *
+rte_pktmbuf_pool_create_by_ops_with_flags(const char *name, unsigned int n,
 	unsigned int cache_size, uint16_t priv_size, uint16_t data_room_size,
-	int socket_id, const char *ops_name)
+	unsigned int flags, int socket_id, const char *ops_name)
 {
 	struct rte_mempool *mp;
 	struct rte_pktmbuf_pool_private mbp_priv;
@@ -130,7 +129,7 @@  rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n,
 	mbp_priv.mbuf_priv_size = priv_size;
 
 	mp = rte_mempool_create_empty(name, n, elt_size, cache_size,
-		 sizeof(struct rte_pktmbuf_pool_private), socket_id, 0);
+		 sizeof(struct rte_pktmbuf_pool_private), socket_id, flags);
 	if (mp == NULL)
 		return NULL;
 
@@ -157,6 +156,16 @@  rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n,
 	return mp;
 }
 
+/* Helper to create a mbuf pool with given mempool ops name*/
+struct rte_mempool *
+rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n,
+	unsigned int cache_size, uint16_t priv_size, uint16_t data_room_size,
+	int socket_id, const char *ops_name)
+{
+	return rte_pktmbuf_pool_create_by_ops_with_flags(name, n, cache_size,
+			 priv_size, data_room_size, 0, socket_id, ops_name);
+}
+
 /* helper to create a mbuf pool */
 struct rte_mempool *
 rte_pktmbuf_pool_create(const char *name, unsigned int n,
@@ -167,6 +176,16 @@  rte_pktmbuf_pool_create(const char *name, unsigned int n,
 			data_room_size, socket_id, NULL);
 }
 
+/* helper to create a mbuf pool with flags (e.g. NO_SPREAD) */
+struct rte_mempool * __rte_experimental
+rte_pktmbuf_pool_create_with_flags(const char *name, unsigned int n,
+	unsigned int cache_size, uint16_t priv_size, uint16_t data_room_size,
+	unsigned int flags, int socket_id)
+{
+	return rte_pktmbuf_pool_create_by_ops_with_flags(name, n, cache_size,
+			priv_size, data_room_size, flags, socket_id, NULL);
+}
+
 /* do some sanity checks on a mbuf: panic if it fails */
 void
 rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header)
diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index d961ccaf6..105ead6de 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -1266,6 +1266,51 @@  rte_pktmbuf_pool_create(const char *name, unsigned n,
 	unsigned cache_size, uint16_t priv_size, uint16_t data_room_size,
 	int socket_id);
 
+/**
+ * Create a mbuf pool with flags.
+ *
+ * This function creates and initializes a packet mbuf pool. It is
+ * a wrapper to rte_mempool functions.
+ *
+ * @warning
+ * @b EXPERIMENTAL: This API may change without prior notice.
+ *
+ * @param name
+ *   The name of the mbuf pool.
+ * @param n
+ *   The number of elements in the mbuf pool. The optimum size (in terms
+ *   of memory usage) for a mempool is when n is a power of two minus one:
+ *   n = (2^q - 1).
+ * @param cache_size
+ *   Size of the per-core object cache. See rte_mempool_create() for
+ *   details.
+ * @param priv_size
+ *   Size of application private are between the rte_mbuf structure
+ *   and the data buffer. This value must be aligned to RTE_MBUF_PRIV_ALIGN.
+ * @param data_room_size
+ *   Size of data buffer in each mbuf, including RTE_PKTMBUF_HEADROOM.
+ * @param flags
+ *   Flags controlling the behavior of the mempool. See
+ *   rte_mempool_create() for details.
+ * @param socket_id
+ *   The socket identifier where the memory should be allocated. The
+ *   value can be *SOCKET_ID_ANY* if there is no NUMA constraint for the
+ *   reserved zone.
+ * @return
+ *   The pointer to the new allocated mempool, on success. NULL on error
+ *   with rte_errno set appropriately. Possible rte_errno values include:
+ *    - E_RTE_NO_CONFIG - function could not get pointer to rte_config structure
+ *    - E_RTE_SECONDARY - function was called from a secondary process instance
+ *    - EINVAL - cache size provided is too large, or priv_size is not aligned.
+ *    - ENOSPC - the maximum number of memzones has already been allocated
+ *    - EEXIST - a memzone with the same name already exists
+ *    - ENOMEM - no appropriate memory area found in which to create memzone
+ */
+struct rte_mempool * __rte_experimental
+rte_pktmbuf_pool_create_with_flags(const char *name, unsigned int n,
+	unsigned int cache_size, uint16_t priv_size, uint16_t data_room_size,
+	unsigned int flags, int socket_id);
+
 /**
  * Create a mbuf pool with a given mempool ops name
  *