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>


Reply via email to