From b240af8b10f961298149a86dbb53823334c5870d Mon Sep 17 00:00:00 2001 From: David Marchand Date: Thu, 14 Oct 2021 21:29:16 +0200 Subject: [PATCH] mempool: enforce valid flags at creation If we do not enforce valid flags are passed by an application, this application might face issues in the future when we add more flags. Signed-off-by: David Marchand Reviewed-by: Andrew Rybchenko Acked-by: Ray Kinsella Acked-by: Stephen Hemminger Acked-by: Andrew Rybchenko --- app/test/test_mempool.c | 21 +++++++++++++++++++++ lib/mempool/rte_mempool.c | 13 +++++++++++++ lib/mempool/rte_mempool.h | 2 +- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/test/test_mempool.c b/app/test/test_mempool.c index 7675a3e605..66bc8d86b7 100644 --- a/app/test/test_mempool.c +++ b/app/test/test_mempool.c @@ -205,6 +205,24 @@ static int test_mempool_creation_with_exceeded_cache_size(void) return 0; } +static int test_mempool_creation_with_unknown_flag(void) +{ + struct rte_mempool *mp_cov; + + mp_cov = rte_mempool_create("test_mempool_unknown_flag", MEMPOOL_SIZE, + MEMPOOL_ELT_SIZE, 0, 0, + NULL, NULL, + NULL, NULL, + SOCKET_ID_ANY, MEMPOOL_F_NO_IOVA_CONTIG << 1); + + if (mp_cov != NULL) { + rte_mempool_free(mp_cov); + RET_ERR(); + } + + return 0; +} + static struct rte_mempool *mp_spsc; static rte_spinlock_t scsp_spinlock; static void *scsp_obj_table[MAX_KEEP]; @@ -635,6 +653,9 @@ test_mempool(void) if (test_mempool_creation_with_exceeded_cache_size() < 0) GOTO_ERR(ret, err); + if (test_mempool_creation_with_unknown_flag() < 0) + GOTO_ERR(ret, err); + if (test_mempool_same_name_twice_creation() < 0) GOTO_ERR(ret, err); diff --git a/lib/mempool/rte_mempool.c b/lib/mempool/rte_mempool.c index c5f859ae71..607419ccaf 100644 --- a/lib/mempool/rte_mempool.c +++ b/lib/mempool/rte_mempool.c @@ -777,6 +777,13 @@ rte_mempool_cache_free(struct rte_mempool_cache *cache) rte_free(cache); } +#define MEMPOOL_KNOWN_FLAGS (MEMPOOL_F_NO_SPREAD \ + | MEMPOOL_F_NO_CACHE_ALIGN \ + | MEMPOOL_F_SP_PUT \ + | MEMPOOL_F_SC_GET \ + | MEMPOOL_F_POOL_CREATED \ + | MEMPOOL_F_NO_IOVA_CONTIG \ + ) /* create an empty mempool */ struct rte_mempool * rte_mempool_create_empty(const char *name, unsigned n, unsigned elt_size, @@ -821,6 +828,12 @@ rte_mempool_create_empty(const char *name, unsigned n, unsigned elt_size, return NULL; } + /* enforce no unknown flag is passed by the application */ + if ((flags & ~MEMPOOL_KNOWN_FLAGS) != 0) { + rte_errno = EINVAL; + return NULL; + } + /* "no cache align" imply "no spread" */ if (flags & MEMPOOL_F_NO_CACHE_ALIGN) flags |= MEMPOOL_F_NO_SPREAD; diff --git a/lib/mempool/rte_mempool.h b/lib/mempool/rte_mempool.h index 04b14d7ae9..88bcbc51ef 100644 --- a/lib/mempool/rte_mempool.h +++ b/lib/mempool/rte_mempool.h @@ -991,7 +991,7 @@ typedef void (rte_mempool_ctor_t)(struct rte_mempool *, void *); * 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 + * - EINVAL - cache size provided is too large or an unknown flag was passed * - 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 -- 2.20.1