[ovs-dev] [PATCH v3 4/7] dpcls: enable cpu feature detection

William Tu u9012063 at gmail.com
Tue Jun 16 15:41:28 UTC 2020


btw, remember to add "." at the end of the commit title.
so
"dpcls: enable cpu feature detection."

On Wed, Jun 10, 2020 at 3:47 AM Harry van Haaren
<harry.van.haaren at intel.com> wrote:
>
> This commit implements a method to retrieve the CPU ISA capabilities.
> These ISA capabilities can be used in OVS to select a function
> implementation that uses the best ISA available on the CPU being used.
>
> Signed-off-by: Harry van Haaren <harry.van.haaren at intel.com>
> ---
>  lib/dpdk-stub.c | 13 +++++++++++++
>  lib/dpdk.c      | 27 +++++++++++++++++++++++++++
>  lib/dpdk.h      |  2 ++
>  3 files changed, 42 insertions(+)
>
> diff --git a/lib/dpdk-stub.c b/lib/dpdk-stub.c
> index c332c217c..9935f3d2b 100644
> --- a/lib/dpdk-stub.c
> +++ b/lib/dpdk-stub.c
> @@ -79,6 +79,19 @@ print_dpdk_version(void)
>  {
>  }
>
> +int
> +dpdk_get_cpu_has_isa(const char *arch OVS_UNUSED,
> +                     const char *feature OVS_UNUSED)
> +{
> +    static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
> +    if (ovsthread_once_start(&once)) {
> +        VLOG_ERR("DPDK not supported in this version of Open vSwitch, "
> +                 "cannot use CPU flag based optimizations");
> +        ovsthread_once_done(&once);
> +    }
> +    return 0;
> +}
> +
>  void
>  dpdk_status(const struct ovsrec_open_vswitch *cfg)
>  {
> diff --git a/lib/dpdk.c b/lib/dpdk.c
> index 31450d470..3bea65859 100644
> --- a/lib/dpdk.c
> +++ b/lib/dpdk.c
> @@ -22,6 +22,7 @@
>  #include <sys/stat.h>
>  #include <getopt.h>
>
> +#include <rte_cpuflags.h>
>  #include <rte_errno.h>
>  #include <rte_log.h>
>  #include <rte_memzone.h>
> @@ -513,6 +514,32 @@ print_dpdk_version(void)
>      puts(rte_version());
>  }
>
> +#define CHECK_CPU_FEATURE(feature, name_str, RTE_CPUFLAG)               \
> +    do {                                                                \
> +        if (strncmp(feature, name_str, strlen(name_str)) == 0) {        \
> +            int has_isa = rte_cpu_get_flag_enabled(RTE_CPUFLAG);        \
> +            VLOG_DBG("CPU flag %s, available %s\n", name_str,           \
> +                      has_isa ? "yes" : "no");                          \
> +            return has_isa;                                             \
> +        }                                                               \
> +    } while (0)
> +
> +int
> +dpdk_get_cpu_has_isa(const char *arch, const char *feature)
> +{
> +    /* Ensure Arch is x86_64 */
> +    if (strncmp(arch, "x86_64", 6) != 0) {
> +        return 0;
> +    }
> +
> +    CHECK_CPU_FEATURE(feature, "avx512f", RTE_CPUFLAG_AVX512F);
> +    CHECK_CPU_FEATURE(feature, "bmi2", RTE_CPUFLAG_BMI2);

why are "avx512f" and "bmi2" hard-coded here?
I thought this function "dpdk_get_cpu_has_isa" allows you to check any
cpu feature.

Regards,
William


> +
> +    VLOG_WARN("Unknown CPU arch,feature: %s,%s. Returning not supported.\n",
> +              arch, feature);
> +    return 0;
> +}
> +
>  void
>  dpdk_status(const struct ovsrec_open_vswitch *cfg)
>  {
> diff --git a/lib/dpdk.h b/lib/dpdk.h
> index 736a64279..818dfcbba 100644
> --- a/lib/dpdk.h
> +++ b/lib/dpdk.h
> @@ -44,4 +44,6 @@ bool dpdk_per_port_memory(void);
>  bool dpdk_available(void);
>  void print_dpdk_version(void);
>  void dpdk_status(const struct ovsrec_open_vswitch *);
> +int dpdk_get_cpu_has_isa(const char * arch, const char *feature);
> +
>  #endif /* dpdk.h */
> --
> 2.17.1
>


More information about the dev mailing list