diff options
author | Harry van Haaren <harry.van.haaren@intel.com> | 2020-07-13 13:42:13 +0100 |
---|---|---|
committer | Ian Stokes <ian.stokes@intel.com> | 2020-07-13 14:55:03 +0100 |
commit | b250b39a7aa61881ded34ef1a0fffb6768fd7a49 (patch) | |
tree | c6e57eaad99c7cdc87abb2bf6bb9d3bc03c13b4e /lib/dpdk.c | |
parent | 9ff7cabfd78dc6736f4094400135f03fa3b9a3e3 (diff) | |
download | openvswitch-b250b39a7aa61881ded34ef1a0fffb6768fd7a49.tar.gz |
dpdk: enable CPU feature detection.
This commit implements a method to retrieve the CPU ISA capabilities.
These ISA capabilities can be used in OVS to at runtime select a function
implementation to make the best use of the available ISA on the CPU.
Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
Acked-by: William Tu <u9012063@gmail.com>
Signed-off-by: Ian Stokes <ian.stokes@intel.com>
Diffstat (limited to 'lib/dpdk.c')
-rw-r--r-- | lib/dpdk.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/dpdk.c b/lib/dpdk.c index 31450d470..e46f56ba6 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,35 @@ 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 true; \ + } \ + } while (0) + +bool +dpdk_get_cpu_has_isa(const char *arch, const char *feature) +{ + /* Ensure Arch is x86_64. */ + if (strncmp(arch, "x86_64", 6) != 0) { + return false; + } + +#if __x86_64__ + /* CPU flags only defined for the architecture that support it. */ + CHECK_CPU_FEATURE(feature, "avx512f", RTE_CPUFLAG_AVX512F); + CHECK_CPU_FEATURE(feature, "bmi2", RTE_CPUFLAG_BMI2); +#endif + + VLOG_WARN("Unknown CPU arch,feature: %s,%s. Returning not supported.\n", + arch, feature); + return false; +} + void dpdk_status(const struct ovsrec_open_vswitch *cfg) { |