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

Reply via email to