From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D92A1A0588; Thu, 16 Apr 2020 08:08:16 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 159CC1DAAF; Thu, 16 Apr 2020 08:08:16 +0200 (CEST) Received: from mail-io1-f65.google.com (mail-io1-f65.google.com [209.85.166.65]) by dpdk.org (Postfix) with ESMTP id 3FF081DA90 for ; Thu, 16 Apr 2020 08:08:14 +0200 (CEST) Received: by mail-io1-f65.google.com with SMTP id f19so19824436iog.5 for ; Wed, 15 Apr 2020 23:08:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=zS1LcIBa+pJ2s8t0sbEx1HYLfdHMtXFR+PTWEvmt4ho=; b=JKlVcihMy3M4sa9PvwY1x7dC9OowGAcQ948NIvWyo9QRTbuwU38wNa8xoxrsN1+I5l 2zmLInwwyVQcjywD6frUhMDN1TlzlvuHojBkCQu9Q+V2Rkfjl7zp78566gSi+//9k4+Z JSwn9Z6IeTklm+2y8k1WOGYUo0L0cO/yr4fN/3Aqzhfe3/oInTwTgSmBztOr1x5FclbB /MypjzbUEkB6Da/1YwwSi9oD5gWxQSskdIWXQadoHAyFtj8KKUX42FRnAU/TjvggqkIi OlGedijBnq9EvXw1hRXnoJTxFAQabNVp0mqDTQgVB31Zhs/Wp/siPnPM/g2xhY0Ou2Hk 5RwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=zS1LcIBa+pJ2s8t0sbEx1HYLfdHMtXFR+PTWEvmt4ho=; b=R6dnOBOEGEIsO7an8TeSsw6CCNPJd2+XsyCV8BCNr6CuMejZJn/WATo3knJqtsgsWU hXpElWE8X9ARPeOiwBOe+Zasom7leFb5j/djZO0nrbyysj4ojFlN0m7do1kSKTYDYW+T S58/eE2VBUBn71WGmNAOtBDI8pAL1ZJw072pE552eR2EsBeMkc1lnDD/tQZ/ALYy5I0m vAxaMERuPSwThFN+gJepqIJTWUNIAF4Vic2LLa621u5dhlvpzdjFsv+vllYdqyFryPf2 p0x7V14wWAeYK9ASBtyDFzztKi795jVrt5yYuuxC14uNGSfTBbe0UiAo3VBDeFElx86V KReg== X-Gm-Message-State: AGi0PuaaEBtzpZstO6gIjt/8i3VKoII9UH/W56bXYIKBA/LhZT418tbV bZxBkrft57i7FSX9V2WQgfXMeFpFycqllBiMV9k= X-Google-Smtp-Source: APiQypKwJk0W+m7wjPqnbToisQUx4WcMAGtgjcSJUo38UQKwvDq9zQtH0A2RFbFyfcP4tppN+8afb8HTpGiQXoR9iBw= X-Received: by 2002:a02:ac94:: with SMTP id x20mr28601245jan.133.1587017293286; Wed, 15 Apr 2020 23:08:13 -0700 (PDT) MIME-Version: 1.0 References: <20200415231119.27845-1-dg@adax.com> In-Reply-To: <20200415231119.27845-1-dg@adax.com> From: Jerin Jacob Date: Thu, 16 Apr 2020 11:37:57 +0530 Message-ID: To: Dan Gora Cc: Thomas Monjalon , =?UTF-8?Q?Mattias_R=C3=B6nnblom?= , David Marchand , dpdk-dev , Gavin Hu , Honnappa Nagarahalli Content-Type: text/plain; charset="UTF-8" Subject: Re: [dpdk-dev] [PATCH] eal: choose initial PRNG seed source at runtime X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Thu, Apr 16, 2020 at 4:42 AM Dan Gora wrote: > > Instead of choosing to use getentropy() or the rdseed instruction for > the random number generator entropy source using compilation flags, > determine the best source at run time. > > This is accomplished by defining a weak symbol for getentropy(), > checking that the compiler can generate the rdseed instruction even if > the compilation platform does not natively support it, and checking for > the availability of the rdseed instruction on the execution platform > using rte_cpu_get_flag_enabled(). > > If neither getentropy() or rdseed is available, rte_get_timer_cycles() > will be continue to be used as the entropy source. > > This also allows non-Mason builds to use getentropy(). > > Signed-off-by: Dan Gora > --- > config/x86/meson.build | 7 +++++++ > lib/librte_eal/common/rte_random.c | 29 ++++++++++++++++++++++++----- > lib/librte_eal/meson.build | 3 --- > mk/rte.cpuflags.mk | 8 ++++++++ > 4 files changed, 39 insertions(+), 8 deletions(-) > > diff --git a/config/x86/meson.build b/config/x86/meson.build > index adc857ba2..214b16f2a 100644 > --- a/config/x86/meson.build > +++ b/config/x86/meson.build > @@ -20,6 +20,13 @@ 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) > diff --git a/lib/librte_eal/common/rte_random.c b/lib/librte_eal/common/rte_random.c > index 57ec8fb2b..40f8b5aab 100644 > --- a/lib/librte_eal/common/rte_random.c > +++ b/lib/librte_eal/common/rte_random.c > @@ -25,6 +25,8 @@ struct rte_rand_state { > > static struct rte_rand_state rand_states[RTE_MAX_LCORE]; > > +__rte_weak int getentropy(void *__buffer, size_t __length); > + > static uint32_t > __rte_rand_lcg32(uint32_t *seed) > { > @@ -176,10 +178,24 @@ rte_rand_max(uint64_t upper_bound) > return res; > } > > +/* Use rte_get_timer_cycles() if the system does not have > + * genentropy() or the rdseed instruction. > + */ > +__rte_weak int > +getentropy(void *__buffer, size_t __length __rte_unused) > +{ > + uint64_t *ge_seed = __buffer; > +#ifdef RTE_MACHINE_CPUFLAG_RDSEED > + if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_RDSEED)) > + return -1; > +#endif > + *ge_seed = rte_get_timer_cycles(); > + return 0; IMO, we need to create a new arch EAL abstraction to get uint64_t random number. Reason being: 1) ARMv8.5 supports similar instruction https://developer.arm.com/docs/ddi0595/c/aarch64-system-registers/rndr 2) Avoid #ifdef clutter in common code. Abstraction can return a random uint64_t number. Based on the arch capabilities, it can hook to specialized instruction or rte_get_timer_cycles()