[ovs-dev] [patch_v3 2/3] dpif-netdev: Refactor some pmd stats.

Darrell Ball dlu998 at gmail.com
Tue Aug 15 05:57:12 UTC 2017


The per packets stats are presently overlapping in that
miss stats include lost stats; make these stats non-overlapping
for clarity and make this clear in the dp_stat_type enum.  This
also eliminates the need to increment two 'miss' stats for a
single packet.

The subtable lookup stats is renamed to make it
clear that it relates to masked lookups.

The stats that total to the number of packets seen are defined
in dp_stat_type and an api is created to total the stats in case
these stats are further divided in the future.

Signed-off-by: Darrell Ball <dlu998 at gmail.com>
---
 lib/dpif-netdev.c | 78 ++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 49 insertions(+), 29 deletions(-)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 17e1666..4aa967a 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -323,12 +323,19 @@ static struct dp_netdev_port *dp_netdev_lookup_port(const struct dp_netdev *dp,
     OVS_REQUIRES(dp->port_mutex);
 
 enum dp_stat_type {
-    DP_STAT_EXACT_HIT,          /* Packets that had an exact match (emc). */
-    DP_STAT_MASKED_HIT,         /* Packets that matched in the flow table. */
-    DP_STAT_MISS,               /* Packets that did not match. */
-    DP_STAT_LOST,               /* Packets not passed up to the client. */
-    DP_STAT_LOOKUP_HIT,         /* Number of subtable lookups for flow table
-                                   hits */
+    DP_STAT_EXACT_HIT,  /* Packets that had an exact match (emc). */
+    DP_STAT_MASKED_HIT, /* Packets that matched in the flow table. */
+    DP_STAT_MISS,       /* Packets that did not match and upcall was
+                           done. */
+    DP_STAT_LOST,       /* Packets that did not match and upcall was
+                           not done. */
+    DP_N_PER_PKT_CNT,   /* The above statistics account for the total
+                           number of packets seen and should not be
+                           overlapping with each other. */
+    DP_STAT_MASKED_LOOKUP = DP_N_PER_PKT_CNT,  /* Number of subtable lookups
+                                                  for flow table hits. Each
+                                                  MASKED_HIT hit will have
+                                                  >= 1 MASKED_LOOKUP(s). */
     DP_N_STATS
 };
 
@@ -749,13 +756,22 @@ enum pmd_info_type {
     PMD_INFO_SHOW_RXQ     /* Show poll-lists of pmd threads. */
 };
 
+static unsigned long long
+dp_netdev_calcul_total_packets(unsigned long long *stats)
+{
+    unsigned long long total_packets = 0;
+    for (uint8_t i = 0; i < DP_N_PER_PKT_CNT; i++) {
+        total_packets += stats[i];
+    }
+    return total_packets;
+}
+
 static void
 pmd_info_show_stats(struct ds *reply,
                     struct dp_netdev_pmd_thread *pmd,
                     unsigned long long stats[DP_N_STATS],
                     uint64_t cycles[PMD_N_CYCLES])
 {
-    unsigned long long total_packets;
     uint64_t total_cycles = 0;
     int i;
 
@@ -773,10 +789,6 @@ pmd_info_show_stats(struct ds *reply,
         }
     }
 
-    /* Sum of all the matched and not matched packets gives the total.  */
-    total_packets = stats[DP_STAT_EXACT_HIT] + stats[DP_STAT_MASKED_HIT]
-                    + stats[DP_STAT_MISS];
-
     for (i = 0; i < PMD_N_CYCLES; i++) {
         if (cycles[i] > pmd->cycles_zero[i]) {
            cycles[i] -= pmd->cycles_zero[i];
@@ -800,11 +812,12 @@ pmd_info_show_stats(struct ds *reply,
 
     ds_put_format(reply,
                   "\temc hits:%llu\n\tmegaflow hits:%llu\n"
-                  "\tavg. subtable lookups per hit:%.2f\n"
-                  "\tmiss:%llu\n\tlost:%llu\n",
+                  "\tavg. subtable lookups per megaflow hit:%.2f\n"
+                  "\tmiss(upcall done):%llu\n\tlost(upcall not done):%llu\n",
                   stats[DP_STAT_EXACT_HIT], stats[DP_STAT_MASKED_HIT],
                   stats[DP_STAT_MASKED_HIT] > 0
-                  ? (1.0*stats[DP_STAT_LOOKUP_HIT])/stats[DP_STAT_MASKED_HIT]
+                  ? (1.0 * stats[DP_STAT_MASKED_LOOKUP])
+                     / stats[DP_STAT_MASKED_HIT]
                   : 0,
                   stats[DP_STAT_MISS], stats[DP_STAT_LOST]);
 
@@ -820,6 +833,9 @@ pmd_info_show_stats(struct ds *reply,
                   cycles[PMD_CYCLES_PROCESSING],
                   cycles[PMD_CYCLES_PROCESSING] / (double)total_cycles * 100);
 
+    /* Sum of all the matched and not matched packets gives the total.  */
+    unsigned long long total_packets =
+         dp_netdev_calcul_total_packets(stats);
     if (total_packets == 0) {
         return;
     }
@@ -4724,18 +4740,18 @@ emc_processing(struct dp_netdev_pmd_thread *pmd,
     return dp_packet_batch_size(packets_);
 }
 
-static inline void
+static inline int
 handle_packet_upcall(struct dp_netdev_pmd_thread *pmd,
                      struct dp_packet *packet,
                      const struct netdev_flow_key *key,
                      struct ofpbuf *actions, struct ofpbuf *put_actions,
-                     int *lost_cnt, long long now)
+                     int *miss_no_upcall, long long now)
 {
     struct ofpbuf *add_actions;
     struct dp_packet_batch b;
     struct match match;
     ovs_u128 ufid;
-    int error;
+    int error = 0;
 
     match.tun_md.valid = false;
     miniflow_expand(&key->mf, &match.flow);
@@ -4749,8 +4765,8 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd,
                              put_actions);
     if (OVS_UNLIKELY(error && error != ENOSPC)) {
         dp_packet_delete(packet);
-        (*lost_cnt)++;
-        return;
+        (*miss_no_upcall)++;
+        return error;
     }
 
     /* The Netlink encoding of datapath flow keys cannot express
@@ -4790,6 +4806,7 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd,
         ovs_mutex_unlock(&pmd->flow_mutex);
         emc_probabilistic_insert(pmd, key, netdev_flow);
     }
+    return error;
 }
 
 static inline void
@@ -4811,7 +4828,7 @@ fast_path_processing(struct dp_netdev_pmd_thread *pmd,
     struct dpcls *cls;
     struct dpcls_rule *rules[PKT_ARRAY_SIZE];
     struct dp_netdev *dp = pmd->dp;
-    int miss_cnt = 0, lost_cnt = 0;
+    int miss_upcall_cnt = 0, miss_no_upcall_cnt = 0;
     int lookup_cnt = 0, add_lookup_cnt;
     bool any_miss;
     size_t i;
@@ -4853,9 +4870,12 @@ fast_path_processing(struct dp_netdev_pmd_thread *pmd,
                 continue;
             }
 
-            miss_cnt++;
-            handle_packet_upcall(pmd, packets[i], &keys[i], &actions,
-                                 &put_actions, &lost_cnt, now);
+
+            int error = handle_packet_upcall(pmd, packets[i], &keys[i],
+                           &actions, &put_actions, &miss_no_upcall_cnt, now);
+            if (!error) {
+                miss_upcall_cnt++;
+            }
         }
 
         ofpbuf_uninit(&actions);
@@ -4865,8 +4885,7 @@ fast_path_processing(struct dp_netdev_pmd_thread *pmd,
         for (i = 0; i < cnt; i++) {
             if (OVS_UNLIKELY(!rules[i])) {
                 dp_packet_delete(packets[i]);
-                lost_cnt++;
-                miss_cnt++;
+                miss_no_upcall_cnt++;
             }
         }
     }
@@ -4885,10 +4904,11 @@ fast_path_processing(struct dp_netdev_pmd_thread *pmd,
         dp_netdev_queue_batches(packet, flow, &keys[i].mf, batches, n_batches);
     }
 
-    dp_netdev_count_packet(pmd, DP_STAT_MASKED_HIT, cnt - miss_cnt);
-    dp_netdev_count_packet(pmd, DP_STAT_LOOKUP_HIT, lookup_cnt);
-    dp_netdev_count_packet(pmd, DP_STAT_MISS, miss_cnt);
-    dp_netdev_count_packet(pmd, DP_STAT_LOST, lost_cnt);
+    dp_netdev_count_packet(pmd, DP_STAT_MASKED_HIT, cnt - miss_upcall_cnt -
+                           miss_no_upcall_cnt);
+    dp_netdev_count_packet(pmd, DP_STAT_MASKED_LOOKUP, lookup_cnt);
+    dp_netdev_count_packet(pmd, DP_STAT_MISS, miss_upcall_cnt);
+    dp_netdev_count_packet(pmd, DP_STAT_LOST, miss_no_upcall_cnt);
 }
 
 /* Packets enter the datapath from a port (or from recirculation) here.
-- 
1.9.1



More information about the dev mailing list