From: "Mattias Rönnblom" <mattias.ronnblom@ericsson.com>
To: Dan Gora <dg@adax.com>, "dev@dpdk.org" <dev@dpdk.org>,
Thomas Monjalon <thomas@monjalon.net>
Cc: David Marchand <david.marchand@redhat.com>,
Jerin Jacob <jerinjacobk@gmail.com>
Subject: Re: [dpdk-dev] [PATCH 1/2] eal: check for rdseed at run time for random seed
Date: Wed, 22 Apr 2020 08:22:31 +0000 [thread overview]
Message-ID: <704cc8b0-70ad-a1d0-1847-f92fce728128@ericsson.com> (raw)
In-Reply-To: <20200421195446.1730-2-dg@adax.com>
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 <dg@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.ronnblom@ericsson.com>
next prev parent reply other threads:[~2020-04-22 8:22 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-21 19:54 [dpdk-dev] [PATCH 0/2] eal: choose initial PRNG seed source at runtime Dan Gora
2020-04-21 19:54 ` [dpdk-dev] [PATCH 1/2] eal: check for rdseed at run time for random seed Dan Gora
2020-04-22 8:22 ` Mattias Rönnblom [this message]
2020-04-21 19:54 ` [dpdk-dev] [PATCH 2/2] eal: resolve getentropy " Dan Gora
2020-04-21 21:03 ` Stephen Hemminger
2020-04-21 21:08 ` Dan Gora
2020-04-22 8:28 ` Mattias Rönnblom
2020-04-22 17:44 ` Dan Gora
2020-04-22 20:14 ` Mattias Rönnblom
2020-04-22 20:35 ` Dan Gora
2020-04-23 10:04 ` Luca Boccassi
2020-04-23 17:38 ` Dan Gora
2020-04-27 12:44 ` Luca Boccassi
2020-04-27 16:57 ` Dan Gora
2020-04-30 8:41 ` Luca Boccassi
2020-04-30 20:43 ` Dan Gora
2020-05-01 10:33 ` Luca Boccassi
2020-05-01 21:05 ` Dan Gora
2020-05-04 8:04 ` Mattias Rönnblom
2020-05-04 14:13 ` Dan Gora
2020-05-04 14:19 ` Dan Gora
2020-06-02 5:10 ` Dan Gora
2020-06-09 15:37 ` Dan Gora
2020-06-10 8:15 ` Thomas Monjalon
2020-06-10 8:33 ` Luca Boccassi
2023-06-12 15:55 ` Stephen Hemminger
2020-06-10 8:07 ` Thomas Monjalon
2020-04-23 12:36 ` Mattias Rönnblom
2020-04-23 17:27 ` Dan Gora
2020-04-21 20:41 ` [dpdk-dev] [PATCH v2 0/2] eal: choose initial PRNG seed source at runtime Dan Gora
2020-04-21 20:41 ` [dpdk-dev] [PATCH v2 1/2] eal: check for rdseed at run time for random seed Dan Gora
2020-04-21 20:41 ` [dpdk-dev] [PATCH v2 2/2] eal: resolve getentropy " Dan Gora
2020-04-22 18:15 ` [dpdk-dev] [PATCH v3 0/2] eal: choose initial PRNG seed source at runtime Dan Gora
2020-04-22 18:15 ` [dpdk-dev] [PATCH v3 1/2] eal: check for rdseed at run time for random seed Dan Gora
2020-04-22 18:15 ` [dpdk-dev] [PATCH v3 2/2] eal: resolve getentropy " Dan Gora
2020-04-22 23:42 ` [dpdk-dev] [PATCH v4 0/2] eal: choose initial PRNG seed source at runtime Dan Gora
2020-04-22 23:42 ` [dpdk-dev] [PATCH v4 1/2] eal: check for rdseed at run time for random seed Dan Gora
2020-04-22 23:42 ` [dpdk-dev] [PATCH v4 2/2] eal: emulate glibc getentropy for initial " Dan Gora
2020-04-23 2:39 ` Stephen Hemminger
2020-04-23 17:42 ` Dan Gora
2020-06-29 9:30 ` Mattias Rönnblom
2020-06-29 17:57 ` Dan Gora
2020-06-29 20:57 ` Mattias Rönnblom
2020-06-29 9:32 ` [dpdk-dev] [PATCH v4 0/2] eal: choose initial PRNG seed source at runtime Mattias Rönnblom
2020-06-29 18:01 ` Dan Gora
2020-06-29 18:04 ` Dan Gora
2020-06-29 21:05 ` Mattias Rönnblom
2020-06-29 21:14 ` Dan Gora
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=704cc8b0-70ad-a1d0-1847-f92fce728128@ericsson.com \
--to=mattias.ronnblom@ericsson.com \
--cc=david.marchand@redhat.com \
--cc=dev@dpdk.org \
--cc=dg@adax.com \
--cc=jerinjacobk@gmail.com \
--cc=thomas@monjalon.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).