On Tue, May 4, 2021 at 6:19 PM Power, Ciara <ciara.po...@intel.com> wrote: > > >-----Original Message----- > >From: Richardson, Bruce <bruce.richard...@intel.com> > >Sent: Tuesday 4 May 2021 13:14 > >To: jer...@marvell.com > >Cc: Power, Ciara <ciara.po...@intel.com>; dev@dpdk.org; > >tho...@monjalon.net > >Subject: Re: [PATCH] telemetry: remove internal symbol from public header > > > >On Mon, May 03, 2021 at 10:04:28PM +0530, jer...@marvell.com wrote: > >> From: Jerin Jacob <jer...@marvell.com> > >> > >> Remove TELEMETRY_MAX_CALLBACKS symbol from public rte_telemetry.h > >> header file. > >> > >> Signed-off-by: Jerin Jacob <jer...@marvell.com> > >> --- > >Acked-by: Bruce Richardson <bruce.richard...@intel.com> > > Thanks, > Acked-by: Ciara Power <ciara.po...@intel.com>
I agree this define should be hidden. Just, what do you think of using a dynamic allocation and remove the limitation entirely? diff --git a/lib/telemetry/rte_telemetry.h b/lib/telemetry/rte_telemetry.h index 031db9e968..8776998b54 100644 --- a/lib/telemetry/rte_telemetry.h +++ b/lib/telemetry/rte_telemetry.h @@ -10,8 +10,6 @@ #ifndef _RTE_TELEMETRY_H_ #define _RTE_TELEMETRY_H_ -/** Maximum number of telemetry callbacks. */ -#define TELEMETRY_MAX_CALLBACKS 64 /** Maximum length for string used in object. */ #define RTE_TEL_MAX_STRING_LEN 64 /** Maximum length of string. */ @@ -285,7 +283,7 @@ typedef void * (*handler)(void *sock_id); * @return * -EINVAL for invalid parameters failure. * @return - * -ENOENT if max callbacks limit has been reached. + * -ENOMEM for mem allocation failure. */ __rte_experimental int diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c index 68b479e0e4..6baba57ec2 100644 --- a/lib/telemetry/telemetry.c +++ b/lib/telemetry/telemetry.c @@ -59,7 +59,7 @@ static uint32_t logtype; rte_log_ptr(RTE_LOG_ ## l, logtype, "TELEMETRY: " __VA_ARGS__) /* list of command callbacks, with one command registered by default */ -static struct cmd_callback callbacks[TELEMETRY_MAX_CALLBACKS]; +static struct cmd_callback *callbacks; static int num_callbacks; /* How many commands are registered */ /* Used when accessing or modifying list of command callbacks */ static rte_spinlock_t callback_sl = RTE_SPINLOCK_INITIALIZER; @@ -70,15 +70,21 @@ static uint16_t v2_clients; int rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help) { + struct cmd_callback *new_callbacks; int i = 0; if (strlen(cmd) >= MAX_CMD_LEN || fn == NULL || cmd[0] != '/' || strlen(help) >= MAX_HELP_LEN) return -EINVAL; - if (num_callbacks >= TELEMETRY_MAX_CALLBACKS) - return -ENOENT; rte_spinlock_lock(&callback_sl); + new_callbacks = realloc(callbacks, sizeof(callbacks[0]) * (num_callbacks + 1)); + if (new_callbacks == NULL) { + rte_spinlock_unlock(&callback_sl); + return -ENOMEM; + } + callbacks = new_callbacks; + while (i < num_callbacks && strcmp(cmd, callbacks[i].cmd) > 0) i++; if (i != num_callbacks) And there is a race to fix in list_commands() (which accesses the callbacks array without taking the lock). -- David Marchand