[v2] mempool: enforce valid flags at creation
Checks
Commit Message
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>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Acked-by: Ray Kinsella <mdr@ashroe.eu>
---
Changes since v1:
- fixed checkpatch warning,
- moved flags to validate them in the same order than parameters,
---
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(-)
Comments
On Thu, 14 Oct 2021 21:29:16 +0200
David Marchand <david.marchand@redhat.com> wrote:
> 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>
> Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> Acked-by: Ray Kinsella <mdr@ashroe.eu>
> ---
> Changes since v1:
> - fixed checkpatch warning,
> - moved flags to validate them in the same order than parameters,
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
On 10/14/21 10:37 PM, Stephen Hemminger wrote:
> On Thu, 14 Oct 2021 21:29:16 +0200
> David Marchand <david.marchand@redhat.com> wrote:
>
>> 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>
>> Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
>> Acked-by: Ray Kinsella <mdr@ashroe.eu>
>> ---
>> Changes since v1:
>> - fixed checkpatch warning,
>> - moved flags to validate them in the same order than parameters,
>
> Acked-by: Stephen Hemminger <stephen@networkplumber.org>
>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
On Fri, Oct 15, 2021 at 9:02 AM Andrew Rybchenko
<andrew.rybchenko@oktetlabs.ru> wrote:
> On 10/14/21 10:37 PM, Stephen Hemminger wrote:
> > On Thu, 14 Oct 2021 21:29:16 +0200
> > David Marchand <david.marchand@redhat.com> wrote:
> >
> >> 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>
> >> Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
> >> Acked-by: Ray Kinsella <mdr@ashroe.eu>
> > Acked-by: Stephen Hemminger <stephen@networkplumber.org>
> Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Applied, thanks.
@@ -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);
@@ -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;
@@ -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