Thanks for the review! Applied to master and branch-2.5 On 04/05/2016 11:28, "Jarno Rajahalme" <ja...@ovn.org> wrote:
>Acked-by: Jarno Rajahalme <jrajaha...@nicira.com> > >> On May 3, 2016, at 6:10 PM, Daniele Di Proietto <diproiet...@vmware.com> >> wrote: >> >> After removing a flow from the dpcls classifier there might still be >> readers who have access to the flow, until the next grace period. >> >> Setting flow->cr.mask to NULL can cause concurrent readers to crash, >> so this commit avoids doing it. >> >> The crash can be reproduced, for example, by invoking an operation >> that cause datapath flows to be deleted (such as `ovs-appctl >> upcall/enable-megaflows`) while traffic is running. >> >> I think the assignment was intended just as a safety measure to catch >> race conditions, and it should be safe to remove. >> >> Here's a stack trace of a possible crash: >> >> Program terminated with signal SIGSEGV, Segmentation fault. >> #0 0x00000000005ecfe7 in dpcls_rule_matches_key (target=0x7f3afa3f79d0, >> rule=0x7f3ae8006190) at ../lib/dpif-netdev.c:4156 >> 4156 if (OVS_UNLIKELY((value & *maskp++) != *keyp++)) { >> (gdb) bt >> #0 0x00000000005ecfe7 in dpcls_rule_matches_key (target=0x7f3afa3f79d0, >> rule=0x7f3ae8006190) at ../lib/dpif-netdev.c:4156 >> #1 dpcls_lookup (cls=<optimized out>, keys=0x7f3afa3f6428, >> rules=0x7f3afa3f2e40, cnt=<optimized out>) at ../lib/dpif-netdev.c:4225 >> #2 0x000000000040edc3 in fast_path_processing >> (pmd=pmd@entry=0x7f3afa3fc010, packets=packets@entry=0x7f3afa3fa420, >> cnt=cnt@entry=32, keys=keys@entry=0x7f3afa3f6428, >> batches=batches@entry=0x7f3afa3f4118, >> n_batches=n_batches@entry=0x7f3afa3fa3b0) >> at ../lib/dpif-netdev.c:3483 >> #3 0x00000000005f0413 in dp_netdev_input__ >> (pmd=pmd@entry=0x7f3afa3fc010, packets=packets@entry=0x7f3afa3fa420, >> cnt=<optimized out>, md_is_valid=md_is_valid@entry=false, >> port_no=<optimized out>) at ../lib/dpif-netdev.c:3625 >> #4 0x00000000005f0501 in dp_netdev_input (port_no=<optimized out>, >> cnt=<optimized out>, packets=0x7f3afa3fa420, pmd=0x7f3afa3fc010) at >> ../lib/dpif-netdev.c:3642 >> #5 dp_netdev_process_rxq_port (pmd=pmd@entry=0x7f3afa3fc010, >> rxq=<optimized out>, port=<optimized out>, port=<optimized out>) at >> ../lib/dpif-netdev.c:2574 >> #6 0x00000000005f0807 in pmd_thread_main (f_=0x7f3afa3fc010) at >> ../lib/dpif-netdev.c:2693 >> #7 0x000000000067d422 in ovsthread_wrapper (aux_=<optimized out>) at >> ../lib/ovs-thread.c:340 >> #8 0x00007f3b40ec4182 in start_thread (arg=0x7f3afa3fb700) at >> pthread_create.c:312 >> #9 0x00007f3b406e347d in clone () at >> ../sysdeps/unix/sysv/linux/x86_64/clone.S:111 >> >> Fixes: 361d808dd9e4("flow: Split miniflow's map.") >> CC: Jarno Rajahalme <ja...@ovn.org> >> Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com> >> --- >> lib/dpif-netdev.c | 2 -- >> 1 file changed, 2 deletions(-) >> >> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c >> index 1e8a37c..d288f45 100644 >> --- a/lib/dpif-netdev.c >> +++ b/lib/dpif-netdev.c >> @@ -1444,8 +1444,6 @@ dp_netdev_pmd_remove_flow(struct dp_netdev_pmd_thread >> *pmd, >> struct cmap_node *node = CONST_CAST(struct cmap_node *, &flow->node); >> >> dpcls_remove(&pmd->cls, &flow->cr); >> - flow->cr.mask = NULL; /* Accessing rule's mask after this is not >> safe. */ >> - >> cmap_remove(&pmd->flow_table, node, dp_netdev_flow_hash(&flow->ufid)); >> flow->dead = true; >> >> -- >> 2.1.4 >> > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev