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.haa...@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.haa...@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 > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev