summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarry van Haaren <harry.van.haaren@intel.com>2020-07-13 13:42:13 +0100
committerIan Stokes <ian.stokes@intel.com>2020-07-13 14:55:03 +0100
commitb250b39a7aa61881ded34ef1a0fffb6768fd7a49 (patch)
treec6e57eaad99c7cdc87abb2bf6bb9d3bc03c13b4e
parent9ff7cabfd78dc6736f4094400135f03fa3b9a3e3 (diff)
downloadopenvswitch-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>
-rw-r--r--lib/dpdk-stub.c9
-rw-r--r--lib/dpdk.c30
-rw-r--r--lib/dpdk.h2
3 files changed, 41 insertions, 0 deletions
diff --git a/lib/dpdk-stub.c b/lib/dpdk-stub.c
index c332c217c..b7d577870 100644
--- a/lib/dpdk-stub.c
+++ b/lib/dpdk-stub.c
@@ -79,6 +79,15 @@ print_dpdk_version(void)
{
}
+bool
+dpdk_get_cpu_has_isa(const char *arch OVS_UNUSED,
+ const char *feature OVS_UNUSED)
+{
+ VLOG_ERR_ONCE("DPDK not supported in this version of Open vSwitch, "
+ "cannot use CPU flag based optimizations");
+ return false;
+}
+
void
dpdk_status(const struct ovsrec_open_vswitch *cfg)
{
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)
{
diff --git a/lib/dpdk.h b/lib/dpdk.h
index 736a64279..445a51d06 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 *);
+bool dpdk_get_cpu_has_isa(const char *arch, const char *feature);
+
#endif /* dpdk.h */