ofproto: facet_execute() stats changes.
authorEthan Jackson <ethan@nicira.com>
Thu, 3 Mar 2011 23:59:25 +0000 (15:59 -0800)
committerEthan Jackson <ethan@nicira.com>
Fri, 4 Mar 2011 00:21:24 +0000 (16:21 -0800)
facet_execute() should rely on facet_update_stats() to update the
relevant facet's used parameter.

Before this patch, in very rare cases, the current practice could
lead to assertion failures.  The used value of a facet could be
slightly in the future due to the clocks being out of sync between
the kernel and user space.  Thus manually setting the used
parameter of a facet could put it slightly behind an already pushed
used value causing an assertion failure.

Bug #4745.

ofproto/ofproto.c

index 590b792a1bce25a3a9614275ead739d8f744fd4f..49f99cbbab512acaa9f1b6639eb25a6749b52f32 100644 (file)
@@ -2161,12 +2161,10 @@ facet_execute(struct ofproto *ofproto, struct facet *facet,
     assert(ofpbuf_headroom(packet) >= sizeof(struct ofp_packet_in));
 
     flow_extract_stats(&facet->flow, packet, &stats);
+    stats.used = time_msec();
     if (execute_odp_actions(ofproto, &facet->flow,
                             facet->actions, facet->actions_len, packet)) {
-        facet->used = time_msec();
         facet_update_stats(ofproto, facet, &stats);
-        netflow_flow_update_time(ofproto->netflow,
-                                 &facet->nf_flow, facet->used);
     }
 }