On 8 Oct 2022, at 7:31, Peng He wrote:
> Hi,Eelco, > > Which kernel version you have tested on? I’m on Fedora 35, Linux ebuild 5.15.7-200.fc35.x86_64 > I've also tested the #50 for several hundreds times, but only get 0 packets > once. Odd, not sure what’s going on, might just rebuild my system when I get some time. It’s time anyway to update my Fedora release ;) > I have put your patches upon on commits 49efc63ad: ofproto-dpif-xlate: Fix > error messages for nonexistent ports/recirc_ids. > not sure if it's related to the modification on master branch. My 49 failures were built with the patchset on top of: 5046f2e35 sset, smap, hmapx: Reserve hash map space while cloning. //Eelco > Eelco Chaudron <[email protected]> 于2022年10月7日周五 18:54写道: > >> Hi hepeng, >> >> I tried your changes, but I also do get a lot of zero packet failures on >> test 50. Not sure what happened, maybe it was related to syncing to the >> latest master. >> >> However I focused on test 49, and I can replicate it every x test, but >> within 40 tries: >> >> ## ------------------------------ ## >> ## openvswitch 3.0.90 test suite. ## >> ## ------------------------------ ## >> 49: datapath - truncate and output to gre tunnel by simulated packets >> FAILED (ovs-macros.at:247) >> >> ... >> ... >> system-traffic.at:1663: waiting until ovs-ofctl dump-flows br-underlay | >> grep "in_port=LOCAL" | sed -n 's/.*\(n\_bytes=[0-9]*\).*/\1/p' | grep >> "n_bytes=138"... >> system-traffic.at:1663: wait failed after 30 seconds >> n_bytes=18446744073707612670 >> ./ovs-macros.at:247: hard failure >> >> I’ll try to dig into this later once I get some time... >> >> //Eelco >> >> On 2 Oct 2022, at 8:40, Peng He wrote: >> >> Hi, >> >> I have tried test #50 for 200 times, the overflow as well as stats of 0 >> did not show up. >> >> the command line is: >> for i in {1..100}; do echo $i; make check-offloads TESTSUITEFLAGS="-v 50" >> || break; done >> >> I am using Debian 10, and my kernel version is >> root@ubuntu:~/ovs# uname -r >> 5.4.0-121-generic >> >> I doubt the overflow might be related to kernel datapath. >> IIRC, the kernel datapath does not support some IPv6 ND/NA match. >> >> In the logs, there are some warning saying that "failed to get/del/put >> some datapath flow", which is all >> related the ICMPv6. It seems to prove the missing of the support of NA/ND >> match in datapath. >> >> since the ICMPv6 is not related to the test itself. I did some >> modification to the test to drop all IPv6 traffic. >> >> Below is my complete diff to the #50: >> >> diff --git a/tests/system-traffic.at b/tests/system-traffic.at >> index dfbc30e47..b759c4bb9 100644 >> --- a/tests/system-traffic.at >> +++ b/tests/system-traffic.at >> @@ -1762,7 +1762,7 @@ on_exit 'rm -f payload200.bin' >> >> AT_CHECK([ovs-ofctl del-flows br0]) >> AT_DATA([flows.txt], [dnl >> >> -priority=99,in_port=1,actions=output(port=2,max_len=100),output(port=3,max_len=100) >> >> +priority=99,in_port=1,ip,actions=output(port=2,max_len=100),output(port=3,max_len=100) >> priority=99,in_port=2,udp,actions=output(port=1,max_len=100) >> priority=1,in_port=4,ip,actions=drop >> priority=1,actions=drop >> @@ -1771,6 +1771,8 @@ AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) >> >> AT_CHECK([ovs-ofctl del-flows br-underlay]) >> AT_DATA([flows-underlay.txt], [dnl >> +priority=99,arp,in_port=1,actions=LOCAL >> +priority=99,arp,in_port=LOCAL,actions=1 >> priority=99,dl_type=0x0800,nw_proto=47,in_port=1,actions=LOCAL >> priority=99,dl_type=0x0800,nw_proto=47,in_port=LOCAL,ip_dst= >> 172.31.1.1/24,actions=1 >> priority=1,actions=drop >> @@ -1787,7 +1789,7 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep >> "in_port=2" | sed -n 's/.*\(n\_bytes=[ >> n_bytes=242 >> ]) >> dnl After truncation = outer ETH(14) + outer IP(20) + GRE(4) + 100 = 138B >> -AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "in_port=LOCAL" | sed >> -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl >> +AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "ip,in_port=LOCAL" | >> sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl >> n_bytes=138 >> ]) >> >> @@ -1822,7 +1824,7 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep >> "in_port=2" | sed -n 's/.*\(n\_bytes=[ >> n_bytes=242 >> ]) >> dnl After truncation = outer ETH(14) + outer IP(20) + GRE(4) + 100 = 138B >> -AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "in_port=LOCAL" | sed >> -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl >> +AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "ip,in_port=LOCAL" | >> sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl >> n_bytes=138 >> ]) >> >> @@ -1834,7 +1836,11 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep >> "in_port=4" | ofctl_strip], [0], [dnl >> n_packets=1, n_bytes=100, priority=1,ip,in_port=4 actions=drop >> ]) >> >> -OVS_TRAFFIC_VSWITCHD_STOP >> +OVS_TRAFFIC_VSWITCHD_STOP(["dnl >> +/.*lost packet on port.*/d >> +/.failed to flow_get.*/d >> +/.failed to flow_del.*/d >> +/.*Failed to acquire udpif_key corresponding to unexpected flow.*/d"]) >> AT_CLEANUP >> >> >> It seems that the overflow here is not related to the race in >> revalidators, but it is related to the design of >> the testsuite and also the missing of the support of NA/ND in kernel >> datapath. >> >> >> >> Eelco Chaudron <[email protected]> 于2022年9月30日周五 23:47写道: >> >>> On 30 Sep 2022, at 17:41, Peng He wrote: >>> >>>> It's so easy to reproduce ? >>>> >>>> Thanks! then I should have to dig it again. >>> >>> It’s been on my to-do for a while but did not get to it. Sometimes it >>> reproduced easily, and sometimes it takes 100+ runs :( >>> >>> If you apply the following series: >>> >>> https://patchwork.ozlabs.org/project/openvswitch/list/?series=316861 >>> >>> And then the diff below you can run something like: >>> >>> sudo bash -c 'for i in {1..100}; do make check-offloads >>> TESTSUITEFLAGS="49 50" >>> >>> 49: datapath - truncate and output to gre tunnel by simulated packets ok >>> 50: datapath - truncate and output to gre tunnel ok >>> >>> And after a while, it will fail with the error (sometimes also 0 bytes, I >>> hope it’s the same issue :): >>> >>> system-traffic.at:1663: wait failed after 30 seconds >>> n_bytes=18446744073709393054 >>> >>> >>> >>> $ git diff >>> diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c >>> index 57f94df54..52d61d0a4 100644 >>> --- a/ofproto/ofproto-dpif-upcall.c >>> +++ b/ofproto/ofproto-dpif-upcall.c >>> @@ -1868,6 +1868,7 @@ try_ukey_replace(struct umap *umap, struct >>> udpif_key *old_ukey, >>> ovs_mutex_lock(&new_ukey->mutex); >>> cmap_replace(&umap->cmap, &old_ukey->cmap_node, >>> &new_ukey->cmap_node, new_ukey->hash); >>> + new_ukey->dump_seq = old_ukey->dump_seq; >>> ovsrcu_postpone(ukey_delete__, old_ukey); >>> transition_ukey(old_ukey, UKEY_DELETED); >>> transition_ukey(new_ukey, UKEY_VISIBLE); >>> diff --git a/tests/system-offloads-testsuite.at b/tests/ >>> system-offloads-testsuite.at >>> index 318e6d1e6..4d546011d 100644 >>> --- a/tests/system-offloads-testsuite.at >>> +++ b/tests/system-offloads-testsuite.at >>> @@ -114,8 +114,8 @@ conntrack - DNAT load balancing with NC >>> >>> # Occasionalt we fail with extreme high byte counters, i.e. >>> # n_bytes=18446744073705804134 >>> -datapath - truncate and output to gre tunnel by simulated packets >>> -datapath - truncate and output to gre tunnel >>> +#datapath - truncate and output to gre tunnel by simulated packets >>> +#datapath - truncate and output to gre tunnel >>> " >>> echo "$ovs_test_skip_list" | sed "s/<SPC>/ /g"]) >>> >>> diff --git a/tests/system-traffic.at b/tests/system-traffic.at >>> index 528d2ca64..e86699d1d 100644 >>> --- a/tests/system-traffic.at >>> +++ b/tests/system-traffic.at >>> @@ -1708,7 +1708,10 @@ OVS_REVALIDATOR_PURGE() >>> OVS_WAIT_UNTIL([ovs-ofctl dump-flows br0 | grep "in_port=4" | >>> ofctl_strip | grep "n_packets=1, n_bytes=100, priority=1,ip,in_port=4 >>> actions=drop"], >>> [ovs-ofctl dump-flows br0 | grep "in_port=4" | >>> ofctl_strip]) >>> >>> -OVS_TRAFFIC_VSWITCHD_STOP >>> +OVS_TRAFFIC_VSWITCHD_STOP(["dnl >>> +/.*lost packet on handler.*/d >>> +/.failed to flow_get.*/d >>> +/.*Failed to acquire udpif_key corresponding to unexpected flow.*/d"]) >>> AT_CLEANUP >>> >>> dnl Create 2 bridges and 2 namespaces to test truncate over >>> @@ -1834,7 +1837,10 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep >>> "in_port=4" | ofctl_strip], [0], [dnl >>> n_packets=1, n_bytes=100, priority=1,ip,in_port=4 actions=drop >>> ]) >>> >>> -OVS_TRAFFIC_VSWITCHD_STOP >>> +OVS_TRAFFIC_VSWITCHD_STOP(["dnl >>> +/.*lost packet on handler.*/d >>> +/.failed to flow_get.*/d >>> +/.*Failed to acquire udpif_key corresponding to unexpected flow.*/d"]) >>> AT_CLEANUP >>> >>> AT_SETUP([datapath - configure cache size]) >>> >>> >>> >>>> Eelco Chaudron <[email protected]> 于2022年9月30日周五 23:39写道: >>>> >>>>> >>>>> >>>>> On 30 Sep 2022, at 17:26, Peng He wrote: >>>>> >>>>>> Eelco Chaudron <[email protected]> 于2022年9月30日周五 23:01写道: >>>>>> >>>>>>> >>>>>>> >>>>>>> On 23 Sep 2022, at 18:29, Peng He wrote: >>>>>>> >>>>>>>> The userspace datapath mananges all the magaflows by a cmap. The >>> cmap >>>>>>>> data structrue will grow/shrink during the datapath processing and >>> it >>>>>>>> will re-position megaflows. This might result in two revalidator >>>>> threads >>>>>>>> might process a same megaflow during one dump stage. >>>>>>>> >>>>>>>> Consider a situation that, revalidator 1 processes a megaflow A, and >>>>>>>> decides to delete it from the datapath, at the mean time, this >>> megaflow >>>>>>>> A is also queued in the process batch of revalidator 2. Normally >>> it's >>>>> ok >>>>>>>> for revalidators to process the same megaflow multiple times, as the >>>>>>>> dump_seq shows it's already dumped and the stats will not be >>>>> contributed >>>>>>>> twice. >>>>>>>> >>>>>>>> Assume that right after A is deleted, a PMD thread generates again >>>>>>>> a new megaflow B which has the same match and action of A. The ukey >>>>>>>> of megaflow B will replace the one of megaflow A. Now the ukey B is >>>>>>>> new to the revalidator system and its dump seq is 0. >>>>>>>> >>>>>>>> Now since the dump seq of ukey B is 0, when processing megaflow A, >>>>>>>> the revalidator 2 will not identify this megaflow A has already been >>>>>>>> dumped by revalidator 1 and will contribute the old megaflow A's >>> stats >>>>>>>> again, this results in an inconsistent stats between ukeys and >>>>> megaflows. >>>>>>>> >>>>>>>> To fix this, the newly generated the ukey B should take the dump_seq >>>>>>>> of the replaced ukey A to avoid a same megaflow being revalidated >>>>>>>> twice in one dump stage. >>>>>>>> >>>>>>>> We observe in the production environment, the OpenFlow rules' stats >>>>>>>> sometimes are amplified compared to the actual value. I believe this >>>>>>>> is also the reason that why somtimes there is mismatch between the >>>>>>>> ukey and megaflow in stats value. The Eelco's patch >>>>>>>> [ovs-dev] [PATCH v2 09/10] revalidator: Fix datapath statistics >>> update >>>>>>>> tried to fix it in the past. >>>>>>> >>>>>>> This sounds plausible, are your statistics extremely elevated? >>>>>>> Mine are in the likes of n_bytes=18446744073705804134 where it >>> should be >>>>>>> around 100. >>>>>>> >>>>>>> It looks more like an overflow. >>>>>> I just get the report from another team, I need to ask them, we will >>>>> have a >>>>>> 7 days off due to the national day. >>>>>> so it will take time to get the value. :( >>>>> >>>>> Enjoy your time off!! This fix is not solving my problem; >>>>> >>>>> Still get the error once out of X runs, n_bytes=18446744073709393054 >>>>> >>>>>> I’ll try to get my old setup up and run it continuously over the >>> weekend >>>>>>> and see if it’s replicated again. >>>>>>> >>>>>>> thanks! >>>>>> >>>>>> >>>>>>>> Signed-off-by: Peng He <[email protected]> >>>>>>>> --- >>>>>>>> ofproto/ofproto-dpif-upcall.c | 1 + >>>>>>>> 1 file changed, 1 insertion(+) >>>>>>>> >>>>>>>> diff --git a/ofproto/ofproto-dpif-upcall.c >>>>>>> b/ofproto/ofproto-dpif-upcall.c >>>>>>>> index e8bbcfeaf..89fad1bdf 100644 >>>>>>>> --- a/ofproto/ofproto-dpif-upcall.c >>>>>>>> +++ b/ofproto/ofproto-dpif-upcall.c >>>>>>>> @@ -1877,6 +1877,7 @@ try_ukey_replace(struct umap *umap, struct >>>>>>> udpif_key *old_ukey, >>>>>>>> ovs_mutex_lock(&new_ukey->mutex); >>>>>>>> cmap_replace(&umap->cmap, &old_ukey->cmap_node, >>>>>>>> &new_ukey->cmap_node, new_ukey->hash); >>>>>>>> + new_ukey->dump_seq = old_ukey->dump_seq; >>>>>>>> ovsrcu_postpone(ukey_delete__, old_ukey); >>>>>>>> transition_ukey(old_ukey, UKEY_DELETED); >>>>>>>> transition_ukey(new_ukey, UKEY_VISIBLE); >>>>>>>> -- >>>>>>>> 2.25.1 >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> dev mailing list >>>>>>>> [email protected] >>>>>>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >>>>>>> >>>>>>> >>>>>> >>>>>> -- >>>>>> hepeng >>>>> >>>>> >>>> >>>> -- >>>> hepeng >>> >>> >> >> -- >> hepeng >> >> > > -- > hepeng _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
