@@ -136,6 +136,7 @@ The public API headers are grouped by topics:
- **containers**:
[mbuf] (@ref rte_mbuf.h),
+ [mbuf pool ops] (@ref rte_mbuf_pool_ops.h)
[ring] (@ref rte_ring.h),
[tailq] (@ref rte_tailq.h),
[bitmap] (@ref rte_bitmap.h)
@@ -14,9 +14,9 @@ EXPORT_MAP := rte_mbuf_version.map
LIBABIVER := 3
# all source are stored in SRCS-y
-SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c rte_mbuf_ptype.c
+SRCS-$(CONFIG_RTE_LIBRTE_MBUF) := rte_mbuf.c rte_mbuf_ptype.c rte_mbuf_pool_ops.c
# install includes
-SYMLINK-$(CONFIG_RTE_LIBRTE_MBUF)-include := rte_mbuf.h rte_mbuf_ptype.h
+SYMLINK-$(CONFIG_RTE_LIBRTE_MBUF)-include := rte_mbuf.h rte_mbuf_ptype.h rte_mbuf_pool_ops.h
include $(RTE_SDK)/mk/rte.lib.mk
@@ -54,6 +54,7 @@
#include <rte_branch_prediction.h>
#include <rte_mempool.h>
#include <rte_mbuf.h>
+#include <rte_mbuf_pool_ops.h>
#include <rte_string_fns.h>
#include <rte_hexdump.h>
#include <rte_errno.h>
@@ -176,9 +177,7 @@ rte_pktmbuf_pool_create(const char *name, unsigned n,
if (mp == NULL)
return NULL;
- mp_ops_name = rte_eal_mbuf_default_mempool_ops();
- if (mp_ops_name == NULL)
- mp_ops_name = RTE_MBUF_DEFAULT_MEMPOOL_OPS;
+ mp_ops_name = rte_mbuf_best_mempool_ops();
ret = rte_mempool_set_ops_byname(mp, mp_ops_name, NULL);
if (ret != 0) {
RTE_LOG(ERR, MBUF, "error setting mempool handler\n");
new file mode 100644
@@ -0,0 +1,96 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2018 NXP
+ */
+
+#include <string.h>
+#include <rte_eal.h>
+#include <rte_mbuf.h>
+#include <rte_errno.h>
+#include <rte_mbuf_pool_ops.h>
+
+int
+rte_mbuf_set_platform_mempool_ops(const char *ops_name)
+{
+ const struct rte_memzone *mz;
+
+ if (strlen(ops_name) >= RTE_MEMPOOL_OPS_NAMESIZE)
+ return -ENAMETOOLONG;
+
+ mz = rte_memzone_lookup("mbuf_platform_pool_ops");
+ if (mz == NULL) {
+ mz = rte_memzone_reserve("mbuf_platform_pool_ops",
+ RTE_MEMPOOL_OPS_NAMESIZE, SOCKET_ID_ANY, 0);
+ if (mz == NULL)
+ return -rte_errno;
+ strncpy(mz->addr, ops_name, strlen(ops_name));
+ return 0;
+ } else if (strcmp(mz->addr, ops_name) == 0) {
+ return 0;
+ }
+
+ RTE_LOG(ERR, MBUF,
+ "%s is already registered as platform mbuf pool ops\n",
+ (char *)mz->addr);
+ return -EEXIST;
+}
+
+const char *
+rte_mbuf_platform_mempool_ops(void)
+{
+ const struct rte_memzone *mz;
+
+ mz = rte_memzone_lookup("mbuf_platform_pool_ops");
+ if (mz == NULL)
+ return NULL;
+ return mz->addr;
+}
+
+int
+rte_mbuf_set_user_mempool_ops(const char *ops_name)
+{
+ const struct rte_memzone *mz;
+
+ if (strlen(ops_name) >= RTE_MEMPOOL_OPS_NAMESIZE)
+ return -ENAMETOOLONG;
+
+ mz = rte_memzone_lookup("mbuf_user_pool_ops");
+ if (mz == NULL) {
+ mz = rte_memzone_reserve("mbuf_user_pool_ops",
+ RTE_MEMPOOL_OPS_NAMESIZE, SOCKET_ID_ANY, 0);
+ if (mz == NULL)
+ return -rte_errno;
+ }
+
+ strncpy(mz->addr, ops_name, strlen(ops_name));
+ return 0;
+
+}
+
+const char *
+rte_mbuf_user_mempool_ops(void)
+{
+ const struct rte_memzone *mz;
+
+ mz = rte_memzone_lookup("mbuf_user_pool_ops");
+ if (mz == NULL)
+ return rte_eal_mbuf_default_mempool_ops();
+ return mz->addr;
+}
+
+/* Return mbuf pool ops name */
+const char *
+rte_mbuf_best_mempool_ops(void)
+{
+ /* User defined mempool ops takes the priority */
+ const char *best_ops = rte_mbuf_user_mempool_ops();
+ if (best_ops)
+ return best_ops;
+
+ /* Next choice is platform configured mempool ops */
+ best_ops = rte_mbuf_platform_mempool_ops();
+ if (best_ops)
+ return best_ops;
+
+ /* Last choice is to use the compile time config pool */
+ return RTE_MBUF_DEFAULT_MEMPOOL_OPS;
+}
new file mode 100644
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2018 NXP
+ */
+
+#ifndef _RTE_MBUF_POOL_OPS_H_
+#define _RTE_MBUF_POOL_OPS_H_
+
+/**
+ * @file
+ * RTE Mbuf Pool Ops
+ *
+ * These APIs are for configuring the mbuf pool ops names to be largely used by
+ * rte_pktmbuf_pool_create(). However, this can also be used to set and inquire
+ * the best mempool ops available.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Set the platform supported pktmbuf HW mempool ops name
+ *
+ * This function allow the HW to register the actively supported HW mempool
+ * ops_name. Only one HW mempool ops can be registered at any point of time.
+ *
+ * @param ops_name
+ * @return
+ * - On success, zero.
+ * - On failure, a negative value.
+ */
+int
+rte_mbuf_set_platform_mempool_ops(const char *ops_name);
+
+/**
+ * Get configured platform supported pktmbuf HW mempool ops name
+ *
+ * This function returns the platform supported mempool ops name.
+ *
+ * @return
+ * - On success, platform pool ops name.
+ * - On failure, NULL.
+ */
+const char *
+rte_mbuf_platform_mempool_ops(void);
+
+/**
+ * Set the user preferred pktmbuf mempool ops name
+ *
+ * This function can be used by the user to configure user preferred
+ * mempool ops name.
+ *
+ * @param ops_name
+ * @return
+ * - On success, zero.
+ * - On failure, a negative value.
+ */
+int
+rte_mbuf_set_user_mempool_ops(const char *ops_name);
+
+/**
+ * Get user preferred pool ops name for mbuf
+ *
+ * This function returns the user configured mempool ops name.
+ *
+ * @return
+ * - On success, user pool ops name..
+ * - On failure, NULL.
+ */
+const char *
+rte_mbuf_user_mempool_ops(void);
+
+/**
+ * Get the best mempool ops name for pktmbuf.
+ *
+ * This function is used to determine the best options for mempool ops for
+ * pktmbuf allocations. Following are the priority order:
+ * 1. User defined, 2. Platform HW supported, 3. Compile time configured.
+ * This function is also used by the rte_pktmbuf_pool_create to get the best
+ * mempool ops name.
+ *
+ * @return
+ * returns preferred mbuf pool ops name
+ */
+const char *
+rte_mbuf_best_mempool_ops(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTE_MBUF_POOL_OPS_H_ */
@@ -35,3 +35,14 @@ DPDK_16.11 {
rte_get_tx_ol_flag_list;
} DPDK_2.1;
+
+DPDK_18.02 {
+ global:
+
+ rte_mbuf_best_mempool_ops;
+ rte_mbuf_platform_mempool_ops;
+ rte_mbuf_set_platform_mempool_ops;
+ rte_mbuf_set_user_mempool_ops;
+ rte_mbuf_user_mempool_ops;
+
+} DPDK_16.11;