* [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries @ 2019-04-10 13:45 Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson ` (4 more replies) 0 siblings, 5 replies; 25+ messages in thread From: Bruce Richardson @ 2019-04-10 13:45 UTC (permalink / raw) To: konstantin.ananyev, aconole; +Cc: dev, Bruce Richardson Weak functions don't work well with static library builds as the linker always picks the first version of a function irrespective of whether it is weak or not. The solution to this is to use the "whole-archive" flag when linking, but this has the nasty side-effect that it causes the resulting binary to be larger than it needs to be. A further problem with this approach of using "whole-archive" is that one either needs to link all libraries with this flag or track what libraries need it or not - the latter being especially a problem for apps not using the DPDK build system itself (i.e. most apps not shipped with DPDK itself). For meson builds this information needs to make its way all the way through to the pkgconfig file generated - not a trivial undertaking. Thankfully, though, the use of weak functions is limited to use for multiple functions within a single library, meaning that when the lib is being built, the build system itself can know whether the "weak" function is needed or not. This allows us to change the weak function to a conditionally compiled regular function used in fallback case. This makes the need for "whole-archive" flag, and any special linking measures for the library, go away. [This set does not touch the drivers, only the libraries, since there are other special linker flags needed for drivers in general, making the problem less severe for driver .a files.] Bruce Richardson (2): acl: remove use of weak functions bpf: remove use of weak functions lib/librte_acl/meson.build | 7 ++++++- lib/librte_acl/rte_acl.c | 18 ++++++++++++++---- lib/librte_bpf/bpf_load.c | 4 +++- lib/librte_bpf/meson.build | 1 + mk/rte.app.mk | 3 --- 5 files changed, 24 insertions(+), 9 deletions(-) -- 2.20.1 ^ permalink raw reply [flat|nested] 25+ messages in thread
* [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries 2019-04-10 13:45 [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries Bruce Richardson @ 2019-04-10 13:45 ` Bruce Richardson 2019-04-10 13:45 ` [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions Bruce Richardson ` (3 subsequent siblings) 4 siblings, 0 replies; 25+ messages in thread From: Bruce Richardson @ 2019-04-10 13:45 UTC (permalink / raw) To: konstantin.ananyev, aconole; +Cc: dev, Bruce Richardson Weak functions don't work well with static library builds as the linker always picks the first version of a function irrespective of whether it is weak or not. The solution to this is to use the "whole-archive" flag when linking, but this has the nasty side-effect that it causes the resulting binary to be larger than it needs to be. A further problem with this approach of using "whole-archive" is that one either needs to link all libraries with this flag or track what libraries need it or not - the latter being especially a problem for apps not using the DPDK build system itself (i.e. most apps not shipped with DPDK itself). For meson builds this information needs to make its way all the way through to the pkgconfig file generated - not a trivial undertaking. Thankfully, though, the use of weak functions is limited to use for multiple functions within a single library, meaning that when the lib is being built, the build system itself can know whether the "weak" function is needed or not. This allows us to change the weak function to a conditionally compiled regular function used in fallback case. This makes the need for "whole-archive" flag, and any special linking measures for the library, go away. [This set does not touch the drivers, only the libraries, since there are other special linker flags needed for drivers in general, making the problem less severe for driver .a files.] Bruce Richardson (2): acl: remove use of weak functions bpf: remove use of weak functions lib/librte_acl/meson.build | 7 ++++++- lib/librte_acl/rte_acl.c | 18 ++++++++++++++---- lib/librte_bpf/bpf_load.c | 4 +++- lib/librte_bpf/meson.build | 1 + mk/rte.app.mk | 3 --- 5 files changed, 24 insertions(+), 9 deletions(-) -- 2.20.1 ^ permalink raw reply [flat|nested] 25+ messages in thread
* [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions 2019-04-10 13:45 [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson @ 2019-04-10 13:45 ` Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson ` (2 more replies) 2019-04-10 13:45 ` [dpdk-dev] [PATCH 2/2] bpf: " Bruce Richardson ` (2 subsequent siblings) 4 siblings, 3 replies; 25+ messages in thread From: Bruce Richardson @ 2019-04-10 13:45 UTC (permalink / raw) To: konstantin.ananyev, aconole; +Cc: dev, Bruce Richardson Weak functions don't work well with static libraries and require the use of "whole-archive" flag to ensure that the correct function is used when linking. Since the weak functions are only used as placeholders within this library alone, we can replace them with non-weak functions using preprocessor ifdefs. Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- lib/librte_acl/meson.build | 7 ++++++- lib/librte_acl/rte_acl.c | 18 ++++++++++++++---- mk/rte.app.mk | 3 --- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build index 2207dbafe..98ece7d85 100644 --- a/lib/librte_acl/meson.build +++ b/lib/librte_acl/meson.build @@ -6,7 +6,7 @@ sources = files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c', 'rte_acl.c', 'tb_mem.c') headers = files('rte_acl.h', 'rte_acl_osdep.h') -if arch_subdir == 'x86' +if dpdk_conf.has('RTE_ARCH_X86') sources += files('acl_run_sse.c') # compile AVX2 version if either: @@ -28,4 +28,9 @@ if arch_subdir == 'x86' cflags += '-DCC_AVX2_SUPPORT' endif +elif dpdk_conf.has('RTE_ARCH_ARM') or dpdk_conf.has('RTE_ARCH_ARM64') + cflags += '-flax-vector-conversions' + sources += files('acl_run_neon.c') +elif dpdk_conf.has('RTE_ARCH_PPC_64') + sources += files('acl_run_altivec.c') endif diff --git a/lib/librte_acl/rte_acl.c b/lib/librte_acl/rte_acl.c index c436a9bfd..fd5bd5e4e 100644 --- a/lib/librte_acl/rte_acl.c +++ b/lib/librte_acl/rte_acl.c @@ -13,11 +13,13 @@ static struct rte_tailq_elem rte_acl_tailq = { }; EAL_REGISTER_TAILQ(rte_acl_tailq) +#ifndef RTE_ARCH_X86 +#ifndef CC_AVX2_SUPPORT /* * If the compiler doesn't support AVX2 instructions, * then the dummy one would be used instead for AVX2 classify method. */ -__rte_weak int +int rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, __rte_unused const uint8_t **data, __rte_unused uint32_t *results, @@ -26,8 +28,9 @@ rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, { return -ENOTSUP; } +#endif -__rte_weak int +int rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, __rte_unused const uint8_t **data, __rte_unused uint32_t *results, @@ -36,8 +39,11 @@ rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, { return -ENOTSUP; } +#endif -__rte_weak int +#ifndef RTE_ARCH_ARM +#ifndef RTE_ARCH_ARM64 +int rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, __rte_unused const uint8_t **data, __rte_unused uint32_t *results, @@ -46,8 +52,11 @@ rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, { return -ENOTSUP; } +#endif +#endif -__rte_weak int +#ifndef RTE_ARCH_PPC_64 +int rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, __rte_unused const uint8_t **data, __rte_unused uint32_t *results, @@ -56,6 +65,7 @@ rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, { return -ENOTSUP; } +#endif static const rte_acl_classify_t classify_fns[] = { [RTE_ACL_CLASSIFY_DEFAULT] = rte_acl_classify_scalar, diff --git a/mk/rte.app.mk b/mk/rte.app.mk index 7d994bece..fdec636b4 100644 --- a/mk/rte.app.mk +++ b/mk/rte.app.mk @@ -46,10 +46,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += -lrte_distributor _LDLIBS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += -lrte_ip_frag _LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lrte_meter _LDLIBS-$(CONFIG_RTE_LIBRTE_LPM) += -lrte_lpm -# librte_acl needs --whole-archive because of weak functions -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --whole-archive _LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += -lrte_acl -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --no-whole-archive _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --no-as-needed _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --whole-archive _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += -lrte_telemetry -ljansson -- 2.20.1 ^ permalink raw reply [flat|nested] 25+ messages in thread
* [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions 2019-04-10 13:45 ` [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions Bruce Richardson @ 2019-04-10 13:45 ` Bruce Richardson 2019-04-10 13:54 ` Aaron Conole 2019-04-10 14:57 ` Ananyev, Konstantin 2 siblings, 0 replies; 25+ messages in thread From: Bruce Richardson @ 2019-04-10 13:45 UTC (permalink / raw) To: konstantin.ananyev, aconole; +Cc: dev, Bruce Richardson Weak functions don't work well with static libraries and require the use of "whole-archive" flag to ensure that the correct function is used when linking. Since the weak functions are only used as placeholders within this library alone, we can replace them with non-weak functions using preprocessor ifdefs. Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- lib/librte_acl/meson.build | 7 ++++++- lib/librte_acl/rte_acl.c | 18 ++++++++++++++---- mk/rte.app.mk | 3 --- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build index 2207dbafe..98ece7d85 100644 --- a/lib/librte_acl/meson.build +++ b/lib/librte_acl/meson.build @@ -6,7 +6,7 @@ sources = files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c', 'rte_acl.c', 'tb_mem.c') headers = files('rte_acl.h', 'rte_acl_osdep.h') -if arch_subdir == 'x86' +if dpdk_conf.has('RTE_ARCH_X86') sources += files('acl_run_sse.c') # compile AVX2 version if either: @@ -28,4 +28,9 @@ if arch_subdir == 'x86' cflags += '-DCC_AVX2_SUPPORT' endif +elif dpdk_conf.has('RTE_ARCH_ARM') or dpdk_conf.has('RTE_ARCH_ARM64') + cflags += '-flax-vector-conversions' + sources += files('acl_run_neon.c') +elif dpdk_conf.has('RTE_ARCH_PPC_64') + sources += files('acl_run_altivec.c') endif diff --git a/lib/librte_acl/rte_acl.c b/lib/librte_acl/rte_acl.c index c436a9bfd..fd5bd5e4e 100644 --- a/lib/librte_acl/rte_acl.c +++ b/lib/librte_acl/rte_acl.c @@ -13,11 +13,13 @@ static struct rte_tailq_elem rte_acl_tailq = { }; EAL_REGISTER_TAILQ(rte_acl_tailq) +#ifndef RTE_ARCH_X86 +#ifndef CC_AVX2_SUPPORT /* * If the compiler doesn't support AVX2 instructions, * then the dummy one would be used instead for AVX2 classify method. */ -__rte_weak int +int rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, __rte_unused const uint8_t **data, __rte_unused uint32_t *results, @@ -26,8 +28,9 @@ rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, { return -ENOTSUP; } +#endif -__rte_weak int +int rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, __rte_unused const uint8_t **data, __rte_unused uint32_t *results, @@ -36,8 +39,11 @@ rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, { return -ENOTSUP; } +#endif -__rte_weak int +#ifndef RTE_ARCH_ARM +#ifndef RTE_ARCH_ARM64 +int rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, __rte_unused const uint8_t **data, __rte_unused uint32_t *results, @@ -46,8 +52,11 @@ rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, { return -ENOTSUP; } +#endif +#endif -__rte_weak int +#ifndef RTE_ARCH_PPC_64 +int rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, __rte_unused const uint8_t **data, __rte_unused uint32_t *results, @@ -56,6 +65,7 @@ rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, { return -ENOTSUP; } +#endif static const rte_acl_classify_t classify_fns[] = { [RTE_ACL_CLASSIFY_DEFAULT] = rte_acl_classify_scalar, diff --git a/mk/rte.app.mk b/mk/rte.app.mk index 7d994bece..fdec636b4 100644 --- a/mk/rte.app.mk +++ b/mk/rte.app.mk @@ -46,10 +46,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += -lrte_distributor _LDLIBS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += -lrte_ip_frag _LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lrte_meter _LDLIBS-$(CONFIG_RTE_LIBRTE_LPM) += -lrte_lpm -# librte_acl needs --whole-archive because of weak functions -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --whole-archive _LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += -lrte_acl -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --no-whole-archive _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --no-as-needed _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --whole-archive _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += -lrte_telemetry -ljansson -- 2.20.1 ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions 2019-04-10 13:45 ` [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson @ 2019-04-10 13:54 ` Aaron Conole 2019-04-10 13:54 ` Aaron Conole 2019-04-10 14:02 ` Bruce Richardson 2019-04-10 14:57 ` Ananyev, Konstantin 2 siblings, 2 replies; 25+ messages in thread From: Aaron Conole @ 2019-04-10 13:54 UTC (permalink / raw) To: Bruce Richardson; +Cc: konstantin.ananyev, dev Bruce Richardson <bruce.richardson@intel.com> writes: > Weak functions don't work well with static libraries and require the use of > "whole-archive" flag to ensure that the correct function is used when > linking. Since the weak functions are only used as placeholders within > this library alone, we can replace them with non-weak functions using > preprocessor ifdefs. > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> > --- > lib/librte_acl/meson.build | 7 ++++++- > lib/librte_acl/rte_acl.c | 18 ++++++++++++++---- > mk/rte.app.mk | 3 --- > 3 files changed, 20 insertions(+), 8 deletions(-) > > diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build > index 2207dbafe..98ece7d85 100644 > --- a/lib/librte_acl/meson.build > +++ b/lib/librte_acl/meson.build > @@ -6,7 +6,7 @@ sources = files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c', > 'rte_acl.c', 'tb_mem.c') > headers = files('rte_acl.h', 'rte_acl_osdep.h') > > -if arch_subdir == 'x86' > +if dpdk_conf.has('RTE_ARCH_X86') > sources += files('acl_run_sse.c') > > # compile AVX2 version if either: > @@ -28,4 +28,9 @@ if arch_subdir == 'x86' > cflags += '-DCC_AVX2_SUPPORT' > endif > > +elif dpdk_conf.has('RTE_ARCH_ARM') or dpdk_conf.has('RTE_ARCH_ARM64') > + cflags += '-flax-vector-conversions' > + sources += files('acl_run_neon.c') This will also need -Wno-uninitialized (otherwise it will generate warnings about the search_neon_4 and search_neon_8 functions). But I don't like papering over these conversions. I'd prefer instead the patches I posted at: http://mails.dpdk.org/archives/dev/2019-April/129540.html and http://mails.dpdk.org/archives/dev/2019-April/129541.html Are you opposed to merging those? > +elif dpdk_conf.has('RTE_ARCH_PPC_64') > + sources += files('acl_run_altivec.c') > endif > diff --git a/lib/librte_acl/rte_acl.c b/lib/librte_acl/rte_acl.c > index c436a9bfd..fd5bd5e4e 100644 > --- a/lib/librte_acl/rte_acl.c > +++ b/lib/librte_acl/rte_acl.c > @@ -13,11 +13,13 @@ static struct rte_tailq_elem rte_acl_tailq = { > }; > EAL_REGISTER_TAILQ(rte_acl_tailq) > > +#ifndef RTE_ARCH_X86 > +#ifndef CC_AVX2_SUPPORT > /* > * If the compiler doesn't support AVX2 instructions, > * then the dummy one would be used instead for AVX2 classify method. > */ > -__rte_weak int > +int > rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -26,8 +28,9 @@ rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > -__rte_weak int > +int > rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -36,8 +39,11 @@ rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > -__rte_weak int > +#ifndef RTE_ARCH_ARM > +#ifndef RTE_ARCH_ARM64 > +int > rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -46,8 +52,11 @@ rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > +#endif > > -__rte_weak int > +#ifndef RTE_ARCH_PPC_64 > +int > rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -56,6 +65,7 @@ rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > static const rte_acl_classify_t classify_fns[] = { > [RTE_ACL_CLASSIFY_DEFAULT] = rte_acl_classify_scalar, > diff --git a/mk/rte.app.mk b/mk/rte.app.mk > index 7d994bece..fdec636b4 100644 > --- a/mk/rte.app.mk > +++ b/mk/rte.app.mk > @@ -46,10 +46,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += -lrte_distributor > _LDLIBS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += -lrte_ip_frag > _LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lrte_meter > _LDLIBS-$(CONFIG_RTE_LIBRTE_LPM) += -lrte_lpm > -# librte_acl needs --whole-archive because of weak functions > -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += -lrte_acl > -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --no-whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --no-as-needed > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += -lrte_telemetry -ljansson I think I have a solution for this that can use the weak aliasing and not require the use of the whole-archive flag. Would you prefer that? ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions 2019-04-10 13:54 ` Aaron Conole @ 2019-04-10 13:54 ` Aaron Conole 2019-04-10 14:02 ` Bruce Richardson 1 sibling, 0 replies; 25+ messages in thread From: Aaron Conole @ 2019-04-10 13:54 UTC (permalink / raw) To: Bruce Richardson; +Cc: konstantin.ananyev, dev Bruce Richardson <bruce.richardson@intel.com> writes: > Weak functions don't work well with static libraries and require the use of > "whole-archive" flag to ensure that the correct function is used when > linking. Since the weak functions are only used as placeholders within > this library alone, we can replace them with non-weak functions using > preprocessor ifdefs. > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> > --- > lib/librte_acl/meson.build | 7 ++++++- > lib/librte_acl/rte_acl.c | 18 ++++++++++++++---- > mk/rte.app.mk | 3 --- > 3 files changed, 20 insertions(+), 8 deletions(-) > > diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build > index 2207dbafe..98ece7d85 100644 > --- a/lib/librte_acl/meson.build > +++ b/lib/librte_acl/meson.build > @@ -6,7 +6,7 @@ sources = files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c', > 'rte_acl.c', 'tb_mem.c') > headers = files('rte_acl.h', 'rte_acl_osdep.h') > > -if arch_subdir == 'x86' > +if dpdk_conf.has('RTE_ARCH_X86') > sources += files('acl_run_sse.c') > > # compile AVX2 version if either: > @@ -28,4 +28,9 @@ if arch_subdir == 'x86' > cflags += '-DCC_AVX2_SUPPORT' > endif > > +elif dpdk_conf.has('RTE_ARCH_ARM') or dpdk_conf.has('RTE_ARCH_ARM64') > + cflags += '-flax-vector-conversions' > + sources += files('acl_run_neon.c') This will also need -Wno-uninitialized (otherwise it will generate warnings about the search_neon_4 and search_neon_8 functions). But I don't like papering over these conversions. I'd prefer instead the patches I posted at: http://mails.dpdk.org/archives/dev/2019-April/129540.html and http://mails.dpdk.org/archives/dev/2019-April/129541.html Are you opposed to merging those? > +elif dpdk_conf.has('RTE_ARCH_PPC_64') > + sources += files('acl_run_altivec.c') > endif > diff --git a/lib/librte_acl/rte_acl.c b/lib/librte_acl/rte_acl.c > index c436a9bfd..fd5bd5e4e 100644 > --- a/lib/librte_acl/rte_acl.c > +++ b/lib/librte_acl/rte_acl.c > @@ -13,11 +13,13 @@ static struct rte_tailq_elem rte_acl_tailq = { > }; > EAL_REGISTER_TAILQ(rte_acl_tailq) > > +#ifndef RTE_ARCH_X86 > +#ifndef CC_AVX2_SUPPORT > /* > * If the compiler doesn't support AVX2 instructions, > * then the dummy one would be used instead for AVX2 classify method. > */ > -__rte_weak int > +int > rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -26,8 +28,9 @@ rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > -__rte_weak int > +int > rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -36,8 +39,11 @@ rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > -__rte_weak int > +#ifndef RTE_ARCH_ARM > +#ifndef RTE_ARCH_ARM64 > +int > rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -46,8 +52,11 @@ rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > +#endif > > -__rte_weak int > +#ifndef RTE_ARCH_PPC_64 > +int > rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -56,6 +65,7 @@ rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > static const rte_acl_classify_t classify_fns[] = { > [RTE_ACL_CLASSIFY_DEFAULT] = rte_acl_classify_scalar, > diff --git a/mk/rte.app.mk b/mk/rte.app.mk > index 7d994bece..fdec636b4 100644 > --- a/mk/rte.app.mk > +++ b/mk/rte.app.mk > @@ -46,10 +46,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += -lrte_distributor > _LDLIBS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += -lrte_ip_frag > _LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lrte_meter > _LDLIBS-$(CONFIG_RTE_LIBRTE_LPM) += -lrte_lpm > -# librte_acl needs --whole-archive because of weak functions > -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += -lrte_acl > -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --no-whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --no-as-needed > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += -lrte_telemetry -ljansson I think I have a solution for this that can use the weak aliasing and not require the use of the whole-archive flag. Would you prefer that? ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions 2019-04-10 13:54 ` Aaron Conole 2019-04-10 13:54 ` Aaron Conole @ 2019-04-10 14:02 ` Bruce Richardson 2019-04-10 14:02 ` Bruce Richardson 2019-04-10 14:08 ` Aaron Conole 1 sibling, 2 replies; 25+ messages in thread From: Bruce Richardson @ 2019-04-10 14:02 UTC (permalink / raw) To: Aaron Conole; +Cc: konstantin.ananyev, dev On Wed, Apr 10, 2019 at 09:54:02AM -0400, Aaron Conole wrote: > Bruce Richardson <bruce.richardson@intel.com> writes: > > > Weak functions don't work well with static libraries and require the > > use of "whole-archive" flag to ensure that the correct function is used > > when linking. Since the weak functions are only used as placeholders > > within this library alone, we can replace them with non-weak functions > > using preprocessor ifdefs. > > > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- > > lib/librte_acl/meson.build | 7 ++++++- lib/librte_acl/rte_acl.c | 18 > > ++++++++++++++---- mk/rte.app.mk | 3 --- 3 files changed, > > 20 insertions(+), 8 deletions(-) > > > > diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build > > index 2207dbafe..98ece7d85 100644 --- a/lib/librte_acl/meson.build +++ > > b/lib/librte_acl/meson.build @@ -6,7 +6,7 @@ sources = > > files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c', 'rte_acl.c', > > 'tb_mem.c') headers = files('rte_acl.h', 'rte_acl_osdep.h') > > > > -if arch_subdir == 'x86' +if dpdk_conf.has('RTE_ARCH_X86') sources += > > files('acl_run_sse.c') > > > > # compile AVX2 version if either: @@ -28,4 +28,9 @@ if arch_subdir > > == 'x86' cflags += '-DCC_AVX2_SUPPORT' endif > > > > +elif dpdk_conf.has('RTE_ARCH_ARM') or dpdk_conf.has('RTE_ARCH_ARM64') > > + cflags += '-flax-vector-conversions' + sources += > > files('acl_run_neon.c') > > This will also need -Wno-uninitialized (otherwise it will generate > warnings about the search_neon_4 and search_neon_8 functions). > > But I don't like papering over these conversions. I'd prefer instead the > patches I posted at: > > http://mails.dpdk.org/archives/dev/2019-April/129540.html and > http://mails.dpdk.org/archives/dev/2019-April/129541.html > > Are you opposed to merging those? > Nope, not in the least. I'm happy enough to rework this patch on top of those - I'd just had forgotten about them in my rush to get a potential solution out here. I did these up quickly to show how easy it is to remove the need for the weak functions and the subsequent linker "--whole-archive" flag. /Bruce PS: I see your patch 2 does not include the Wno-uninitialized flag, is it not needed in your patch, or just an oversight? ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions 2019-04-10 14:02 ` Bruce Richardson @ 2019-04-10 14:02 ` Bruce Richardson 2019-04-10 14:08 ` Aaron Conole 1 sibling, 0 replies; 25+ messages in thread From: Bruce Richardson @ 2019-04-10 14:02 UTC (permalink / raw) To: Aaron Conole; +Cc: konstantin.ananyev, dev On Wed, Apr 10, 2019 at 09:54:02AM -0400, Aaron Conole wrote: > Bruce Richardson <bruce.richardson@intel.com> writes: > > > Weak functions don't work well with static libraries and require the > > use of "whole-archive" flag to ensure that the correct function is used > > when linking. Since the weak functions are only used as placeholders > > within this library alone, we can replace them with non-weak functions > > using preprocessor ifdefs. > > > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- > > lib/librte_acl/meson.build | 7 ++++++- lib/librte_acl/rte_acl.c | 18 > > ++++++++++++++---- mk/rte.app.mk | 3 --- 3 files changed, > > 20 insertions(+), 8 deletions(-) > > > > diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build > > index 2207dbafe..98ece7d85 100644 --- a/lib/librte_acl/meson.build +++ > > b/lib/librte_acl/meson.build @@ -6,7 +6,7 @@ sources = > > files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c', 'rte_acl.c', > > 'tb_mem.c') headers = files('rte_acl.h', 'rte_acl_osdep.h') > > > > -if arch_subdir == 'x86' +if dpdk_conf.has('RTE_ARCH_X86') sources += > > files('acl_run_sse.c') > > > > # compile AVX2 version if either: @@ -28,4 +28,9 @@ if arch_subdir > > == 'x86' cflags += '-DCC_AVX2_SUPPORT' endif > > > > +elif dpdk_conf.has('RTE_ARCH_ARM') or dpdk_conf.has('RTE_ARCH_ARM64') > > + cflags += '-flax-vector-conversions' + sources += > > files('acl_run_neon.c') > > This will also need -Wno-uninitialized (otherwise it will generate > warnings about the search_neon_4 and search_neon_8 functions). > > But I don't like papering over these conversions. I'd prefer instead the > patches I posted at: > > http://mails.dpdk.org/archives/dev/2019-April/129540.html and > http://mails.dpdk.org/archives/dev/2019-April/129541.html > > Are you opposed to merging those? > Nope, not in the least. I'm happy enough to rework this patch on top of those - I'd just had forgotten about them in my rush to get a potential solution out here. I did these up quickly to show how easy it is to remove the need for the weak functions and the subsequent linker "--whole-archive" flag. /Bruce PS: I see your patch 2 does not include the Wno-uninitialized flag, is it not needed in your patch, or just an oversight? ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions 2019-04-10 14:02 ` Bruce Richardson 2019-04-10 14:02 ` Bruce Richardson @ 2019-04-10 14:08 ` Aaron Conole 2019-04-10 14:08 ` Aaron Conole 1 sibling, 1 reply; 25+ messages in thread From: Aaron Conole @ 2019-04-10 14:08 UTC (permalink / raw) To: Bruce Richardson; +Cc: konstantin.ananyev, dev Bruce Richardson <bruce.richardson@intel.com> writes: > On Wed, Apr 10, 2019 at 09:54:02AM -0400, Aaron Conole wrote: >> Bruce Richardson <bruce.richardson@intel.com> writes: >> >> > Weak functions don't work well with static libraries and require the >> > use of "whole-archive" flag to ensure that the correct function is used >> > when linking. Since the weak functions are only used as placeholders >> > within this library alone, we can replace them with non-weak functions >> > using preprocessor ifdefs. >> > >> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- >> > lib/librte_acl/meson.build | 7 ++++++- lib/librte_acl/rte_acl.c | 18 >> > ++++++++++++++---- mk/rte.app.mk | 3 --- 3 files changed, >> > 20 insertions(+), 8 deletions(-) >> > >> > diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build >> > index 2207dbafe..98ece7d85 100644 --- a/lib/librte_acl/meson.build +++ >> > b/lib/librte_acl/meson.build @@ -6,7 +6,7 @@ sources = >> > files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c', 'rte_acl.c', >> > 'tb_mem.c') headers = files('rte_acl.h', 'rte_acl_osdep.h') >> > >> > -if arch_subdir == 'x86' +if dpdk_conf.has('RTE_ARCH_X86') sources += >> > files('acl_run_sse.c') >> > >> > # compile AVX2 version if either: @@ -28,4 +28,9 @@ if arch_subdir >> > == 'x86' cflags += '-DCC_AVX2_SUPPORT' endif >> > >> > +elif dpdk_conf.has('RTE_ARCH_ARM') or dpdk_conf.has('RTE_ARCH_ARM64') >> > + cflags += '-flax-vector-conversions' + sources += >> > files('acl_run_neon.c') >> >> This will also need -Wno-uninitialized (otherwise it will generate >> warnings about the search_neon_4 and search_neon_8 functions). >> >> But I don't like papering over these conversions. I'd prefer instead the >> patches I posted at: >> >> http://mails.dpdk.org/archives/dev/2019-April/129540.html and >> http://mails.dpdk.org/archives/dev/2019-April/129541.html >> >> Are you opposed to merging those? >> > Nope, not in the least. I'm happy enough to rework this patch on top of > those - I'd just had forgotten about them in my rush to get a potential > solution out here. I did these up quickly to show how easy it is to remove > the need for the weak functions and the subsequent linker "--whole-archive" > flag. > > /Bruce > > PS: I see your patch 2 does not include the Wno-uninitialized flag, is it > not needed in your patch, or just an oversight? It isn't needed, I resolved the issue with an explicit initialization. ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions 2019-04-10 14:08 ` Aaron Conole @ 2019-04-10 14:08 ` Aaron Conole 0 siblings, 0 replies; 25+ messages in thread From: Aaron Conole @ 2019-04-10 14:08 UTC (permalink / raw) To: Bruce Richardson; +Cc: konstantin.ananyev, dev Bruce Richardson <bruce.richardson@intel.com> writes: > On Wed, Apr 10, 2019 at 09:54:02AM -0400, Aaron Conole wrote: >> Bruce Richardson <bruce.richardson@intel.com> writes: >> >> > Weak functions don't work well with static libraries and require the >> > use of "whole-archive" flag to ensure that the correct function is used >> > when linking. Since the weak functions are only used as placeholders >> > within this library alone, we can replace them with non-weak functions >> > using preprocessor ifdefs. >> > >> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- >> > lib/librte_acl/meson.build | 7 ++++++- lib/librte_acl/rte_acl.c | 18 >> > ++++++++++++++---- mk/rte.app.mk | 3 --- 3 files changed, >> > 20 insertions(+), 8 deletions(-) >> > >> > diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build >> > index 2207dbafe..98ece7d85 100644 --- a/lib/librte_acl/meson.build +++ >> > b/lib/librte_acl/meson.build @@ -6,7 +6,7 @@ sources = >> > files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c', 'rte_acl.c', >> > 'tb_mem.c') headers = files('rte_acl.h', 'rte_acl_osdep.h') >> > >> > -if arch_subdir == 'x86' +if dpdk_conf.has('RTE_ARCH_X86') sources += >> > files('acl_run_sse.c') >> > >> > # compile AVX2 version if either: @@ -28,4 +28,9 @@ if arch_subdir >> > == 'x86' cflags += '-DCC_AVX2_SUPPORT' endif >> > >> > +elif dpdk_conf.has('RTE_ARCH_ARM') or dpdk_conf.has('RTE_ARCH_ARM64') >> > + cflags += '-flax-vector-conversions' + sources += >> > files('acl_run_neon.c') >> >> This will also need -Wno-uninitialized (otherwise it will generate >> warnings about the search_neon_4 and search_neon_8 functions). >> >> But I don't like papering over these conversions. I'd prefer instead the >> patches I posted at: >> >> http://mails.dpdk.org/archives/dev/2019-April/129540.html and >> http://mails.dpdk.org/archives/dev/2019-April/129541.html >> >> Are you opposed to merging those? >> > Nope, not in the least. I'm happy enough to rework this patch on top of > those - I'd just had forgotten about them in my rush to get a potential > solution out here. I did these up quickly to show how easy it is to remove > the need for the weak functions and the subsequent linker "--whole-archive" > flag. > > /Bruce > > PS: I see your patch 2 does not include the Wno-uninitialized flag, is it > not needed in your patch, or just an oversight? It isn't needed, I resolved the issue with an explicit initialization. ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions 2019-04-10 13:45 ` [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson 2019-04-10 13:54 ` Aaron Conole @ 2019-04-10 14:57 ` Ananyev, Konstantin 2019-04-10 14:57 ` Ananyev, Konstantin 2 siblings, 1 reply; 25+ messages in thread From: Ananyev, Konstantin @ 2019-04-10 14:57 UTC (permalink / raw) To: Richardson, Bruce, aconole; +Cc: dev > -----Original Message----- > From: Richardson, Bruce > Sent: Wednesday, April 10, 2019 2:45 PM > To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; aconole@redhat.com > Cc: dev@dpdk.org; Richardson, Bruce <bruce.richardson@intel.com> > Subject: [PATCH 1/2] acl: remove use of weak functions > > Weak functions don't work well with static libraries and require the use of > "whole-archive" flag to ensure that the correct function is used when > linking. Since the weak functions are only used as placeholders within > this library alone, we can replace them with non-weak functions using > preprocessor ifdefs. > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> > --- > lib/librte_acl/meson.build | 7 ++++++- > lib/librte_acl/rte_acl.c | 18 ++++++++++++++---- > mk/rte.app.mk | 3 --- > 3 files changed, 20 insertions(+), 8 deletions(-) > > diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build > index 2207dbafe..98ece7d85 100644 > --- a/lib/librte_acl/meson.build > +++ b/lib/librte_acl/meson.build > @@ -6,7 +6,7 @@ sources = files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c', > 'rte_acl.c', 'tb_mem.c') > headers = files('rte_acl.h', 'rte_acl_osdep.h') > > -if arch_subdir == 'x86' > +if dpdk_conf.has('RTE_ARCH_X86') > sources += files('acl_run_sse.c') > > # compile AVX2 version if either: > @@ -28,4 +28,9 @@ if arch_subdir == 'x86' > cflags += '-DCC_AVX2_SUPPORT' > endif > > +elif dpdk_conf.has('RTE_ARCH_ARM') or dpdk_conf.has('RTE_ARCH_ARM64') > + cflags += '-flax-vector-conversions' > + sources += files('acl_run_neon.c') > +elif dpdk_conf.has('RTE_ARCH_PPC_64') > + sources += files('acl_run_altivec.c') > endif > diff --git a/lib/librte_acl/rte_acl.c b/lib/librte_acl/rte_acl.c > index c436a9bfd..fd5bd5e4e 100644 > --- a/lib/librte_acl/rte_acl.c > +++ b/lib/librte_acl/rte_acl.c > @@ -13,11 +13,13 @@ static struct rte_tailq_elem rte_acl_tailq = { > }; > EAL_REGISTER_TAILQ(rte_acl_tailq) > > +#ifndef RTE_ARCH_X86 > +#ifndef CC_AVX2_SUPPORT > /* > * If the compiler doesn't support AVX2 instructions, > * then the dummy one would be used instead for AVX2 classify method. > */ > -__rte_weak int > +int > rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -26,8 +28,9 @@ rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > -__rte_weak int > +int > rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -36,8 +39,11 @@ rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > -__rte_weak int > +#ifndef RTE_ARCH_ARM > +#ifndef RTE_ARCH_ARM64 > +int > rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -46,8 +52,11 @@ rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > +#endif > > -__rte_weak int > +#ifndef RTE_ARCH_PPC_64 > +int > rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -56,6 +65,7 @@ rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > static const rte_acl_classify_t classify_fns[] = { > [RTE_ACL_CLASSIFY_DEFAULT] = rte_acl_classify_scalar, > diff --git a/mk/rte.app.mk b/mk/rte.app.mk > index 7d994bece..fdec636b4 100644 > --- a/mk/rte.app.mk > +++ b/mk/rte.app.mk > @@ -46,10 +46,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += -lrte_distributor > _LDLIBS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += -lrte_ip_frag > _LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lrte_meter > _LDLIBS-$(CONFIG_RTE_LIBRTE_LPM) += -lrte_lpm > -# librte_acl needs --whole-archive because of weak functions > -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += -lrte_acl > -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --no-whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --no-as-needed > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += -lrte_telemetry -ljansson > -- Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com> Tested-by: Konstantin Ananyev <konstantin.ananyev@intel.com> > 2.20.1 ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions 2019-04-10 14:57 ` Ananyev, Konstantin @ 2019-04-10 14:57 ` Ananyev, Konstantin 0 siblings, 0 replies; 25+ messages in thread From: Ananyev, Konstantin @ 2019-04-10 14:57 UTC (permalink / raw) To: Richardson, Bruce, aconole; +Cc: dev > -----Original Message----- > From: Richardson, Bruce > Sent: Wednesday, April 10, 2019 2:45 PM > To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; aconole@redhat.com > Cc: dev@dpdk.org; Richardson, Bruce <bruce.richardson@intel.com> > Subject: [PATCH 1/2] acl: remove use of weak functions > > Weak functions don't work well with static libraries and require the use of > "whole-archive" flag to ensure that the correct function is used when > linking. Since the weak functions are only used as placeholders within > this library alone, we can replace them with non-weak functions using > preprocessor ifdefs. > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> > --- > lib/librte_acl/meson.build | 7 ++++++- > lib/librte_acl/rte_acl.c | 18 ++++++++++++++---- > mk/rte.app.mk | 3 --- > 3 files changed, 20 insertions(+), 8 deletions(-) > > diff --git a/lib/librte_acl/meson.build b/lib/librte_acl/meson.build > index 2207dbafe..98ece7d85 100644 > --- a/lib/librte_acl/meson.build > +++ b/lib/librte_acl/meson.build > @@ -6,7 +6,7 @@ sources = files('acl_bld.c', 'acl_gen.c', 'acl_run_scalar.c', > 'rte_acl.c', 'tb_mem.c') > headers = files('rte_acl.h', 'rte_acl_osdep.h') > > -if arch_subdir == 'x86' > +if dpdk_conf.has('RTE_ARCH_X86') > sources += files('acl_run_sse.c') > > # compile AVX2 version if either: > @@ -28,4 +28,9 @@ if arch_subdir == 'x86' > cflags += '-DCC_AVX2_SUPPORT' > endif > > +elif dpdk_conf.has('RTE_ARCH_ARM') or dpdk_conf.has('RTE_ARCH_ARM64') > + cflags += '-flax-vector-conversions' > + sources += files('acl_run_neon.c') > +elif dpdk_conf.has('RTE_ARCH_PPC_64') > + sources += files('acl_run_altivec.c') > endif > diff --git a/lib/librte_acl/rte_acl.c b/lib/librte_acl/rte_acl.c > index c436a9bfd..fd5bd5e4e 100644 > --- a/lib/librte_acl/rte_acl.c > +++ b/lib/librte_acl/rte_acl.c > @@ -13,11 +13,13 @@ static struct rte_tailq_elem rte_acl_tailq = { > }; > EAL_REGISTER_TAILQ(rte_acl_tailq) > > +#ifndef RTE_ARCH_X86 > +#ifndef CC_AVX2_SUPPORT > /* > * If the compiler doesn't support AVX2 instructions, > * then the dummy one would be used instead for AVX2 classify method. > */ > -__rte_weak int > +int > rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -26,8 +28,9 @@ rte_acl_classify_avx2(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > -__rte_weak int > +int > rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -36,8 +39,11 @@ rte_acl_classify_sse(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > -__rte_weak int > +#ifndef RTE_ARCH_ARM > +#ifndef RTE_ARCH_ARM64 > +int > rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -46,8 +52,11 @@ rte_acl_classify_neon(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > +#endif > > -__rte_weak int > +#ifndef RTE_ARCH_PPC_64 > +int > rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, > __rte_unused const uint8_t **data, > __rte_unused uint32_t *results, > @@ -56,6 +65,7 @@ rte_acl_classify_altivec(__rte_unused const struct rte_acl_ctx *ctx, > { > return -ENOTSUP; > } > +#endif > > static const rte_acl_classify_t classify_fns[] = { > [RTE_ACL_CLASSIFY_DEFAULT] = rte_acl_classify_scalar, > diff --git a/mk/rte.app.mk b/mk/rte.app.mk > index 7d994bece..fdec636b4 100644 > --- a/mk/rte.app.mk > +++ b/mk/rte.app.mk > @@ -46,10 +46,7 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_DISTRIBUTOR) += -lrte_distributor > _LDLIBS-$(CONFIG_RTE_LIBRTE_IP_FRAG) += -lrte_ip_frag > _LDLIBS-$(CONFIG_RTE_LIBRTE_METER) += -lrte_meter > _LDLIBS-$(CONFIG_RTE_LIBRTE_LPM) += -lrte_lpm > -# librte_acl needs --whole-archive because of weak functions > -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += -lrte_acl > -_LDLIBS-$(CONFIG_RTE_LIBRTE_ACL) += --no-whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --no-as-needed > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += --whole-archive > _LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += -lrte_telemetry -ljansson > -- Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com> Tested-by: Konstantin Ananyev <konstantin.ananyev@intel.com> > 2.20.1 ^ permalink raw reply [flat|nested] 25+ messages in thread
* [dpdk-dev] [PATCH 2/2] bpf: remove use of weak functions 2019-04-10 13:45 [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson 2019-04-10 13:45 ` [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions Bruce Richardson @ 2019-04-10 13:45 ` Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson ` (2 more replies) 2019-05-27 14:13 ` [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries David Marchand 2019-06-05 14:41 ` Thomas Monjalon 4 siblings, 3 replies; 25+ messages in thread From: Bruce Richardson @ 2019-04-10 13:45 UTC (permalink / raw) To: konstantin.ananyev, aconole; +Cc: dev, Bruce Richardson Weak functions don't work well with static libraries and require the use of "whole-archive" flag to ensure that the correct function is used when linking. Since the weak function is only used as a placeholder within this library alone, we can replace it with a non-weak version protected using preprocessor ifdefs. Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- lib/librte_bpf/bpf_load.c | 4 +++- lib/librte_bpf/meson.build | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/librte_bpf/bpf_load.c b/lib/librte_bpf/bpf_load.c index d9d163b7d..194103ec7 100644 --- a/lib/librte_bpf/bpf_load.c +++ b/lib/librte_bpf/bpf_load.c @@ -131,7 +131,8 @@ rte_bpf_load(const struct rte_bpf_prm *prm) return bpf; } -__rte_experimental __rte_weak struct rte_bpf * +#ifndef RTE_LIBRTE_BPF_ELF +__rte_experimental struct rte_bpf * rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, const char *sname) { @@ -146,3 +147,4 @@ rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, rte_errno = ENOTSUP; return NULL; } +#endif diff --git a/lib/librte_bpf/meson.build b/lib/librte_bpf/meson.build index 8a79878ff..11c1fb558 100644 --- a/lib/librte_bpf/meson.build +++ b/lib/librte_bpf/meson.build @@ -20,6 +20,7 @@ deps += ['mbuf', 'net', 'ethdev'] dep = dependency('libelf', required: false) if dep.found() + dpdk_conf.set('RTE_LIBRTE_BPF_ELF', 1) sources += files('bpf_load_elf.c') ext_deps += dep endif -- 2.20.1 ^ permalink raw reply [flat|nested] 25+ messages in thread
* [dpdk-dev] [PATCH 2/2] bpf: remove use of weak functions 2019-04-10 13:45 ` [dpdk-dev] [PATCH 2/2] bpf: " Bruce Richardson @ 2019-04-10 13:45 ` Bruce Richardson 2019-04-10 14:07 ` Aaron Conole 2019-04-10 14:57 ` Ananyev, Konstantin 2 siblings, 0 replies; 25+ messages in thread From: Bruce Richardson @ 2019-04-10 13:45 UTC (permalink / raw) To: konstantin.ananyev, aconole; +Cc: dev, Bruce Richardson Weak functions don't work well with static libraries and require the use of "whole-archive" flag to ensure that the correct function is used when linking. Since the weak function is only used as a placeholder within this library alone, we can replace it with a non-weak version protected using preprocessor ifdefs. Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> --- lib/librte_bpf/bpf_load.c | 4 +++- lib/librte_bpf/meson.build | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/librte_bpf/bpf_load.c b/lib/librte_bpf/bpf_load.c index d9d163b7d..194103ec7 100644 --- a/lib/librte_bpf/bpf_load.c +++ b/lib/librte_bpf/bpf_load.c @@ -131,7 +131,8 @@ rte_bpf_load(const struct rte_bpf_prm *prm) return bpf; } -__rte_experimental __rte_weak struct rte_bpf * +#ifndef RTE_LIBRTE_BPF_ELF +__rte_experimental struct rte_bpf * rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, const char *sname) { @@ -146,3 +147,4 @@ rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, rte_errno = ENOTSUP; return NULL; } +#endif diff --git a/lib/librte_bpf/meson.build b/lib/librte_bpf/meson.build index 8a79878ff..11c1fb558 100644 --- a/lib/librte_bpf/meson.build +++ b/lib/librte_bpf/meson.build @@ -20,6 +20,7 @@ deps += ['mbuf', 'net', 'ethdev'] dep = dependency('libelf', required: false) if dep.found() + dpdk_conf.set('RTE_LIBRTE_BPF_ELF', 1) sources += files('bpf_load_elf.c') ext_deps += dep endif -- 2.20.1 ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] bpf: remove use of weak functions 2019-04-10 13:45 ` [dpdk-dev] [PATCH 2/2] bpf: " Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson @ 2019-04-10 14:07 ` Aaron Conole 2019-04-10 14:07 ` Aaron Conole 2019-04-10 14:27 ` Bruce Richardson 2019-04-10 14:57 ` Ananyev, Konstantin 2 siblings, 2 replies; 25+ messages in thread From: Aaron Conole @ 2019-04-10 14:07 UTC (permalink / raw) To: Bruce Richardson; +Cc: konstantin.ananyev, dev Bruce Richardson <bruce.richardson@intel.com> writes: > Weak functions don't work well with static libraries and require the use of > "whole-archive" flag to ensure that the correct function is used when > linking. Since the weak function is only used as a placeholder within this > library alone, we can replace it with a non-weak version protected using > preprocessor ifdefs. > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> > --- I agree with dropping the weak implementations. But, can't we adjust the order of objects when building with multiple strong definitions and the linker will choose the first? I know this works for the GNU linker. I do find this information to help support this statement: https://stackoverflow.com/questions/51656838/attribute-weak-and-static-libraries Unfortunately, I don't find anything in the C standard to govern entity precedence. This means it isn't something that works across linker implementations (but compatible implementations like clang will maintain that behavior). > lib/librte_bpf/bpf_load.c | 4 +++- > lib/librte_bpf/meson.build | 1 + > 2 files changed, 4 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_bpf/bpf_load.c b/lib/librte_bpf/bpf_load.c > index d9d163b7d..194103ec7 100644 > --- a/lib/librte_bpf/bpf_load.c > +++ b/lib/librte_bpf/bpf_load.c > @@ -131,7 +131,8 @@ rte_bpf_load(const struct rte_bpf_prm *prm) > return bpf; > } > > -__rte_experimental __rte_weak struct rte_bpf * > +#ifndef RTE_LIBRTE_BPF_ELF > +__rte_experimental struct rte_bpf * > rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, > const char *sname) > { > @@ -146,3 +147,4 @@ rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, > rte_errno = ENOTSUP; > return NULL; > } > +#endif > diff --git a/lib/librte_bpf/meson.build b/lib/librte_bpf/meson.build > index 8a79878ff..11c1fb558 100644 > --- a/lib/librte_bpf/meson.build > +++ b/lib/librte_bpf/meson.build > @@ -20,6 +20,7 @@ deps += ['mbuf', 'net', 'ethdev'] > > dep = dependency('libelf', required: false) > if dep.found() > + dpdk_conf.set('RTE_LIBRTE_BPF_ELF', 1) > sources += files('bpf_load_elf.c') > ext_deps += dep > endif ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] bpf: remove use of weak functions 2019-04-10 14:07 ` Aaron Conole @ 2019-04-10 14:07 ` Aaron Conole 2019-04-10 14:27 ` Bruce Richardson 1 sibling, 0 replies; 25+ messages in thread From: Aaron Conole @ 2019-04-10 14:07 UTC (permalink / raw) To: Bruce Richardson; +Cc: konstantin.ananyev, dev Bruce Richardson <bruce.richardson@intel.com> writes: > Weak functions don't work well with static libraries and require the use of > "whole-archive" flag to ensure that the correct function is used when > linking. Since the weak function is only used as a placeholder within this > library alone, we can replace it with a non-weak version protected using > preprocessor ifdefs. > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> > --- I agree with dropping the weak implementations. But, can't we adjust the order of objects when building with multiple strong definitions and the linker will choose the first? I know this works for the GNU linker. I do find this information to help support this statement: https://stackoverflow.com/questions/51656838/attribute-weak-and-static-libraries Unfortunately, I don't find anything in the C standard to govern entity precedence. This means it isn't something that works across linker implementations (but compatible implementations like clang will maintain that behavior). > lib/librte_bpf/bpf_load.c | 4 +++- > lib/librte_bpf/meson.build | 1 + > 2 files changed, 4 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_bpf/bpf_load.c b/lib/librte_bpf/bpf_load.c > index d9d163b7d..194103ec7 100644 > --- a/lib/librte_bpf/bpf_load.c > +++ b/lib/librte_bpf/bpf_load.c > @@ -131,7 +131,8 @@ rte_bpf_load(const struct rte_bpf_prm *prm) > return bpf; > } > > -__rte_experimental __rte_weak struct rte_bpf * > +#ifndef RTE_LIBRTE_BPF_ELF > +__rte_experimental struct rte_bpf * > rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, > const char *sname) > { > @@ -146,3 +147,4 @@ rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, > rte_errno = ENOTSUP; > return NULL; > } > +#endif > diff --git a/lib/librte_bpf/meson.build b/lib/librte_bpf/meson.build > index 8a79878ff..11c1fb558 100644 > --- a/lib/librte_bpf/meson.build > +++ b/lib/librte_bpf/meson.build > @@ -20,6 +20,7 @@ deps += ['mbuf', 'net', 'ethdev'] > > dep = dependency('libelf', required: false) > if dep.found() > + dpdk_conf.set('RTE_LIBRTE_BPF_ELF', 1) > sources += files('bpf_load_elf.c') > ext_deps += dep > endif ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] bpf: remove use of weak functions 2019-04-10 14:07 ` Aaron Conole 2019-04-10 14:07 ` Aaron Conole @ 2019-04-10 14:27 ` Bruce Richardson 2019-04-10 14:27 ` Bruce Richardson 1 sibling, 1 reply; 25+ messages in thread From: Bruce Richardson @ 2019-04-10 14:27 UTC (permalink / raw) To: Aaron Conole; +Cc: konstantin.ananyev, dev On Wed, Apr 10, 2019 at 10:07:33AM -0400, Aaron Conole wrote: > Bruce Richardson <bruce.richardson@intel.com> writes: > > > Weak functions don't work well with static libraries and require the use of > > "whole-archive" flag to ensure that the correct function is used when > > linking. Since the weak function is only used as a placeholder within this > > library alone, we can replace it with a non-weak version protected using > > preprocessor ifdefs. > > > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> > > --- > > I agree with dropping the weak implementations. > > But, can't we adjust the order of objects when building with multiple > strong definitions and the linker will choose the first? I know this > works for the GNU linker. > > I do find this information to help support this statement: > > https://stackoverflow.com/questions/51656838/attribute-weak-and-static-libraries > > Unfortunately, I don't find anything in the C standard to govern entity > precedence. This means it isn't something that works across linker > implementations (but compatible implementations like clang will maintain > that behavior). > It may be possible, but I'd be worried about the fragility of the support. Is it a good idea to have multiple implementations of a function in a .a file. Without running the resulting binary, we have no way of knowing the correct function was picked up. At least with the weak versions, we can see from nm what is used. /Bruce ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] bpf: remove use of weak functions 2019-04-10 14:27 ` Bruce Richardson @ 2019-04-10 14:27 ` Bruce Richardson 0 siblings, 0 replies; 25+ messages in thread From: Bruce Richardson @ 2019-04-10 14:27 UTC (permalink / raw) To: Aaron Conole; +Cc: konstantin.ananyev, dev On Wed, Apr 10, 2019 at 10:07:33AM -0400, Aaron Conole wrote: > Bruce Richardson <bruce.richardson@intel.com> writes: > > > Weak functions don't work well with static libraries and require the use of > > "whole-archive" flag to ensure that the correct function is used when > > linking. Since the weak function is only used as a placeholder within this > > library alone, we can replace it with a non-weak version protected using > > preprocessor ifdefs. > > > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> > > --- > > I agree with dropping the weak implementations. > > But, can't we adjust the order of objects when building with multiple > strong definitions and the linker will choose the first? I know this > works for the GNU linker. > > I do find this information to help support this statement: > > https://stackoverflow.com/questions/51656838/attribute-weak-and-static-libraries > > Unfortunately, I don't find anything in the C standard to govern entity > precedence. This means it isn't something that works across linker > implementations (but compatible implementations like clang will maintain > that behavior). > It may be possible, but I'd be worried about the fragility of the support. Is it a good idea to have multiple implementations of a function in a .a file. Without running the resulting binary, we have no way of knowing the correct function was picked up. At least with the weak versions, we can see from nm what is used. /Bruce ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] bpf: remove use of weak functions 2019-04-10 13:45 ` [dpdk-dev] [PATCH 2/2] bpf: " Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson 2019-04-10 14:07 ` Aaron Conole @ 2019-04-10 14:57 ` Ananyev, Konstantin 2019-04-10 14:57 ` Ananyev, Konstantin 2 siblings, 1 reply; 25+ messages in thread From: Ananyev, Konstantin @ 2019-04-10 14:57 UTC (permalink / raw) To: Richardson, Bruce, aconole; +Cc: dev > -----Original Message----- > From: Richardson, Bruce > Sent: Wednesday, April 10, 2019 2:45 PM > To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; aconole@redhat.com > Cc: dev@dpdk.org; Richardson, Bruce <bruce.richardson@intel.com> > Subject: [PATCH 2/2] bpf: remove use of weak functions > > Weak functions don't work well with static libraries and require the use of > "whole-archive" flag to ensure that the correct function is used when > linking. Since the weak function is only used as a placeholder within this > library alone, we can replace it with a non-weak version protected using > preprocessor ifdefs. > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> > --- > lib/librte_bpf/bpf_load.c | 4 +++- > lib/librte_bpf/meson.build | 1 + > 2 files changed, 4 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_bpf/bpf_load.c b/lib/librte_bpf/bpf_load.c > index d9d163b7d..194103ec7 100644 > --- a/lib/librte_bpf/bpf_load.c > +++ b/lib/librte_bpf/bpf_load.c > @@ -131,7 +131,8 @@ rte_bpf_load(const struct rte_bpf_prm *prm) > return bpf; > } > > -__rte_experimental __rte_weak struct rte_bpf * > +#ifndef RTE_LIBRTE_BPF_ELF > +__rte_experimental struct rte_bpf * > rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, > const char *sname) > { > @@ -146,3 +147,4 @@ rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, > rte_errno = ENOTSUP; > return NULL; > } > +#endif > diff --git a/lib/librte_bpf/meson.build b/lib/librte_bpf/meson.build > index 8a79878ff..11c1fb558 100644 > --- a/lib/librte_bpf/meson.build > +++ b/lib/librte_bpf/meson.build > @@ -20,6 +20,7 @@ deps += ['mbuf', 'net', 'ethdev'] > > dep = dependency('libelf', required: false) > if dep.found() > + dpdk_conf.set('RTE_LIBRTE_BPF_ELF', 1) > sources += files('bpf_load_elf.c') > ext_deps += dep > endif > -- Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com> Tested-by: Konstantin Ananyev <konstantin.ananyev@intel.com> > 2.20.1 ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] bpf: remove use of weak functions 2019-04-10 14:57 ` Ananyev, Konstantin @ 2019-04-10 14:57 ` Ananyev, Konstantin 0 siblings, 0 replies; 25+ messages in thread From: Ananyev, Konstantin @ 2019-04-10 14:57 UTC (permalink / raw) To: Richardson, Bruce, aconole; +Cc: dev > -----Original Message----- > From: Richardson, Bruce > Sent: Wednesday, April 10, 2019 2:45 PM > To: Ananyev, Konstantin <konstantin.ananyev@intel.com>; aconole@redhat.com > Cc: dev@dpdk.org; Richardson, Bruce <bruce.richardson@intel.com> > Subject: [PATCH 2/2] bpf: remove use of weak functions > > Weak functions don't work well with static libraries and require the use of > "whole-archive" flag to ensure that the correct function is used when > linking. Since the weak function is only used as a placeholder within this > library alone, we can replace it with a non-weak version protected using > preprocessor ifdefs. > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com> > --- > lib/librte_bpf/bpf_load.c | 4 +++- > lib/librte_bpf/meson.build | 1 + > 2 files changed, 4 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_bpf/bpf_load.c b/lib/librte_bpf/bpf_load.c > index d9d163b7d..194103ec7 100644 > --- a/lib/librte_bpf/bpf_load.c > +++ b/lib/librte_bpf/bpf_load.c > @@ -131,7 +131,8 @@ rte_bpf_load(const struct rte_bpf_prm *prm) > return bpf; > } > > -__rte_experimental __rte_weak struct rte_bpf * > +#ifndef RTE_LIBRTE_BPF_ELF > +__rte_experimental struct rte_bpf * > rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, > const char *sname) > { > @@ -146,3 +147,4 @@ rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, > rte_errno = ENOTSUP; > return NULL; > } > +#endif > diff --git a/lib/librte_bpf/meson.build b/lib/librte_bpf/meson.build > index 8a79878ff..11c1fb558 100644 > --- a/lib/librte_bpf/meson.build > +++ b/lib/librte_bpf/meson.build > @@ -20,6 +20,7 @@ deps += ['mbuf', 'net', 'ethdev'] > > dep = dependency('libelf', required: false) > if dep.found() > + dpdk_conf.set('RTE_LIBRTE_BPF_ELF', 1) > sources += files('bpf_load_elf.c') > ext_deps += dep > endif > -- Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com> Tested-by: Konstantin Ananyev <konstantin.ananyev@intel.com> > 2.20.1 ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries 2019-04-10 13:45 [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries Bruce Richardson ` (2 preceding siblings ...) 2019-04-10 13:45 ` [dpdk-dev] [PATCH 2/2] bpf: " Bruce Richardson @ 2019-05-27 14:13 ` David Marchand 2019-05-27 15:41 ` Bruce Richardson 2019-06-05 14:41 ` Thomas Monjalon 4 siblings, 1 reply; 25+ messages in thread From: David Marchand @ 2019-05-27 14:13 UTC (permalink / raw) To: Bruce Richardson; +Cc: Ananyev, Konstantin, Aaron Conole, dev Hello, On Wed, Apr 10, 2019 at 3:45 PM Bruce Richardson <bruce.richardson@intel.com> wrote: > Weak functions don't work well with static library builds as the linker > always picks the first version of a function irrespective of whether it is > weak or not. The solution to this is to use the "whole-archive" flag when > linking, but this has the nasty side-effect that it causes the resulting > binary to be larger than it needs to be. > > > A further problem with this approach of using "whole-archive" is that one > either needs to link all libraries with this flag or track what libraries > need it or not - the latter being especially a problem for apps not using > the DPDK build system itself (i.e. most apps not shipped with DPDK itself). > For meson builds this information needs to make its way all the way through > to the pkgconfig file generated - not a trivial undertaking. > > Thankfully, though, the use of weak functions is limited to use for > multiple functions within a single library, meaning that when the lib is > being built, the build system itself can know whether the "weak" function > is needed or not. This allows us to change the weak function to a > conditionally compiled regular function used in fallback case. This makes > the need for "whole-archive" flag, and any special linking measures for the > library, go away. > > [This set does not touch the drivers, only the libraries, since there are > other special linker flags needed for drivers in general, making the > problem less severe for driver .a files.] > > Was there something preventing this patchset from getting merged ? -- David Marchand ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries 2019-05-27 14:13 ` [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries David Marchand @ 2019-05-27 15:41 ` Bruce Richardson 2019-05-27 20:57 ` Aaron Conole 0 siblings, 1 reply; 25+ messages in thread From: Bruce Richardson @ 2019-05-27 15:41 UTC (permalink / raw) To: David Marchand; +Cc: Ananyev, Konstantin, Aaron Conole, dev On Mon, May 27, 2019 at 04:13:53PM +0200, David Marchand wrote: > Hello, > On Wed, Apr 10, 2019 at 3:45 PM Bruce Richardson > <[1]bruce.richardson@intel.com> wrote: > > Weak functions don't work well with static library builds as the > linker > always picks the first version of a function irrespective of whether > it is > weak or not. The solution to this is to use the "whole-archive" flag > when > linking, but this has the nasty side-effect that it causes the > resulting > binary to be larger than it needs to be. > A further problem with this approach of using "whole-archive" is > that one > either needs to link all libraries with this flag or track what > libraries > need it or not - the latter being especially a problem for apps not > using > the DPDK build system itself (i.e. most apps not shipped with DPDK > itself). > For meson builds this information needs to make its way all the way > through > to the pkgconfig file generated - not a trivial undertaking. > Thankfully, though, the use of weak functions is limited to use for > multiple functions within a single library, meaning that when the > lib is > being built, the build system itself can know whether the "weak" > function > is needed or not. This allows us to change the weak function to a > conditionally compiled regular function used in fallback case. This > makes > the need for "whole-archive" flag, and any special linking measures > for the > library, go away. > [This set does not touch the drivers, only the libraries, since > there are > other special linker flags needed for drivers in general, making the > problem less severe for driver .a files.] > > Was there something preventing this patchset from getting merged ? > -- > David Marchand > I believe Aaron Conole had some changes in the same area and was looking to roll these changes into a bigger patchset of his. Aaron, can you please confirm? /Bruce ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries 2019-05-27 15:41 ` Bruce Richardson @ 2019-05-27 20:57 ` Aaron Conole 2019-05-28 8:06 ` Bruce Richardson 0 siblings, 1 reply; 25+ messages in thread From: Aaron Conole @ 2019-05-27 20:57 UTC (permalink / raw) To: Bruce Richardson; +Cc: David Marchand, Ananyev, Konstantin, dev Bruce Richardson <bruce.richardson@intel.com> writes: > On Mon, May 27, 2019 at 04:13:53PM +0200, David Marchand wrote: >> Hello, >> On Wed, Apr 10, 2019 at 3:45 PM Bruce Richardson >> <[1]bruce.richardson@intel.com> wrote: >> >> Weak functions don't work well with static library builds as the >> linker >> always picks the first version of a function irrespective of whether >> it is >> weak or not. The solution to this is to use the "whole-archive" flag >> when >> linking, but this has the nasty side-effect that it causes the >> resulting >> binary to be larger than it needs to be. >> A further problem with this approach of using "whole-archive" is >> that one >> either needs to link all libraries with this flag or track what >> libraries >> need it or not - the latter being especially a problem for apps not >> using >> the DPDK build system itself (i.e. most apps not shipped with DPDK >> itself). >> For meson builds this information needs to make its way all the way >> through >> to the pkgconfig file generated - not a trivial undertaking. >> Thankfully, though, the use of weak functions is limited to use for >> multiple functions within a single library, meaning that when the >> lib is >> being built, the build system itself can know whether the "weak" >> function >> is needed or not. This allows us to change the weak function to a >> conditionally compiled regular function used in fallback case. This >> makes >> the need for "whole-archive" flag, and any special linking measures >> for the >> library, go away. >> [This set does not touch the drivers, only the libraries, since >> there are >> other special linker flags needed for drivers in general, making the >> problem less severe for driver .a files.] >> >> Was there something preventing this patchset from getting merged ? >> -- >> David Marchand >> > I believe Aaron Conole had some changes in the same area and was looking to > roll these changes into a bigger patchset of his. Aaron, can you please > confirm? Yes - Sorry the patches are in my queue. Maybe it just makes sense to merge these though? > /Bruce ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries 2019-05-27 20:57 ` Aaron Conole @ 2019-05-28 8:06 ` Bruce Richardson 0 siblings, 0 replies; 25+ messages in thread From: Bruce Richardson @ 2019-05-28 8:06 UTC (permalink / raw) To: Aaron Conole; +Cc: David Marchand, Ananyev, Konstantin, dev On Mon, May 27, 2019 at 04:57:15PM -0400, Aaron Conole wrote: > Bruce Richardson <bruce.richardson@intel.com> writes: > > > On Mon, May 27, 2019 at 04:13:53PM +0200, David Marchand wrote: > >> Hello, > >> On Wed, Apr 10, 2019 at 3:45 PM Bruce Richardson > >> <[1]bruce.richardson@intel.com> wrote: > >> > >> Weak functions don't work well with static library builds as the > >> linker > >> always picks the first version of a function irrespective of whether > >> it is > >> weak or not. The solution to this is to use the "whole-archive" flag > >> when > >> linking, but this has the nasty side-effect that it causes the > >> resulting > >> binary to be larger than it needs to be. > >> A further problem with this approach of using "whole-archive" is > >> that one > >> either needs to link all libraries with this flag or track what > >> libraries > >> need it or not - the latter being especially a problem for apps not > >> using > >> the DPDK build system itself (i.e. most apps not shipped with DPDK > >> itself). > >> For meson builds this information needs to make its way all the way > >> through > >> to the pkgconfig file generated - not a trivial undertaking. > >> Thankfully, though, the use of weak functions is limited to use for > >> multiple functions within a single library, meaning that when the > >> lib is > >> being built, the build system itself can know whether the "weak" > >> function > >> is needed or not. This allows us to change the weak function to a > >> conditionally compiled regular function used in fallback case. This > >> makes > >> the need for "whole-archive" flag, and any special linking measures > >> for the > >> library, go away. > >> [This set does not touch the drivers, only the libraries, since > >> there are > >> other special linker flags needed for drivers in general, making the > >> problem less severe for driver .a files.] > >> > >> Was there something preventing this patchset from getting merged ? > >> -- > >> David Marchand > >> > > I believe Aaron Conole had some changes in the same area and was looking to > > roll these changes into a bigger patchset of his. Aaron, can you please > > confirm? > > Yes - Sorry the patches are in my queue. Maybe it just makes sense to > merge these though? > Funnily enough, I've no objections to that :-) ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries 2019-04-10 13:45 [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries Bruce Richardson ` (3 preceding siblings ...) 2019-05-27 14:13 ` [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries David Marchand @ 2019-06-05 14:41 ` Thomas Monjalon 4 siblings, 0 replies; 25+ messages in thread From: Thomas Monjalon @ 2019-06-05 14:41 UTC (permalink / raw) To: Bruce Richardson; +Cc: dev, konstantin.ananyev, aconole 10/04/2019 15:45, Bruce Richardson: > Weak functions don't work well with static library builds as the linker > always picks the first version of a function irrespective of whether it is > weak or not. The solution to this is to use the "whole-archive" flag when > linking, but this has the nasty side-effect that it causes the resulting > binary to be larger than it needs to be. > > > A further problem with this approach of using "whole-archive" is that one > either needs to link all libraries with this flag or track what libraries > need it or not - the latter being especially a problem for apps not using > the DPDK build system itself (i.e. most apps not shipped with DPDK itself). > For meson builds this information needs to make its way all the way through > to the pkgconfig file generated - not a trivial undertaking. > > Thankfully, though, the use of weak functions is limited to use for > multiple functions within a single library, meaning that when the lib is > being built, the build system itself can know whether the "weak" function > is needed or not. This allows us to change the weak function to a > conditionally compiled regular function used in fallback case. This makes > the need for "whole-archive" flag, and any special linking measures for the > library, go away. > > [This set does not touch the drivers, only the libraries, since there are > other special linker flags needed for drivers in general, making the > problem less severe for driver .a files.] > > Bruce Richardson (2): > acl: remove use of weak functions > bpf: remove use of weak functions Applied, thanks ^ permalink raw reply [flat|nested] 25+ messages in thread
end of thread, other threads:[~2019-06-05 14:41 UTC | newest] Thread overview: 25+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-04-10 13:45 [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson 2019-04-10 13:45 ` [dpdk-dev] [PATCH 1/2] acl: remove use of weak functions Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson 2019-04-10 13:54 ` Aaron Conole 2019-04-10 13:54 ` Aaron Conole 2019-04-10 14:02 ` Bruce Richardson 2019-04-10 14:02 ` Bruce Richardson 2019-04-10 14:08 ` Aaron Conole 2019-04-10 14:08 ` Aaron Conole 2019-04-10 14:57 ` Ananyev, Konstantin 2019-04-10 14:57 ` Ananyev, Konstantin 2019-04-10 13:45 ` [dpdk-dev] [PATCH 2/2] bpf: " Bruce Richardson 2019-04-10 13:45 ` Bruce Richardson 2019-04-10 14:07 ` Aaron Conole 2019-04-10 14:07 ` Aaron Conole 2019-04-10 14:27 ` Bruce Richardson 2019-04-10 14:27 ` Bruce Richardson 2019-04-10 14:57 ` Ananyev, Konstantin 2019-04-10 14:57 ` Ananyev, Konstantin 2019-05-27 14:13 ` [dpdk-dev] [PATCH 0/2] remove use of weak functions from libraries David Marchand 2019-05-27 15:41 ` Bruce Richardson 2019-05-27 20:57 ` Aaron Conole 2019-05-28 8:06 ` Bruce Richardson 2019-06-05 14:41 ` Thomas Monjalon
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).