From: David Marchand <david.marchand@redhat.com>
To: dev@dpdk.org
Cc: mdr@ashroe.eu, dkozlyuk@oss.nvidia.com, thomas@monjalon.net,
Olivier Matz <olivier.matz@6wind.com>,
Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Subject: [dpdk-dev] [PATCH] mempool: enforce valid flags at creation
Date: Tue, 12 Oct 2021 09:28:48 +0200 [thread overview]
Message-ID: <20211012072848.17741-1-david.marchand@redhat.com> (raw)
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 <david.marchand@redhat.com>
---
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..a2a78125f4 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,
@@ -806,6 +813,12 @@ rte_mempool_create_empty(const char *name, unsigned n, unsigned elt_size,
RTE_CACHE_LINE_MASK) != 0);
#endif
+ /* enforce no unknown flag is passed by the application */
+ if ((flags & ~MEMPOOL_KNOWN_FLAGS) != 0) {
+ rte_errno = EINVAL;
+ return NULL;
+ }
+
mempool_list = RTE_TAILQ_CAST(rte_mempool_tailq.head, rte_mempool_list);
/* asked for zero items */
diff --git a/lib/mempool/rte_mempool.h b/lib/mempool/rte_mempool.h
index f57ecbd6fc..5143b16a24 100644
--- a/lib/mempool/rte_mempool.h
+++ b/lib/mempool/rte_mempool.h
@@ -996,7 +996,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.23.0
next reply other threads:[~2021-10-12 7:29 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-12 7:28 David Marchand [this message]
2021-10-12 7:49 ` Andrew Rybchenko
2021-10-12 7:57 ` David Marchand
2021-10-14 19:16 ` David Marchand
2021-10-12 10:10 ` Kinsella, Ray
2021-10-14 19:29 ` [dpdk-dev] [PATCH v2] " David Marchand
2021-10-14 19:37 ` Stephen Hemminger
2021-10-15 7:02 ` Andrew Rybchenko
2021-10-15 8:26 ` David Marchand
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211012072848.17741-1-david.marchand@redhat.com \
--to=david.marchand@redhat.com \
--cc=andrew.rybchenko@oktetlabs.ru \
--cc=dev@dpdk.org \
--cc=dkozlyuk@oss.nvidia.com \
--cc=mdr@ashroe.eu \
--cc=olivier.matz@6wind.com \
--cc=thomas@monjalon.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).