On 2020-04-21 21:54, Dan Gora wrote: > Instead of enabling the rdseed instruction for the random number generator > entropy source at compilation time, determine if the instruction can be > used at run time. > > The DPDK build is updated to check that the compiler can generate the > rdseed instruction even if the compilation platform does not natively > support it. If so, the -mrdseed flag is explicitly added. This allows > binaries compiled on systems which do not support the rdseed instruction > to use the instruction if the execution platform supports it. > > At run-time on x86, __rte_random_initial_seed() will check for the > availability of the rdseed instruction on the execution platform using > rte_cpu_get_flag_enabled(). This allows binaries which were compiled on > systems which support the rdseed instruction to run on x86 CPUs which do > not support the rdseed instruction. > > RTE_CPUFLAG_RDSEED is removed from the list of RTE_COMPILE_TIME_CPUFLAGS > which are checked in rte_eal_init() at run time because it is no longer > required to match the compilation system. > > Signed-off-by: Dan Gora <d...@adax.com> > --- > config/x86/meson.build | 11 ++++++++--- > lib/librte_eal/common/rte_random.c | 19 +++++++++++-------- > mk/rte.cpuflags.mk | 9 +++++++-- > 3 files changed, 26 insertions(+), 13 deletions(-) > > diff --git a/config/x86/meson.build b/config/x86/meson.build > index adc857ba2..9491fad3a 100644 > --- a/config/x86/meson.build > +++ b/config/x86/meson.build > @@ -20,15 +20,20 @@ if cc.get_define('__SSE4_2__', args: machine_args) == '' > machine_args += '-msse4' > endif > > +# set -mrdseed if necessary so _rdseed32_step compiles if the > +# compilation host does not support the RDSEED instruction. > +if cc.get_define('__RDSEED__', args: machine_args) == '' and > cc.has_argument('-mrdseed') > + machine_args += '-mrdseed' > + message('RDSEED not enabled by default, explicitly setting -mrdseed') > +endif > + > base_flags = ['SSE', 'SSE2', 'SSE3','SSSE3', 'SSE4_1', 'SSE4_2'] > foreach f:base_flags > dpdk_conf.set('RTE_MACHINE_CPUFLAG_' + f, 1) > compile_time_cpuflags += ['RTE_CPUFLAG_' + f] > endforeach > > -optional_flags = ['AES', 'PCLMUL', > - 'AVX', 'AVX2', 'AVX512F', > - 'RDRND', 'RDSEED'] > +optional_flags = ['AES', 'PCLMUL', 'AVX', 'AVX2', 'AVX512F', 'RDRND'] > foreach f:optional_flags > if cc.get_define('__@0@__'.format(f), args: machine_args) == '1' > if f == 'PCLMUL' # special case flags with different defines > diff --git a/lib/librte_eal/common/rte_random.c > b/lib/librte_eal/common/rte_random.c > index 57ec8fb2b..df02f1307 100644 > --- a/lib/librte_eal/common/rte_random.c > +++ b/lib/librte_eal/common/rte_random.c > @@ -2,7 +2,7 @@ > * Copyright(c) 2019 Ericsson AB > */ > > -#ifdef RTE_MACHINE_CPUFLAG_RDSEED > +#if defined(RTE_ARCH_X86) > #include <x86intrin.h> > #endif > #include <stdlib.h> > @@ -188,14 +188,17 @@ __rte_random_initial_seed(void) > if (ge_rc == 0) > return ge_seed; > #endif > -#ifdef RTE_MACHINE_CPUFLAG_RDSEED > - unsigned int rdseed_low; > - unsigned int rdseed_high; > - > +#if defined(RTE_ARCH_X86) > /* first fallback: rdseed instruction, if available */ > - if (_rdseed32_step(&rdseed_low) == 1 && > - _rdseed32_step(&rdseed_high) == 1) > - return (uint64_t)rdseed_low | ((uint64_t)rdseed_high << 32); > + if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_RDSEED)) { > + unsigned int rdseed_low; > + unsigned int rdseed_high; > + > + if (_rdseed32_step(&rdseed_low) == 1 && > + _rdseed32_step(&rdseed_high) == 1) > + return (uint64_t)rdseed_low | > + ((uint64_t)rdseed_high << 32); > + } > #endif > /* second fallback: seed using rdtsc */ > return rte_get_timer_cycles(); > diff --git a/mk/rte.cpuflags.mk b/mk/rte.cpuflags.mk > index fa8753531..a114e9c02 100644 > --- a/mk/rte.cpuflags.mk > +++ b/mk/rte.cpuflags.mk > @@ -51,8 +51,13 @@ ifneq ($(filter $(AUTO_CPUFLAGS),__RDRND__),) > CPUFLAGS += RDRAND > endif > > -ifneq ($(filter $(AUTO_CPUFLAGS),__RDSEED__),) > -CPUFLAGS += RDSEED > +ifeq ($(filter $(AUTO_CPUFLAGS),__RDSEED__),) > +# If the native environment doesn't define __RDSEED__, see > +# if the compiler supports -mrdseed. > +RDSEED_CPUFLAGS := $(shell $(CC) $(MACHINE_CFLAGS) $(WERROR_FLAGS) > $(EXTRA_CFLAGS) -mrdseed -dM -E - < /dev/null) > +ifneq ($(filter $(RDSEED_CPUFLAGS),__RDSEED__),) > +MACHINE_CFLAGS += -mrdseed > +endif > endif > > ifneq ($(filter $(AUTO_CPUFLAGS),__FSGSBASE__),)
I don't know enough about the build system to have any opinions on those changes, but otherwise Acked-by: Mattias Rönnblom <mattias.ronnb...@ericsson.com>