dpif-netdev: Fix rare flow add race condition.
authorEthan Jackson <ethan@nicira.com>
Sat, 3 Jan 2015 19:39:14 +0000 (11:39 -0800)
committerEthan Jackson <ethan@nicira.com>
Thu, 8 Jan 2015 02:15:13 +0000 (18:15 -0800)
commit4c75aaabb15389ddc9ec76e23f09d9282648dc13
tree30a200b8ec8ce8051aca3b2710744058feccfa1c
parent8ae8176fd0d8ed919e3301cc961dcf02b65ff49d
dpif-netdev: Fix rare flow add race condition.

Before this patch, dp_netdev_flow_add() inserted newly minted flows in
the "flow_table" cmap before inserting them into the per core "dpcls"
classifier.  Since dpcls_insert() initializes 'flow->cr.mask', there's
a brief window where the flow is accessible from the cmap, but has a
bogus mask value.

In my testing, under rare instances (i.e. once every 20 minutes with a
very specific flow table and traffic pattern), revalidators core dump
when they call dpif_netdev_flow_dump_next(), which accesses this bogus
mask value from dp_netdev_flow_to_dpif_flow().

By inserting into the per core classifier before the cmap, all the
values are guaranteed to be initialized during flow dumps.  With this
patch, I can no longer reproduce the crash.

Signed-off-by: Ethan Jackson <ethan@nicira.com>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
lib/dpif-netdev.c