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 8173BA04DB; Wed, 14 Oct 2020 20:00:09 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1BA351DA57; Wed, 14 Oct 2020 20:00:08 +0200 (CEST) Received: from mail-io1-f68.google.com (mail-io1-f68.google.com [209.85.166.68]) by dpdk.org (Postfix) with ESMTP id 23BAE1DA4C for ; Wed, 14 Oct 2020 20:00:07 +0200 (CEST) Received: by mail-io1-f68.google.com with SMTP id n6so11443ioc.12 for ; Wed, 14 Oct 2020 11:00:07 -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=I0b7nCfCfVUmbsEadpCoo4Br0bsa3DCvgoXgsNbn0Bw=; b=iReIxOXiCchZS0JtIAsfaFEdB+lbn/7pq+XvUP2y6/pSxzbPOBdY7XbItzW8Asjwpv J9TdO1OkouWU1uTdiJuU72LbQpVKjOoBxQllldgdFVeQ5oVC9TM5IpeELb1ilM6WMkrb RrM4SWiLIdkZ/ZY483X1QBAxJtYKErMj/AuD58dN1Ug1tMw13G6m3J2L/cRy/dPMZIP0 nVNAJameECGMtjdagVsvObdCVi0OVrNStRseRWy14xQYahMwn1pzM6xvLu4ixPjxNmUC O8wLfO2vsLZFHQa96HIf6TrhxMoe3ElSyJyCvsd7s+UbxjziJxLpUfPtobA/kBJvgUzH CNzQ== 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=I0b7nCfCfVUmbsEadpCoo4Br0bsa3DCvgoXgsNbn0Bw=; b=XZTXevGXl7hfxu7f24HCQdDh45PZjIxYUk1m+215CKrUoC9Eji4ny0B8xEohDCaI6a dwhahhQvIKXxj/Wqv8wqCsrOKz2VbQWXBqWP384VuayEfNhoxMQHGey/8CMto6yhXTuj 7YcjzdVIvCjktMxpYjeeDXWW3NhFHd0kF9ObzsrIcsnAv+oH99alvxxBlZ6XcD29+rMI kr5oFKyPc3xkUoBp3kG9yBenrkRYZwdw4BtDl7ECzF1GO9Nd6540zBtQBJaOhw4muB5F TgNvOg+07k0qq+vmGAxVmSmFy0gCSJm8Z+n+5kL5m/f1+GhsGb/jlmHLimUtqH6hdCnX KP/g== X-Gm-Message-State: AOAM533H7R1zLdO0hH8+sfmHD/xeRAqv5Ukz9HiXTGFJ8YvHydFmdaQg aNPMfC4Qx/O2xLQZmAhhTx1BAKT56YnEzYRDKO4= X-Google-Smtp-Source: ABdhPJz/gdTSIUuJ8c0V3A/kHrCRS4vtFGSrVL5mGWMyDuixp2VfqfZcYA/Hhtngfz3irgtt3KoZImyqfHPOiLJkyyg= X-Received: by 2002:a05:6638:98:: with SMTP id v24mr543872jao.113.1602698405415; Wed, 14 Oct 2020 11:00:05 -0700 (PDT) MIME-Version: 1.0 References: <532f45c5d79b4c30a919553d322bb66e91534466.1602258833.git.anatoly.burakov@intel.com> In-Reply-To: From: Jerin Jacob Date: Wed, 14 Oct 2020 23:29:48 +0530 Message-ID: To: Anatoly Burakov Cc: dpdk-dev , Jan Viktorin , Ruifeng Wang , David Christensen , Ray Kinsella , Neil Horman , Bruce Richardson , Konstantin Ananyev , David Hunt , Liang Ma , Thomas Monjalon , "McDaniel, Timothy" , Gage Eads , chris.macnamara@intel.com Content-Type: text/plain; charset="UTF-8" Subject: Re: [dpdk-dev] [PATCH v6 03/10] eal: add intrinsics support check infrastructure 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 Wed, Oct 14, 2020 at 7:00 PM Anatoly Burakov wrote: > > Currently, it is not possible to check support for intrinsics that > are platform-specific, cannot be abstracted in a generic way, or do not > have support on all architectures. The CPUID flags can be used to some > extent, but they are only defined for their platform, while intrinsics > will be available to all code as they are in generic headers. > > This patch introduces infrastructure to check support for certain > platform-specific intrinsics, and adds support for checking support for > IA power management-related intrinsics for UMWAIT/UMONITOR and TPAUSE. > > Signed-off-by: Anatoly Burakov > Acked-by: David Christensen Acked-by: Jerin Jacob > --- > > Notes: > v6: > - Fix the comments > > lib/librte_eal/arm/rte_cpuflags.c | 6 +++++ > lib/librte_eal/include/generic/rte_cpuflags.h | 26 +++++++++++++++++++ > .../include/generic/rte_power_intrinsics.h | 12 +++++++++ > lib/librte_eal/ppc/rte_cpuflags.c | 7 +++++ > lib/librte_eal/rte_eal_version.map | 1 + > lib/librte_eal/x86/rte_cpuflags.c | 12 +++++++++ > 6 files changed, 64 insertions(+) > > diff --git a/lib/librte_eal/arm/rte_cpuflags.c b/lib/librte_eal/arm/rte_cpuflags.c > index 7b257b7873..e3a53bcece 100644 > --- a/lib/librte_eal/arm/rte_cpuflags.c > +++ b/lib/librte_eal/arm/rte_cpuflags.c > @@ -151,3 +151,9 @@ rte_cpu_get_flag_name(enum rte_cpu_flag_t feature) > return NULL; > return rte_cpu_feature_table[feature].name; > } > + > +void > +rte_cpu_get_intrinsics_support(struct rte_cpu_intrinsics *intrinsics) > +{ > + memset(intrinsics, 0, sizeof(*intrinsics)); > +} > diff --git a/lib/librte_eal/include/generic/rte_cpuflags.h b/lib/librte_eal/include/generic/rte_cpuflags.h > index 872f0ebe3e..28a5aecde8 100644 > --- a/lib/librte_eal/include/generic/rte_cpuflags.h > +++ b/lib/librte_eal/include/generic/rte_cpuflags.h > @@ -13,6 +13,32 @@ > #include "rte_common.h" > #include > > +#include > + > +/** > + * Structure used to describe platform-specific intrinsics that may or may not > + * be supported at runtime. > + */ > +struct rte_cpu_intrinsics { > + uint32_t power_monitor : 1; > + /**< indicates support for rte_power_monitor function */ > + uint32_t power_pause : 1; > + /**< indicates support for rte_power_pause function */ > +}; > + > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice > + * > + * Check CPU support for various intrinsics at runtime. > + * > + * @param intrinsics > + * Pointer to a structure to be filled. > + */ > +__rte_experimental > +void > +rte_cpu_get_intrinsics_support(struct rte_cpu_intrinsics *intrinsics); > + > /** > * Enumeration of all CPU features supported > */ > diff --git a/lib/librte_eal/include/generic/rte_power_intrinsics.h b/lib/librte_eal/include/generic/rte_power_intrinsics.h > index f9522f2776..1c176e4ef5 100644 > --- a/lib/librte_eal/include/generic/rte_power_intrinsics.h > +++ b/lib/librte_eal/include/generic/rte_power_intrinsics.h > @@ -32,6 +32,10 @@ > * checked against the expected value, and if they match, the entering of > * optimized power state may be aborted. > * > + * @warning It is responsibility of the user to check if this function is > + * supported at runtime using `rte_cpu_get_features()` API call. Failing to do > + * so may result in an illegal CPU instruction error. > + * > * @param p > * Address to monitor for changes. Must be aligned on an 64-byte boundary. > * @param expected_value > @@ -69,6 +73,10 @@ static inline void rte_power_monitor(const volatile void *p, > * This call will also lock a spinlock on entering sleep, and release it on > * waking up the CPU. > * > + * @warning It is responsibility of the user to check if this function is > + * supported at runtime using `rte_cpu_get_features()` API call. Failing to do > + * so may result in an illegal CPU instruction error. > + * > * @param p > * Address to monitor for changes. Must be aligned on an 64-byte boundary. > * @param expected_value > @@ -101,6 +109,10 @@ static inline void rte_power_monitor_sync(const volatile void *p, > * Enter an architecture-defined optimized power state until a certain TSC > * timestamp is reached. > * > + * @warning It is responsibility of the user to check if this function is > + * supported at runtime using `rte_cpu_get_features()` API call. Failing to do > + * so may result in an illegal CPU instruction error. > + * > * @param tsc_timestamp > * Maximum TSC timestamp to wait for. Note that the wait behavior is > * architecture-dependent. > diff --git a/lib/librte_eal/ppc/rte_cpuflags.c b/lib/librte_eal/ppc/rte_cpuflags.c > index 3bb7563ce9..61db5c216d 100644 > --- a/lib/librte_eal/ppc/rte_cpuflags.c > +++ b/lib/librte_eal/ppc/rte_cpuflags.c > @@ -8,6 +8,7 @@ > #include > #include > #include > +#include > #include > > /* Symbolic values for the entries in the auxiliary table */ > @@ -108,3 +109,9 @@ rte_cpu_get_flag_name(enum rte_cpu_flag_t feature) > return NULL; > return rte_cpu_feature_table[feature].name; > } > + > +void > +rte_cpu_get_intrinsics_support(struct rte_cpu_intrinsics *intrinsics) > +{ > + memset(intrinsics, 0, sizeof(*intrinsics)); > +} > diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map > index a93dea9fe6..ed944f2bd4 100644 > --- a/lib/librte_eal/rte_eal_version.map > +++ b/lib/librte_eal/rte_eal_version.map > @@ -400,6 +400,7 @@ EXPERIMENTAL { > # added in 20.11 > __rte_eal_trace_generic_size_t; > rte_service_lcore_may_be_active; > + rte_cpu_get_intrinsics_support; > }; > > INTERNAL { > diff --git a/lib/librte_eal/x86/rte_cpuflags.c b/lib/librte_eal/x86/rte_cpuflags.c > index 0325c4b93b..a96312ff7f 100644 > --- a/lib/librte_eal/x86/rte_cpuflags.c > +++ b/lib/librte_eal/x86/rte_cpuflags.c > @@ -7,6 +7,7 @@ > #include > #include > #include > +#include > > #include "rte_cpuid.h" > > @@ -179,3 +180,14 @@ rte_cpu_get_flag_name(enum rte_cpu_flag_t feature) > return NULL; > return rte_cpu_feature_table[feature].name; > } > + > +void > +rte_cpu_get_intrinsics_support(struct rte_cpu_intrinsics *intrinsics) > +{ > + memset(intrinsics, 0, sizeof(*intrinsics)); > + > + if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_WAITPKG)) { > + intrinsics->power_monitor = 1; > + intrinsics->power_pause = 1; > + } > +} > -- > 2.17.1