netflow: Do 64-bit division less often.
authorBen Pfaff <blp@nicira.com>
Wed, 1 Sep 2010 19:43:11 +0000 (12:43 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 1 Oct 2010 21:31:48 +0000 (14:31 -0700)
64-bit division is expensive.  Usually we can avoid it entirely, as done by
this patch.

ofproto/netflow.c

index 015208ac9569a559a6731ec84671bff94f87487d..a70b2fce8e545d3ed9221b39aead45759728394d 100644 (file)
@@ -184,21 +184,24 @@ netflow_expire(struct netflow *nf, struct netflow_flow *nf_flow,
         return;
     }
 
-    /* NetFlow v5 records are limited to 32-bit counters.  If we've
-     * wrapped a counter, send as multiple records so we don't lose
-     * track of any traffic.  We try to evenly distribute the packet and
-     * byte counters, so that the bytes-per-packet lengths don't look
-     * wonky across the records. */
-    while (byte_delta) {
-        int n_recs = (byte_delta + UINT32_MAX - 1) / UINT32_MAX;
+    /* NetFlow v5 records are limited to 32-bit counters.  If we've wrapped
+     * a counter, send as multiple records so we don't lose track of any
+     * traffic.  We try to evenly distribute the packet and byte counters,
+     * so that the bytes-per-packet lengths don't look wonky across the
+     * records. */
+    while (byte_delta > UINT32_MAX) {
+        uint32_t n_recs = byte_delta >> 32;
         uint32_t pkt_count = pkt_delta / n_recs;
         uint32_t byte_count = byte_delta / n_recs;
-        
+
         gen_netflow_rec(nf, nf_flow, expired, pkt_count, byte_count);
 
         pkt_delta -= pkt_count;
         byte_delta -= byte_count;
     }
+    if (byte_delta > 0) {
+        gen_netflow_rec(nf, nf_flow, expired, pkt_delta, byte_delta);
+    }
 
     /* Update flow tracking data. */
     nf_flow->created = 0;