From ba1bf3208bb9327a4690c9ee88e07c1c0c0f68b8 Mon Sep 17 00:00:00 2001 From: Open vSwitch CI Date: Feb 08 2022 13:38:57 +0000 Subject: Import openvswitch2.16-2.16.0-49 from Fast DataPath --- diff --git a/SOURCES/openvswitch-2.16.0.patch b/SOURCES/openvswitch-2.16.0.patch index 768c771..21b015a 100644 --- a/SOURCES/openvswitch-2.16.0.patch +++ b/SOURCES/openvswitch-2.16.0.patch @@ -800,10 +800,15 @@ index b7d577870d..fe24f9abdf 100644 return false; } diff --git a/lib/dpif-netdev-extract-avx512.c b/lib/dpif-netdev-extract-avx512.c -index ec64419e38..8d8003b05f 100644 +index ec64419e38..77f28810c7 100644 --- a/lib/dpif-netdev-extract-avx512.c +++ b/lib/dpif-netdev-extract-avx512.c -@@ -161,6 +161,15 @@ _mm512_maskz_permutexvar_epi8_wrap(__mmask64 kmask, __m512i idx, __m512i a) +@@ -157,10 +157,19 @@ _mm512_maskz_permutexvar_epi8_wrap(__mmask64 kmask, __m512i idx, __m512i a) + 0, 0, 0, 0, /* Src IP */ \ + 0, 0, 0, 0, /* Dst IP */ + +-#define PATTERN_IPV4_MASK PATTERN_IPV4_GEN(0xFF, 0xFE, 0xFF, 0xFF) ++#define PATTERN_IPV4_MASK PATTERN_IPV4_GEN(0xFF, 0xBF, 0xFF, 0xFF) #define PATTERN_IPV4_UDP PATTERN_IPV4_GEN(0x45, 0, 0, 0x11) #define PATTERN_IPV4_TCP PATTERN_IPV4_GEN(0x45, 0, 0, 0x06) @@ -819,7 +824,52 @@ index ec64419e38..8d8003b05f 100644 #define NU 0 #define PATTERN_IPV4_UDP_SHUFFLE \ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, NU, NU, /* Ether */ \ -@@ -320,8 +329,16 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] = +@@ -217,6 +226,25 @@ _mm512_maskz_permutexvar_epi8_wrap(__mmask64 kmask, __m512i idx, __m512i a) + #define PATTERN_DT1Q_IPV4_TCP_KMASK \ + (KMASK_ETHER | (KMASK_DT1Q << 16) | (KMASK_IPV4 << 24) | (KMASK_TCP << 40)) + ++/* Miniflow Strip post-processing masks. ++ * This allows unsetting specific bits from the resulting miniflow. It is used ++ * for e.g. IPv4 where the "DF" bit is never pushed to the miniflow itself. ++ * The NC define is for "No Change", allowing the bits to pass through. ++ */ ++#define NC 0xFF ++ ++#define PATTERN_STRIP_IPV4_MASK \ ++ NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, \ ++ NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, 0xBF, NC, NC, NC, \ ++ NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, \ ++ NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC ++ ++#define PATTERN_STRIP_DOT1Q_IPV4_MASK \ ++ NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, \ ++ NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, \ ++ NC, NC, NC, NC, 0xBF, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, \ ++ NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC ++ + /* This union allows initializing static data as u8, but easily loading it + * into AVX512 registers too. The union ensures proper alignment for the zmm. + */ +@@ -241,8 +269,9 @@ struct mfex_profile { + union mfex_data probe_mask; + union mfex_data probe_data; + +- /* Required for reshaping packet into miniflow. */ ++ /* Required for reshaping packet into miniflow and post-processing it. */ + union mfex_data store_shuf; ++ union mfex_data strip_mask; + __mmask64 store_kmsk; + + /* Constant data to set in mf.bits and dp_packet data on hit. */ +@@ -310,6 +339,7 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] = + .probe_data.u8_data = { PATTERN_ETHERTYPE_IPV4 PATTERN_IPV4_UDP}, + + .store_shuf.u8_data = { PATTERN_IPV4_UDP_SHUFFLE }, ++ .strip_mask.u8_data = { PATTERN_STRIP_IPV4_MASK }, + .store_kmsk = PATTERN_IPV4_UDP_KMASK, + + .mf_bits = { 0x18a0000000000000, 0x0000000000040401}, +@@ -320,10 +350,19 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] = }, [PROFILE_ETH_IPV4_TCP] = { @@ -837,8 +887,19 @@ index ec64419e38..8d8003b05f 100644 + }, .store_shuf.u8_data = { PATTERN_IPV4_TCP_SHUFFLE }, ++ .strip_mask.u8_data = { PATTERN_STRIP_IPV4_MASK }, .store_kmsk = PATTERN_IPV4_TCP_KMASK, -@@ -353,10 +370,16 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] = + + .mf_bits = { 0x18a0000000000000, 0x0000000000044401}, +@@ -342,6 +381,7 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] = + }, + + .store_shuf.u8_data = { PATTERN_DT1Q_IPV4_UDP_SHUFFLE }, ++ .strip_mask.u8_data = { PATTERN_STRIP_DOT1Q_IPV4_MASK }, + .store_kmsk = PATTERN_DT1Q_IPV4_UDP_KMASK, + + .mf_bits = { 0x38a0000000000000, 0x0000000000040401}, +@@ -353,20 +393,27 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] = [PROFILE_ETH_VLAN_IPV4_TCP] = { .probe_mask.u8_data = { @@ -857,7 +918,19 @@ index ec64419e38..8d8003b05f 100644 }, .store_shuf.u8_data = { PATTERN_DT1Q_IPV4_TCP_SHUFFLE }, -@@ -374,16 +397,31 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] = ++ .strip_mask.u8_data = { PATTERN_STRIP_DOT1Q_IPV4_MASK }, + .store_kmsk = PATTERN_DT1Q_IPV4_TCP_KMASK, + + .mf_bits = { 0x38a0000000000000, 0x0000000000044401}, + .dp_pkt_offs = { + 14, UINT16_MAX, 18, 38, + }, +- .dp_pkt_min_size = 46, ++ .dp_pkt_min_size = 58, + }, + }; + +@@ -374,16 +421,31 @@ static const struct mfex_profile mfex_profiles[PROFILE_COUNT] = /* Protocol specific helper functions, for calculating offsets/lenghts. */ static int32_t mfex_ipv4_set_l2_pad_size(struct dp_packet *pkt, struct ip_header *nh, @@ -898,7 +971,15 @@ index ec64419e38..8d8003b05f 100644 } /* Fixup the VLAN CFI and PCP, reading the PCP from the input to this function, -@@ -450,7 +488,14 @@ mfex_avx512_process(struct dp_packet_batch *packets, +@@ -433,6 +495,7 @@ mfex_avx512_process(struct dp_packet_batch *packets, + __m512i v_vals = _mm512_loadu_si512(&profile->probe_data); + __m512i v_mask = _mm512_loadu_si512(&profile->probe_mask); + __m512i v_shuf = _mm512_loadu_si512(&profile->store_shuf); ++ __m512i v_strp = _mm512_loadu_si512(&profile->strip_mask); + + __mmask64 k_shuf = profile->store_kmsk; + __m128i v_bits = _mm_loadu_si128((void *) &profile->mf_bits); +@@ -450,10 +513,17 @@ mfex_avx512_process(struct dp_packet_batch *packets, /* Load packet data and probe with AVX512 mask & compare. */ const uint8_t *pkt = dp_packet_data(packet); @@ -913,8 +994,23 @@ index ec64419e38..8d8003b05f 100644 + __m512i v_pkt0_masked = _mm512_and_si512(v_pkt0, v_mask); __mmask64 k_cmp = _mm512_cmpeq_epi8_mask(v_pkt0_masked, v_vals); - if (k_cmp != UINT64_MAX) { -@@ -498,7 +543,8 @@ mfex_avx512_process(struct dp_packet_batch *packets, +- if (k_cmp != UINT64_MAX) { ++ if (OVS_UNLIKELY(k_cmp != UINT64_MAX)) { + continue; + } + +@@ -481,8 +551,9 @@ mfex_avx512_process(struct dp_packet_batch *packets, + v_blk0 = _mm512_maskz_permutex2var_epi8_skx(k_shuf, v_pkt0, + v_shuf, v512_zeros); + } +- _mm512_storeu_si512(&blocks[2], v_blk0); + ++ __m512i v_blk0_strip = _mm512_and_si512(v_blk0, v_strp); ++ _mm512_storeu_si512(&blocks[2], v_blk0_strip); + + /* Perform "post-processing" per profile, handling details not easily + * handled in the above generic AVX512 code. Examples include TCP flag +@@ -498,7 +569,8 @@ mfex_avx512_process(struct dp_packet_batch *packets, uint32_t size_from_ipv4 = size - VLAN_ETH_HEADER_LEN; struct ip_header *nh = (void *)&pkt[VLAN_ETH_HEADER_LEN]; @@ -924,7 +1020,7 @@ index ec64419e38..8d8003b05f 100644 continue; } -@@ -512,7 +558,8 @@ mfex_avx512_process(struct dp_packet_batch *packets, +@@ -512,7 +584,8 @@ mfex_avx512_process(struct dp_packet_batch *packets, uint32_t size_from_ipv4 = size - VLAN_ETH_HEADER_LEN; struct ip_header *nh = (void *)&pkt[VLAN_ETH_HEADER_LEN]; @@ -934,7 +1030,7 @@ index ec64419e38..8d8003b05f 100644 continue; } } break; -@@ -525,7 +572,8 @@ mfex_avx512_process(struct dp_packet_batch *packets, +@@ -525,7 +598,8 @@ mfex_avx512_process(struct dp_packet_batch *packets, /* Handle dynamic l2_pad_size. */ uint32_t size_from_ipv4 = size - sizeof(struct eth_header); struct ip_header *nh = (void *)&pkt[sizeof(struct eth_header)]; @@ -944,7 +1040,7 @@ index ec64419e38..8d8003b05f 100644 continue; } } break; -@@ -534,7 +582,8 @@ mfex_avx512_process(struct dp_packet_batch *packets, +@@ -534,7 +608,8 @@ mfex_avx512_process(struct dp_packet_batch *packets, /* Handle dynamic l2_pad_size. */ uint32_t size_from_ipv4 = size - sizeof(struct eth_header); struct ip_header *nh = (void *)&pkt[sizeof(struct eth_header)]; diff --git a/SPECS/openvswitch2.16.spec b/SPECS/openvswitch2.16.spec index cedf2fa..4d003d9 100644 --- a/SPECS/openvswitch2.16.spec +++ b/SPECS/openvswitch2.16.spec @@ -57,7 +57,7 @@ Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 2.16.0 -Release: 48%{?dist} +Release: 49%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -699,6 +699,12 @@ exit 0 %endif %changelog +* Tue Feb 08 2022 Open vSwitch CI - 2.16.0-49 +- Merging upstream branch-2.16 [RH git: 4541c91b99] + Commit list: + 418e6a0b8e dpif-netdev: fix vlan and ipv4 parsing in avx512 + + * Mon Feb 07 2022 Michael Santana - 2.16.0-48 - Merging upstream branch-2.16 [RH git: 9d51785142] Commit list: