From: David Marchand Date: Tue, 12 Oct 2021 19:39:26 +0000 (+0200) Subject: memzone: enforce valid flags when reserving X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=bc1a35fb3f5e08cfd62607a98c1bf8a48c231f5a;p=dpdk.git memzone: enforce valid flags when reserving 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 Acked-by: Stephen Hemminger Acked-by: Andrew Rybchenko Acked-by: Ray Kinsella --- diff --git a/app/test/test_memzone.c b/app/test/test_memzone.c index 27b8b52fcd..6ddd0fbab5 100644 --- a/app/test/test_memzone.c +++ b/app/test/test_memzone.c @@ -82,6 +82,26 @@ test_memzone_invalid_alignment(void) return 0; } +static int +test_memzone_invalid_flags(void) +{ + const struct rte_memzone *mz; + + mz = rte_memzone_lookup(TEST_MEMZONE_NAME("invalid_flags")); + if (mz != NULL) { + printf("Zone with invalid flags has been reserved\n"); + return -1; + } + + mz = rte_memzone_reserve(TEST_MEMZONE_NAME("invalid_flags"), + 100, SOCKET_ID_ANY, RTE_MEMZONE_IOVA_CONTIG << 1); + if (mz != NULL) { + printf("Zone with invalid flags has been reserved\n"); + return -1; + } + return 0; +} + static int test_memzone_reserving_zone_size_bigger_than_the_maximum(void) { @@ -1106,6 +1126,10 @@ test_memzone(void) if (test_memzone_invalid_alignment() < 0) return -1; + printf("test invalid flags for memzone_reserve\n"); + if (test_memzone_invalid_flags() < 0) + return -1; + printf("test reserving the largest size memzone possible\n"); if (test_memzone_reserve_max() < 0) return -1; diff --git a/lib/eal/common/eal_common_memzone.c b/lib/eal/common/eal_common_memzone.c index 7c21aa921e..ecde9441ee 100644 --- a/lib/eal/common/eal_common_memzone.c +++ b/lib/eal/common/eal_common_memzone.c @@ -53,6 +53,18 @@ memzone_lookup_thread_unsafe(const char *name) return NULL; } +#define MEMZONE_KNOWN_FLAGS (RTE_MEMZONE_2MB \ + | RTE_MEMZONE_1GB \ + | RTE_MEMZONE_16MB \ + | RTE_MEMZONE_16GB \ + | RTE_MEMZONE_256KB \ + | RTE_MEMZONE_256MB \ + | RTE_MEMZONE_512MB \ + | RTE_MEMZONE_4GB \ + | RTE_MEMZONE_SIZE_HINT_ONLY \ + | RTE_MEMZONE_IOVA_CONTIG \ + ) + static const struct rte_memzone * memzone_reserve_aligned_thread_unsafe(const char *name, size_t len, int socket_id, unsigned int flags, unsigned int align, @@ -128,6 +140,11 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len, return NULL; } + if ((flags & ~MEMZONE_KNOWN_FLAGS) != 0) { + rte_errno = EINVAL; + return NULL; + } + /* only set socket to SOCKET_ID_ANY if we aren't allocating for an * external heap. */