While the unsigned values added to telemetry dicts/arrays were up to 64-bits in size, the sized values were only up to 32-bits. We can standardize the API by having both int and uint functions take 64-bit values. For ABI compatibility, we use function versioning to ensure older binaries can still use the older functions taking a 32-bit parameter.
Suggested-by: Morten Brørup <m...@smartsharesystems.com> Signed-off-by: Bruce Richardson <bruce.richard...@intel.com> Acked-by: Morten Brørup <m...@smartsharesystems.com> Acked-by: Tyler Retzlaff <roret...@linux.microsoft.com> --- lib/telemetry/meson.build | 1 + lib/telemetry/rte_telemetry.h | 4 ++-- lib/telemetry/telemetry_data.c | 33 +++++++++++++++++++++++++++++---- lib/telemetry/telemetry_data.h | 6 ++++++ lib/telemetry/version.map | 7 +++++++ 5 files changed, 45 insertions(+), 6 deletions(-) diff --git a/lib/telemetry/meson.build b/lib/telemetry/meson.build index f84c9aa3be..73750d9ef4 100644 --- a/lib/telemetry/meson.build +++ b/lib/telemetry/meson.build @@ -6,3 +6,4 @@ includes = [global_inc] sources = files('telemetry.c', 'telemetry_data.c', 'telemetry_legacy.c') headers = files('rte_telemetry.h') includes += include_directories('../metrics') +use_function_versioning = true diff --git a/lib/telemetry/rte_telemetry.h b/lib/telemetry/rte_telemetry.h index 4598303d5d..b481c112dd 100644 --- a/lib/telemetry/rte_telemetry.h +++ b/lib/telemetry/rte_telemetry.h @@ -120,7 +120,7 @@ rte_tel_data_add_array_string(struct rte_tel_data *d, const char *str); * 0 on success, negative errno on error */ int -rte_tel_data_add_array_int(struct rte_tel_data *d, int x); +rte_tel_data_add_array_int(struct rte_tel_data *d, int64_t x); /** * Add an unsigned value to an array. @@ -208,7 +208,7 @@ rte_tel_data_add_dict_string(struct rte_tel_data *d, const char *name, * 0 on success, negative errno on error, E2BIG on string truncation of name. */ int -rte_tel_data_add_dict_int(struct rte_tel_data *d, const char *name, int val); +rte_tel_data_add_dict_int(struct rte_tel_data *d, const char *name, int64_t val); /** * Add an unsigned value to a dictionary. diff --git a/lib/telemetry/telemetry_data.c b/lib/telemetry/telemetry_data.c index 9a180937fd..ac7be795df 100644 --- a/lib/telemetry/telemetry_data.c +++ b/lib/telemetry/telemetry_data.c @@ -8,6 +8,7 @@ #undef RTE_USE_LIBBSD #include <stdbool.h> +#include <rte_function_versioning.h> #include <rte_string_fns.h> #include "telemetry_data.h" @@ -58,8 +59,8 @@ rte_tel_data_add_array_string(struct rte_tel_data *d, const char *str) return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG; } -int -rte_tel_data_add_array_int(struct rte_tel_data *d, int x) +int __vsym +rte_tel_data_add_array_int_v24(struct rte_tel_data *d, int64_t x) { if (d->type != TEL_ARRAY_INT) return -EINVAL; @@ -69,6 +70,18 @@ rte_tel_data_add_array_int(struct rte_tel_data *d, int x) return 0; } +int __vsym +rte_tel_data_add_array_int_v23(struct rte_tel_data *d, int x) +{ + return rte_tel_data_add_array_int_v24(d, x); +} + +/* mark the v23 function as the older version, and v24 as the default version */ +VERSION_SYMBOL(rte_tel_data_add_array_int, _v23, 23); +BIND_DEFAULT_SYMBOL(rte_tel_data_add_array_int, _v24, 24); +MAP_STATIC_SYMBOL(int rte_tel_data_add_array_int(struct rte_tel_data *d, + int64_t x), rte_tel_data_add_array_int_v24); + int rte_tel_data_add_array_uint(struct rte_tel_data *d, uint64_t x) { @@ -146,8 +159,8 @@ rte_tel_data_add_dict_string(struct rte_tel_data *d, const char *name, return 0; } -int -rte_tel_data_add_dict_int(struct rte_tel_data *d, const char *name, int val) +int __vsym +rte_tel_data_add_dict_int_v24(struct rte_tel_data *d, const char *name, int64_t val) { struct tel_dict_entry *e = &d->data.dict[d->data_len]; if (d->type != TEL_DICT) @@ -165,6 +178,18 @@ rte_tel_data_add_dict_int(struct rte_tel_data *d, const char *name, int val) return bytes < RTE_TEL_MAX_STRING_LEN ? 0 : E2BIG; } +int __vsym +rte_tel_data_add_dict_int_v23(struct rte_tel_data *d, const char *name, int val) +{ + return rte_tel_data_add_dict_int_v24(d, name, val); +} + +/* mark the v23 function as the older version, and v24 as the default version */ +VERSION_SYMBOL(rte_tel_data_add_dict_int, _v23, 23); +BIND_DEFAULT_SYMBOL(rte_tel_data_add_dict_int, _v24, 24); +MAP_STATIC_SYMBOL(int rte_tel_data_add_dict_int(struct rte_tel_data *d, + const char *name, int64_t val), rte_tel_data_add_dict_int_v24); + int rte_tel_data_add_dict_uint(struct rte_tel_data *d, const char *name, uint64_t val) diff --git a/lib/telemetry/telemetry_data.h b/lib/telemetry/telemetry_data.h index 205509c5a2..53e4cabea5 100644 --- a/lib/telemetry/telemetry_data.h +++ b/lib/telemetry/telemetry_data.h @@ -49,4 +49,10 @@ struct rte_tel_data { } data; /* data container */ }; +/* versioned functions */ +int rte_tel_data_add_array_int_v23(struct rte_tel_data *d, int val); +int rte_tel_data_add_array_int_v24(struct rte_tel_data *d, int64_t val); +int rte_tel_data_add_dict_int_v23(struct rte_tel_data *d, const char *name, int val); +int rte_tel_data_add_dict_int_v24(struct rte_tel_data *d, const char *name, int64_t val); + #endif diff --git a/lib/telemetry/version.map b/lib/telemetry/version.map index d661180317..accfad5011 100644 --- a/lib/telemetry/version.map +++ b/lib/telemetry/version.map @@ -21,6 +21,13 @@ DPDK_23 { local: *; }; +DPDK_24 { + global: + + rte_tel_data_add_array_int; + rte_tel_data_add_dict_int; +} DPDK_23; + INTERNAL { rte_telemetry_legacy_register; rte_telemetry_init; -- 2.37.2