datapath: Fix ovs_flow_free() ovs-lock assert.
authorPravin B Shelar <pshelar@nicira.com>
Tue, 28 Jan 2014 02:18:33 +0000 (18:18 -0800)
committerPravin B Shelar <pshelar@nicira.com>
Tue, 28 Jan 2014 02:42:37 +0000 (18:42 -0800)
ovs_flow_free() is not called under ovs-lock during packet
execute path (ovs_packet_cmd_execute()). Since packet execute
does not touch flow->mask, there is no need to take that
lock either. So move assert in case where flow->mask is checked.

Found by code inspection.

Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Acked-by: Andy Zhou <azhou@nicira.com>
Acked-by: Jesse Gross <jesse@nicira.com>
datapath/flow_table.c

index 2e8557c..fa7ad36 100644 (file)
@@ -167,11 +167,12 @@ void ovs_flow_free(struct sw_flow *flow, bool deferred)
        if (!flow)
                return;
 
-       ASSERT_OVSL();
-
        if (flow->mask) {
                struct sw_flow_mask *mask = flow->mask;
 
+               /* ovs-lock is required to protect mask-refcount and
+                * mask list. */
+               ASSERT_OVSL();
                BUG_ON(!mask->ref_count);
                mask->ref_count--;