From 6a173110000e8633a62dee6721a6a1ddb1305e02ed352b516fad150865ef90bc Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Thu, 29 Sep 2022 12:06:16 +0000 Subject: [PATCH] Accepting request 1006931 from home:dirkmueller:Factory - add a77ad9693c8b49055389559187fe74eddb619746.patch to avoid the cpu detection code being compiled with AVX512 enabled OBS-URL: https://build.opensuse.org/request/show/1006931 OBS-URL: https://build.opensuse.org/package/show/network/openvswitch?expand=0&rev=234 --- ...d9693c8b49055389559187fe74eddb619746.patch | 355 ++++++++++++++++++ openvswitch.changes | 6 + openvswitch.spec | 1 + 3 files changed, 362 insertions(+) create mode 100644 a77ad9693c8b49055389559187fe74eddb619746.patch diff --git a/a77ad9693c8b49055389559187fe74eddb619746.patch b/a77ad9693c8b49055389559187fe74eddb619746.patch new file mode 100644 index 0000000..8c948fe --- /dev/null +++ b/a77ad9693c8b49055389559187fe74eddb619746.patch @@ -0,0 +1,355 @@ +From a77ad9693c8b49055389559187fe74eddb619746 Mon Sep 17 00:00:00 2001 +From: David Marchand +Date: Wed, 29 Jun 2022 09:32:24 +0200 +Subject: [PATCH] dpif-netdev: Refactor AVX512 runtime checks. + +As described in the bugzilla below, cpu_has_isa code may be compiled +with some AVX512 instructions in it, because cpu.c is built as part of +the libopenvswitchavx512. +This is a problem when this function (supposed to probe for AVX512 +instructions availability) is invoked from generic OVS code, on older +CPUs that don't support them. + +For the same reason, dpcls_subtable_avx512_gather_probe, +dp_netdev_input_outer_avx512_probe, mfex_avx512_probe and +mfex_avx512_vbmi_probe are potential runtime bombs and can't either be +built as part of libopenvswitchavx512. + +Move cpu.c to be part of the "normal" libopenvswitch. +And move other helpers in generic OVS code. + +Note: +- dpcls_subtable_avx512_gather_probe is split in two, because it also + needs to do its own magic, +- while moving those helpers, prefer direct calls to cpu_has_isa and + avoid cast to intermediate integer variables when a simple boolean + is enough, + +Fixes: 352b6c7116cd ("dpif-lookup: add avx512 gather implementation.") +Fixes: abb807e27dd4 ("dpif-netdev: Add command to switch dpif implementation.") +Fixes: 250ceddcc2d0 ("dpif-netdev/mfex: Add AVX512 based optimized miniflow extract") +Fixes: b366fa2f4947 ("dpif-netdev: Call cpuid for x86 isa availability.") +Reported-at: https://bugzilla.redhat.com/2100393 +Reported-by: Ales Musil +Co-authored-by: Ales Musil +Signed-off-by: Ales Musil +Signed-off-by: David Marchand +Acked-by: Sunil Pai G +Acked-by: Ales Musil +Signed-off-by: Ilya Maximets +--- + lib/automake.mk | 4 +-- + lib/dpif-netdev-avx512.c | 14 --------- + lib/dpif-netdev-extract-avx512.c | 43 -------------------------- + lib/dpif-netdev-lookup-avx512-gather.c | 12 ++----- + lib/dpif-netdev-lookup.c | 15 +++++++++ + lib/dpif-netdev-lookup.h | 3 +- + lib/dpif-netdev-private-dpif.c | 14 +++++++++ + lib/dpif-netdev-private-dpif.h | 5 +-- + lib/dpif-netdev-private-extract.c | 38 +++++++++++++++++++++++ + lib/dpif-netdev-private-extract.h | 4 +-- + 10 files changed, 75 insertions(+), 77 deletions(-) + +Index: openvswitch-2.17.2/lib/automake.mk +=================================================================== +--- openvswitch-2.17.2.orig/lib/automake.mk ++++ openvswitch-2.17.2/lib/automake.mk +@@ -38,8 +38,6 @@ lib_libopenvswitchavx512_la_CFLAGS = \ + -fPIC \ + $(AM_CFLAGS) + lib_libopenvswitchavx512_la_SOURCES = \ +- lib/cpu.c \ +- lib/cpu.h \ + lib/dpif-netdev-lookup-avx512-gather.c \ + lib/dpif-netdev-extract-avx512.c \ + lib/dpif-netdev-avx512.c +@@ -89,6 +87,8 @@ lib_libopenvswitch_la_SOURCES = \ + lib/conntrack.h \ + lib/coverage.c \ + lib/coverage.h \ ++ lib/cpu.c \ ++ lib/cpu.h \ + lib/crc32c.c \ + lib/crc32c.h \ + lib/csum.c \ +Index: openvswitch-2.17.2/lib/dpif-netdev-avx512.c +=================================================================== +--- openvswitch-2.17.2.orig/lib/dpif-netdev-avx512.c ++++ openvswitch-2.17.2/lib/dpif-netdev-avx512.c +@@ -20,7 +20,6 @@ + + #include + +-#include "cpu.h" + #include "dpif-netdev.h" + #include "dpif-netdev-perf.h" + #include "dpif-netdev-private.h" +@@ -60,19 +59,6 @@ struct dpif_userdata { + }; + + int32_t +-dp_netdev_input_outer_avx512_probe(void) +-{ +- bool avx512f_available = cpu_has_isa(OVS_CPU_ISA_X86_AVX512F); +- bool bmi2_available = cpu_has_isa(OVS_CPU_ISA_X86_BMI2); +- +- if (!avx512f_available || !bmi2_available) { +- return -ENOTSUP; +- } +- +- return 0; +-} +- +-int32_t + dp_netdev_input_outer_avx512(struct dp_netdev_pmd_thread *pmd, + struct dp_packet_batch *packets, + odp_port_t in_port) +Index: openvswitch-2.17.2/lib/dpif-netdev-extract-avx512.c +=================================================================== +--- openvswitch-2.17.2.orig/lib/dpif-netdev-extract-avx512.c ++++ openvswitch-2.17.2/lib/dpif-netdev-extract-avx512.c +@@ -42,7 +42,6 @@ + #include + #include + +-#include "cpu.h" + #include "internal/flow.h" + + #include "dpif-netdev-private-dpcls.h" +@@ -659,47 +658,5 @@ DECLARE_MFEX_FUNC(ip_udp, PROFILE_ETH_IP + DECLARE_MFEX_FUNC(ip_tcp, PROFILE_ETH_IPV4_TCP) + DECLARE_MFEX_FUNC(dot1q_ip_udp, PROFILE_ETH_VLAN_IPV4_UDP) + DECLARE_MFEX_FUNC(dot1q_ip_tcp, PROFILE_ETH_VLAN_IPV4_TCP) +- +- +-static int32_t +-avx512_isa_probe(uint32_t needs_vbmi) +-{ +- static enum ovs_cpu_isa isa_required[] = { +- OVS_CPU_ISA_X86_AVX512F, +- OVS_CPU_ISA_X86_AVX512BW, +- OVS_CPU_ISA_X86_BMI2, +- }; +- +- int32_t ret = 0; +- for (uint32_t i = 0; i < ARRAY_SIZE(isa_required); i++) { +- if (!cpu_has_isa(isa_required[i])) { +- ret = -ENOTSUP; +- } +- } +- +- if (needs_vbmi) { +- if (!cpu_has_isa(OVS_CPU_ISA_X86_AVX512VBMI)) { +- ret = -ENOTSUP; +- } +- } +- +- return ret; +-} +- +-/* Probe functions to check ISA requirements. */ +-int32_t +-mfex_avx512_probe(void) +-{ +- const uint32_t needs_vbmi = 0; +- return avx512_isa_probe(needs_vbmi); +-} +- +-int32_t +-mfex_avx512_vbmi_probe(void) +-{ +- const uint32_t needs_vbmi = 1; +- return avx512_isa_probe(needs_vbmi); +-} +- + #endif /* __CHECKER__ */ + #endif /* __x86_64__ */ +Index: openvswitch-2.17.2/lib/dpif-netdev-lookup-avx512-gather.c +=================================================================== +--- openvswitch-2.17.2.orig/lib/dpif-netdev-lookup-avx512-gather.c ++++ openvswitch-2.17.2/lib/dpif-netdev-lookup-avx512-gather.c +@@ -396,18 +396,11 @@ dpcls_avx512_gather_mf_any(struct dpcls_ + } + + dpcls_subtable_lookup_func +-dpcls_subtable_avx512_gather_probe(uint32_t u0_bits, uint32_t u1_bits) ++dpcls_subtable_avx512_gather_probe__(uint32_t u0_bits, uint32_t u1_bits, ++ bool use_vpop) + { + dpcls_subtable_lookup_func f = NULL; + +- int avx512f_available = cpu_has_isa(OVS_CPU_ISA_X86_AVX512F); +- int bmi2_available = cpu_has_isa(OVS_CPU_ISA_X86_BMI2); +- if (!avx512f_available || !bmi2_available) { +- return NULL; +- } +- +- int use_vpop = cpu_has_isa(OVS_CPU_ISA_X86_VPOPCNTDQ); +- + CHECK_LOOKUP_FUNCTION(9, 4, use_vpop); + CHECK_LOOKUP_FUNCTION(9, 1, use_vpop); + CHECK_LOOKUP_FUNCTION(5, 3, use_vpop); +Index: openvswitch-2.17.2/lib/dpif-netdev-lookup.c +=================================================================== +--- openvswitch-2.17.2.orig/lib/dpif-netdev-lookup.c ++++ openvswitch-2.17.2/lib/dpif-netdev-lookup.c +@@ -18,10 +18,25 @@ + #include + #include "dpif-netdev-lookup.h" + ++#include "cpu.h" + #include "openvswitch/vlog.h" + + VLOG_DEFINE_THIS_MODULE(dpif_netdev_lookup); + ++#if (__x86_64__ && HAVE_AVX512F && HAVE_LD_AVX512_GOOD && __SSE4_2__) ++static dpcls_subtable_lookup_func ++dpcls_subtable_avx512_gather_probe(uint32_t u0_bits, uint32_t u1_bits) ++{ ++ if (!cpu_has_isa(OVS_CPU_ISA_X86_AVX512F) ++ || !cpu_has_isa(OVS_CPU_ISA_X86_BMI2)) { ++ return NULL; ++ } ++ ++ return dpcls_subtable_avx512_gather_probe__(u0_bits, u1_bits, ++ cpu_has_isa(OVS_CPU_ISA_X86_VPOPCNTDQ)); ++} ++#endif ++ + /* Actual list of implementations goes here */ + static struct dpcls_subtable_lookup_info_t subtable_lookups[] = { + /* The autovalidator implementation will not be used by default, it must +Index: openvswitch-2.17.2/lib/dpif-netdev-lookup.h +=================================================================== +--- openvswitch-2.17.2.orig/lib/dpif-netdev-lookup.h ++++ openvswitch-2.17.2/lib/dpif-netdev-lookup.h +@@ -44,7 +44,8 @@ dpcls_subtable_generic_probe(uint32_t u0 + + /* Probe function for AVX-512 gather implementation */ + dpcls_subtable_lookup_func +-dpcls_subtable_avx512_gather_probe(uint32_t u0_bit_cnt, uint32_t u1_bit_cnt); ++dpcls_subtable_avx512_gather_probe__(uint32_t u0_bit_cnt, uint32_t u1_bit_cnt, ++ bool use_vpop); + + + /* Subtable registration and iteration helpers */ +Index: openvswitch-2.17.2/lib/dpif-netdev-private-dpif.c +=================================================================== +--- openvswitch-2.17.2.orig/lib/dpif-netdev-private-dpif.c ++++ openvswitch-2.17.2/lib/dpif-netdev-private-dpif.c +@@ -22,6 +22,7 @@ + #include + #include + ++#include "cpu.h" + #include "openvswitch/dynamic-string.h" + #include "openvswitch/vlog.h" + #include "internal/util.h" +@@ -33,6 +34,19 @@ enum dpif_netdev_impl_info_idx { + DPIF_NETDEV_IMPL_AVX512 + }; + ++#if (__x86_64__ && HAVE_AVX512F && HAVE_LD_AVX512_GOOD && __SSE4_2__) ++static int32_t ++dp_netdev_input_outer_avx512_probe(void) ++{ ++ if (!cpu_has_isa(OVS_CPU_ISA_X86_AVX512F) ++ || !cpu_has_isa(OVS_CPU_ISA_X86_BMI2)) { ++ return -ENOTSUP; ++ } ++ ++ return 0; ++} ++#endif ++ + /* Actual list of implementations goes here. */ + static struct dpif_netdev_impl_info_t dpif_impls[] = { + /* The default scalar C code implementation. */ +Index: openvswitch-2.17.2/lib/dpif-netdev-private-dpif.h +=================================================================== +--- openvswitch-2.17.2.orig/lib/dpif-netdev-private-dpif.h ++++ openvswitch-2.17.2/lib/dpif-netdev-private-dpif.h +@@ -67,10 +67,7 @@ dp_netdev_input(struct dp_netdev_pmd_thr + struct dp_packet_batch *packets, + odp_port_t in_port); + +-/* AVX512 enabled DPIF implementation and probe functions. */ +-int32_t +-dp_netdev_input_outer_avx512_probe(void); +- ++/* AVX512 enabled DPIF implementation function. */ + int32_t + dp_netdev_input_outer_avx512(struct dp_netdev_pmd_thread *pmd, + struct dp_packet_batch *packets, +Index: openvswitch-2.17.2/lib/dpif-netdev-private-extract.c +=================================================================== +--- openvswitch-2.17.2.orig/lib/dpif-netdev-private-extract.c ++++ openvswitch-2.17.2/lib/dpif-netdev-private-extract.c +@@ -19,6 +19,7 @@ + #include + #include + ++#include "cpu.h" + #include "internal/dp-packet.h" + #include "dpif-netdev-private-dpcls.h" + #include "dpif-netdev-private-extract.h" +@@ -33,6 +34,43 @@ VLOG_DEFINE_THIS_MODULE(dpif_netdev_extr + /* Variable to hold the default MFEX implementation. */ + static ATOMIC(miniflow_extract_func) default_mfex_func; + ++#if (__x86_64__ && HAVE_AVX512F && HAVE_LD_AVX512_GOOD && __SSE4_2__) ++static int32_t ++avx512_isa_probe(bool needs_vbmi) ++{ ++ static enum ovs_cpu_isa isa_required[] = { ++ OVS_CPU_ISA_X86_AVX512F, ++ OVS_CPU_ISA_X86_AVX512BW, ++ OVS_CPU_ISA_X86_BMI2, ++ }; ++ ++ for (uint32_t i = 0; i < ARRAY_SIZE(isa_required); i++) { ++ if (!cpu_has_isa(isa_required[i])) { ++ return -ENOTSUP; ++ } ++ } ++ ++ if (needs_vbmi && !cpu_has_isa(OVS_CPU_ISA_X86_AVX512VBMI)) { ++ return -ENOTSUP; ++ } ++ ++ return 0; ++} ++ ++/* Probe functions to check ISA requirements. */ ++static int32_t ++mfex_avx512_probe(void) ++{ ++ return avx512_isa_probe(false); ++} ++ ++static int32_t ++mfex_avx512_vbmi_probe(void) ++{ ++ return avx512_isa_probe(true); ++} ++#endif ++ + /* Implementations of available extract options and + * the implementations are always in order of preference. + */ +Index: openvswitch-2.17.2/lib/dpif-netdev-private-extract.h +=================================================================== +--- openvswitch-2.17.2.orig/lib/dpif-netdev-private-extract.h ++++ openvswitch-2.17.2/lib/dpif-netdev-private-extract.h +@@ -176,10 +176,8 @@ mfex_study_traffic(struct dp_packet_batc + int + mfex_set_study_pkt_cnt(uint32_t pkt_cmp_count, const char *name); + +-/* AVX512 MFEX Probe and Implementations functions. */ ++/* AVX512 MFEX Implementation functions. */ + #ifdef __x86_64__ +-int32_t mfex_avx512_probe(void); +-int32_t mfex_avx512_vbmi_probe(void); + + #define DECLARE_AVX512_MFEX_PROTOTYPE(name) \ + uint32_t \ diff --git a/openvswitch.changes b/openvswitch.changes index adf2364..8d58197 100644 --- a/openvswitch.changes +++ b/openvswitch.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Sep 29 11:58:47 UTC 2022 - Dirk Müller + +- add a77ad9693c8b49055389559187fe74eddb619746.patch to avoid + the cpu detection code being compiled with AVX512 enabled + ------------------------------------------------------------------- Mon Sep 12 19:55:30 UTC 2022 - Andreas Stieger diff --git a/openvswitch.spec b/openvswitch.spec index e22b641..f5f37c3 100644 --- a/openvswitch.spec +++ b/openvswitch.spec @@ -61,6 +61,7 @@ Patch4: install-ovsdb-tools.patch Patch5: 0001-openvswitch-merge-compiler.h-files-into-one-file.patch Patch6: 0002-build-Seperated-common-used-headers.patch Patch7: openvswitch-2.17.2-Fix-tests-with-GNU-grep-3.8.patch +Patch8: a77ad9693c8b49055389559187fe74eddb619746.patch # Python subpackage BuildRequires: %{python_module devel} BuildRequires: %{python_module setuptools}