Hi Ferruh, > -----Original Message----- > From: Yigit, Ferruh <ferruh.yi...@intel.com> > Sent: Thursday, May 14, 2020 5:11 PM > To: Ray Kinsella <m...@ashroe.eu>; Neil Horman > <nhor...@tuxdriver.com>; Dumitrescu, Cristian > <cristian.dumitre...@intel.com>; Eelco Chaudron <echau...@redhat.com> > Cc: dev@dpdk.org; Yigit, Ferruh <ferruh.yi...@intel.com>; Thomas Monjalon > <tho...@monjalon.net>; David Marchand <david.march...@redhat.com>; > sta...@dpdk.org; Luca Boccassi <bl...@debian.org>; Richardson, Bruce > <bruce.richard...@intel.com>; Stokes, Ian <ian.sto...@intel.com>; Andrzej > Ostruszka <a...@semihalf.com> > Subject: [PATCH v4] meter: provide experimental alias of API for old apps > > On v20.02 some meter APIs have been matured and symbols moved from > EXPERIMENTAL to DPDK_20.0.1 block. > > This can break the applications that were using these mentioned APIs on > v19.11. Although there is no modification on the APIs and the action is > positive and matures the APIs, the affect can be negative to > applications. > > Since experimental APIs can change or go away without notice as part of > contract, to prevent this negative affect that may occur by maturing > experimental API, a process update already suggested, which enables > aliasing without forcing it: > https://patches.dpdk.org/patch/65863/ >
Personally, I am not convinced this is really needed. Are there any users asking for this? Is there any other library where this is also applied, or is librte_meter the only library? > This patch provides aliasing by duplicating the existing and versioned > symbols as experimental. > > Since symbols moved from DPDK_20.0.1 to DPDK_21 block in the v20.05, the > aliasing done between EXPERIMENTAL and DPDK_21. > > Also following changes done to enabling aliasing: > > Created VERSION_SYMBOL_EXPERIMENTAL helper macro. > > Updated the 'check-symbols.sh' buildtool, which was complaining that the > symbol is in EXPERIMENTAL tag in .map file but it is not in the > .experimental section (__rte_experimental tag is missing). > Updated tool in a way it won't complain if the symbol in the > EXPERIMENTAL tag duplicated in some other block in .map file (versioned) > > Enabled function versioning for meson build for the library. > > Fixes: 30512af820fe ("meter: remove experimental flag from RFC4115 trTCM > API") > Cc: sta...@dpdk.org > > Signed-off-by: Ferruh Yigit <ferruh.yi...@intel.com> > --- > Cc: Neil Horman <nhor...@tuxdriver.com> > Cc: Thomas Monjalon <tho...@monjalon.net> > Cc: Luca Boccassi <bl...@debian.org> > Cc: David Marchand <david.march...@redhat.com> > Cc: Bruce Richardson <bruce.richard...@intel.com> > Cc: Ian Stokes <ian.sto...@intel.com> > Cc: Eelco Chaudron <echau...@redhat.com> > Cc: Andrzej Ostruszka <a...@semihalf.com> > Cc: Ray Kinsella <m...@ashroe.eu> > > v2: > * Commit log updated > > v3: > * added suggested comment to VERSION_SYMBOL_EXPERIMENTAL macro > > v4: > * update script name in commit log, remove empty line > --- > buildtools/check-symbols.sh | 3 +- > .../include/rte_function_versioning.h | 9 +++ > lib/librte_meter/meson.build | 1 + > lib/librte_meter/rte_meter.c | 59 ++++++++++++++++++- > lib/librte_meter/rte_meter_version.map | 8 +++ > 5 files changed, 76 insertions(+), 4 deletions(-) > > diff --git a/buildtools/check-symbols.sh b/buildtools/check-symbols.sh > index 3df57c322c..e407553a34 100755 > --- a/buildtools/check-symbols.sh > +++ b/buildtools/check-symbols.sh > @@ -26,7 +26,8 @@ ret=0 > for SYM in `$LIST_SYMBOL -S EXPERIMENTAL $MAPFILE |cut -d ' ' -f 3` > do > if grep -q "\.text.*[[:space:]]$SYM$" $DUMPFILE && > - ! grep -q "\.text\.experimental.*[[:space:]]$SYM$" > $DUMPFILE > + ! grep -q "\.text\.experimental.*[[:space:]]$SYM$" > $DUMPFILE && > + $LIST_SYMBOL -s $SYM $MAPFILE | grep -q EXPERIMENTAL > then > cat >&2 <<- END_OF_MESSAGE > $SYM is not flagged as experimental > diff --git a/lib/librte_eal/include/rte_function_versioning.h > b/lib/librte_eal/include/rte_function_versioning.h > index b9f862d295..f588f2643b 100644 > --- a/lib/librte_eal/include/rte_function_versioning.h > +++ b/lib/librte_eal/include/rte_function_versioning.h > @@ -46,6 +46,14 @@ > */ > #define VERSION_SYMBOL(b, e, n) __asm__(".symver " RTE_STR(b) > RTE_STR(e) ", " RTE_STR(b) "@DPDK_" RTE_STR(n)) > > +/* > + * VERSION_SYMBOL_EXPERIMENTAL > + * Creates a symbol version table entry binding the symbol > <b>@EXPERIMENTAL to the internal > + * function name <b><e>. The macro is used when a symbol matures to > become part of the stable ABI, > + * to provide an alias to experimental for some time. > + */ > +#define VERSION_SYMBOL_EXPERIMENTAL(b, e) __asm__(".symver " > RTE_STR(b) RTE_STR(e) ", " RTE_STR(b) "@EXPERIMENTAL") > + > /* > * BIND_DEFAULT_SYMBOL > * Creates a symbol version entry instructing the linker to bind references > to > @@ -79,6 +87,7 @@ > * No symbol versioning in use > */ > #define VERSION_SYMBOL(b, e, n) > +#define VERSION_SYMBOL_EXPERIMENTAL(b, e) > #define __vsym > #define BIND_DEFAULT_SYMBOL(b, e, n) > #define MAP_STATIC_SYMBOL(f, p) f __attribute__((alias(RTE_STR(p)))) > diff --git a/lib/librte_meter/meson.build b/lib/librte_meter/meson.build > index 646fd4d43f..fce0368437 100644 > --- a/lib/librte_meter/meson.build > +++ b/lib/librte_meter/meson.build > @@ -3,3 +3,4 @@ > > sources = files('rte_meter.c') > headers = files('rte_meter.h') > +use_function_versioning = true > diff --git a/lib/librte_meter/rte_meter.c b/lib/librte_meter/rte_meter.c > index da01429a8b..c600b05064 100644 > --- a/lib/librte_meter/rte_meter.c > +++ b/lib/librte_meter/rte_meter.c > @@ -9,6 +9,7 @@ > #include <rte_common.h> > #include <rte_log.h> > #include <rte_cycles.h> > +#include <rte_function_versioning.h> > > #include "rte_meter.h" > > @@ -119,8 +120,8 @@ rte_meter_trtcm_config(struct rte_meter_trtcm *m, > return 0; > } > > -int > -rte_meter_trtcm_rfc4115_profile_config( > +static int > +rte_meter_trtcm_rfc4115_profile_config_( > struct rte_meter_trtcm_rfc4115_profile *p, > struct rte_meter_trtcm_rfc4115_params *params) > { > @@ -145,7 +146,35 @@ rte_meter_trtcm_rfc4115_profile_config( > } > > int > -rte_meter_trtcm_rfc4115_config( > +rte_meter_trtcm_rfc4115_profile_config_s( > + struct rte_meter_trtcm_rfc4115_profile *p, > + struct rte_meter_trtcm_rfc4115_params *params); > +int > +rte_meter_trtcm_rfc4115_profile_config_s( > + struct rte_meter_trtcm_rfc4115_profile *p, > + struct rte_meter_trtcm_rfc4115_params *params) > +{ > + return rte_meter_trtcm_rfc4115_profile_config_(p, params); > +} > +BIND_DEFAULT_SYMBOL(rte_meter_trtcm_rfc4115_profile_config, _s, 21); > +MAP_STATIC_SYMBOL(int rte_meter_trtcm_rfc4115_profile_config(struct > rte_meter_trtcm_rfc4115_profile *p, > + struct rte_meter_trtcm_rfc4115_params *params), > rte_meter_trtcm_rfc4115_profile_config_s); > + > +int > +rte_meter_trtcm_rfc4115_profile_config_e( > + struct rte_meter_trtcm_rfc4115_profile *p, > + struct rte_meter_trtcm_rfc4115_params *params); > +int > +rte_meter_trtcm_rfc4115_profile_config_e( > + struct rte_meter_trtcm_rfc4115_profile *p, > + struct rte_meter_trtcm_rfc4115_params *params) > +{ > + return rte_meter_trtcm_rfc4115_profile_config_(p, params); > +} > +VERSION_SYMBOL_EXPERIMENTAL(rte_meter_trtcm_rfc4115_profile_conf > ig, _e); > + > +static int > +rte_meter_trtcm_rfc4115_config_( > struct rte_meter_trtcm_rfc4115 *m, > struct rte_meter_trtcm_rfc4115_profile *p) > { > @@ -160,3 +189,27 @@ rte_meter_trtcm_rfc4115_config( > > return 0; > } > + > +int > +rte_meter_trtcm_rfc4115_config_s(struct rte_meter_trtcm_rfc4115 *m, > + struct rte_meter_trtcm_rfc4115_profile *p); > +int > +rte_meter_trtcm_rfc4115_config_s(struct rte_meter_trtcm_rfc4115 *m, > + struct rte_meter_trtcm_rfc4115_profile *p) > +{ > + return rte_meter_trtcm_rfc4115_config_(m, p); > +} > +BIND_DEFAULT_SYMBOL(rte_meter_trtcm_rfc4115_config, _s, 21); > +MAP_STATIC_SYMBOL(int rte_meter_trtcm_rfc4115_config(struct > rte_meter_trtcm_rfc4115 *m, > + struct rte_meter_trtcm_rfc4115_profile *p), > rte_meter_trtcm_rfc4115_config_s); > + > +int > +rte_meter_trtcm_rfc4115_config_e(struct rte_meter_trtcm_rfc4115 *m, > + struct rte_meter_trtcm_rfc4115_profile *p); > +int > +rte_meter_trtcm_rfc4115_config_e(struct rte_meter_trtcm_rfc4115 *m, > + struct rte_meter_trtcm_rfc4115_profile *p) > +{ > + return rte_meter_trtcm_rfc4115_config_(m, p); > +} > +VERSION_SYMBOL_EXPERIMENTAL(rte_meter_trtcm_rfc4115_config, _e); To me, this is a significant amount of dead code that does not add any functionality and does not bring any added value to the library for any user. I am not a build system expert, but I would definitely prefer avoiding adding any C code to the library for this purpose, and just modify the map file, would this approach be possible? Also, very important, is this C code to be added permanently or is it added just on a temporary basis? If temporary, when is it going to be removed? > diff --git a/lib/librte_meter/rte_meter_version.map > b/lib/librte_meter/rte_meter_version.map > index 2c7dadbcac..b493bcebe9 100644 > --- a/lib/librte_meter/rte_meter_version.map > +++ b/lib/librte_meter/rte_meter_version.map > @@ -20,4 +20,12 @@ DPDK_21 { > rte_meter_trtcm_rfc4115_color_blind_check; > rte_meter_trtcm_rfc4115_config; > rte_meter_trtcm_rfc4115_profile_config; > + > } DPDK_20.0; > + > +EXPERIMENTAL { > + global: > + > + rte_meter_trtcm_rfc4115_config; > + rte_meter_trtcm_rfc4115_profile_config; > +}; > -- > 2.25.4 Regards, Cristian