[ovs-dev] [PATCH 1/2] netflow: Do 64-bit division less often.

Ben Pfaff blp at nicira.com
Wed Sep 1 19:46:39 UTC 2010


64-bit division is expensive.  Usually we can avoid it entirely, as done by
this patch.
---
 ofproto/netflow.c |   19 +++++++++++--------
 1 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/ofproto/netflow.c b/ofproto/netflow.c
index 015208a..a70b2fc 100644
--- a/ofproto/netflow.c
+++ b/ofproto/netflow.c
@@ -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;
-- 
1.7.1





More information about the dev mailing list