diff mbox series

[ovs-dev,v3,08/12] dpif/stats: add miniflow extract opt hits counter

Message ID 20210517135708.685517-9-kumar.amber@intel.com
State Superseded
Headers show
Series MFEX Infrastructure + Optimizations | expand

Commit Message

Kumar Amber May 17, 2021, 1:57 p.m. UTC
From: Harry van Haaren <harry.van.haaren@intel.com>

This commit adds a new counter to be displayed to the user when
requesting datapath packet statistics. It counts the number of
packets that are parsed and a miniflow built up from it by the
optimized miniflow extract parsers.

The ovs-appctl command "dpif-netdev/pmd-perf-show" now has an
extra entry indicating if the optimized MFEX was hit:

  - MFEX Opt hits:        6786432  (100.0 %)

Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
---
 NEWS                     |  2 ++
 lib/dpif-netdev-avx512.c |  2 ++
 lib/dpif-netdev-perf.c   |  3 +++
 lib/dpif-netdev-perf.h   |  1 +
 lib/dpif-netdev.c        | 14 +++++++++-----
 tests/pmd.at             |  6 ++++--
 6 files changed, 21 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/NEWS b/NEWS
index e0c3f1d4f..ab86770a7 100644
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,8 @@  Post-v2.15.0
      * An optimized miniflow extract (mfex) implementation is now available,
        which uses CPU SIMD ISA to parse specific traffic profiles efficiently.
        Refer to the documentation for details on how to enable it at runtime.
+     * A new datapath statistic is shown when the "dpif-netdev/pmd-perf-show"
+       command is executed, it counts hits on the optimized mfex parsing.
    - ovs-ctl:
      * New option '--no-record-hostname' to disable hostname configuration
        in ovsdb on startup.
diff --git a/lib/dpif-netdev-avx512.c b/lib/dpif-netdev-avx512.c
index 3b82e3f6c..aaa6a8e05 100644
--- a/lib/dpif-netdev-avx512.c
+++ b/lib/dpif-netdev-avx512.c
@@ -252,8 +252,10 @@  dp_netdev_input_outer_avx512(struct dp_netdev_pmd_thread *pmd,
     }
 
     /* At this point we don't return error anymore, so commit stats here. */
+    uint32_t mfex_hit = __builtin_popcountll(mf_mask);
     pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_RECV, batch_size);
     pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_PHWOL_HIT, phwol_hits);
+    pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_MFEX_OPT_HIT, mfex_hit);
     pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_EXACT_HIT, emc_hits);
     pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_SMC_HIT, smc_hits);
     pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_MASKED_HIT,
diff --git a/lib/dpif-netdev-perf.c b/lib/dpif-netdev-perf.c
index 7103a2d4d..d7676ea2b 100644
--- a/lib/dpif-netdev-perf.c
+++ b/lib/dpif-netdev-perf.c
@@ -247,6 +247,7 @@  pmd_perf_format_overall_stats(struct ds *str, struct pmd_perf_stats *s,
             "  Rx packets:        %12"PRIu64"  (%.0f Kpps, %.0f cycles/pkt)\n"
             "  Datapath passes:   %12"PRIu64"  (%.2f passes/pkt)\n"
             "  - PHWOL hits:      %12"PRIu64"  (%5.1f %%)\n"
+            "  - MFEX Opt hits:   %12"PRIu64"  (%5.1f %%)\n"
             "  - EMC hits:        %12"PRIu64"  (%5.1f %%)\n"
             "  - SMC hits:        %12"PRIu64"  (%5.1f %%)\n"
             "  - Megaflow hits:   %12"PRIu64"  (%5.1f %%, %.2f "
@@ -258,6 +259,8 @@  pmd_perf_format_overall_stats(struct ds *str, struct pmd_perf_stats *s,
             passes, rx_packets ? 1.0 * passes / rx_packets : 0,
             stats[PMD_STAT_PHWOL_HIT],
             100.0 * stats[PMD_STAT_PHWOL_HIT] / passes,
+            stats[PMD_STAT_MFEX_OPT_HIT],
+            100.0 * stats[PMD_STAT_MFEX_OPT_HIT] / passes,
             stats[PMD_STAT_EXACT_HIT],
             100.0 * stats[PMD_STAT_EXACT_HIT] / passes,
             stats[PMD_STAT_SMC_HIT],
diff --git a/lib/dpif-netdev-perf.h b/lib/dpif-netdev-perf.h
index 8b1a52387..834c26260 100644
--- a/lib/dpif-netdev-perf.h
+++ b/lib/dpif-netdev-perf.h
@@ -57,6 +57,7 @@  extern "C" {
 
 enum pmd_stat_type {
     PMD_STAT_PHWOL_HIT,     /* Packets that had a partial HWOL hit (phwol). */
+    PMD_STAT_MFEX_OPT_HIT,  /* Packets that had miniflow optimized match. */
     PMD_STAT_EXACT_HIT,     /* Packets that had an exact match (emc). */
     PMD_STAT_SMC_HIT,       /* Packets that had a sig match hit (SMC). */
     PMD_STAT_MASKED_HIT,    /* Packets that matched in the flow table. */
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 6cc3fc0bf..39b93c009 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -662,6 +662,7 @@  pmd_info_show_stats(struct ds *reply,
                   "  packet recirculations: %"PRIu64"\n"
                   "  avg. datapath passes per packet: %.02f\n"
                   "  phwol hits: %"PRIu64"\n"
+                  "  mfex opt hits: %"PRIu64"\n"
                   "  emc hits: %"PRIu64"\n"
                   "  smc hits: %"PRIu64"\n"
                   "  megaflow hits: %"PRIu64"\n"
@@ -671,10 +672,9 @@  pmd_info_show_stats(struct ds *reply,
                   "  avg. packets per output batch: %.02f\n",
                   total_packets, stats[PMD_STAT_RECIRC],
                   passes_per_pkt, stats[PMD_STAT_PHWOL_HIT],
-                  stats[PMD_STAT_EXACT_HIT],
-                  stats[PMD_STAT_SMC_HIT],
-                  stats[PMD_STAT_MASKED_HIT], lookups_per_hit,
-                  stats[PMD_STAT_MISS], stats[PMD_STAT_LOST],
+                  stats[PMD_STAT_MFEX_OPT_HIT], stats[PMD_STAT_EXACT_HIT],
+                  stats[PMD_STAT_SMC_HIT], stats[PMD_STAT_MASKED_HIT],
+                  lookups_per_hit, stats[PMD_STAT_MISS], stats[PMD_STAT_LOST],
                   packets_per_batch);
 
     if (total_cycles == 0) {
@@ -6834,7 +6834,7 @@  dfc_processing(struct dp_netdev_pmd_thread *pmd,
                bool md_is_valid, odp_port_t port_no)
 {
     struct netdev_flow_key *key = &keys[0];
-    size_t n_missed = 0, n_emc_hit = 0, n_phwol_hit = 0;
+    size_t n_missed = 0, n_emc_hit = 0, n_phwol_hit = 0, n_mfex_opt_hit = 0;
     struct dp_packet_batch single_packet;
     struct dfc_cache *cache = &pmd->flow_cache;
     struct dp_packet *packet;
@@ -6902,6 +6902,8 @@  dfc_processing(struct dp_netdev_pmd_thread *pmd,
             /* Fallback to original miniflow_extract if there is a miss. */
             if (!mf_ret) {
                 miniflow_extract(packet, &key->mf);
+            } else {
+                n_mfex_opt_hit++;
             }
         } else {
             miniflow_extract(packet, &key->mf);
@@ -6953,6 +6955,8 @@  dfc_processing(struct dp_netdev_pmd_thread *pmd,
     *n_flows = map_cnt;
 
     pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_PHWOL_HIT, n_phwol_hit);
+    pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_MFEX_OPT_HIT,
+                            n_mfex_opt_hit);
     pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_EXACT_HIT, n_emc_hit);
 
     if (!smc_enable_db) {
diff --git a/tests/pmd.at b/tests/pmd.at
index 34a59d502..0947525f4 100644
--- a/tests/pmd.at
+++ b/tests/pmd.at
@@ -202,12 +202,13 @@  dummy@ovs-dummy: hit:0 missed:0
     p0 7/1: (dummy-pmd: configured_rx_queues=4, configured_tx_queues=<cleared>, requested_rx_queues=4, requested_tx_queues=<cleared>)
 ])
 
-AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed SED_NUMA_CORE_PATTERN | sed '/cycles/d' | grep pmd -A 10], [0], [dnl
+AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed SED_NUMA_CORE_PATTERN | sed '/cycles/d' | grep pmd -A 11], [0], [dnl
 pmd thread numa_id <cleared> core_id <cleared>:
   packets received: 0
   packet recirculations: 0
   avg. datapath passes per packet: 0.00
   phwol hits: 0
+  mfex opt hits: 0
   emc hits: 0
   smc hits: 0
   megaflow hits: 0
@@ -234,12 +235,13 @@  AT_CHECK([cat ovs-vswitchd.log | filter_flow_install | strip_xout], [0], [dnl
 recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:77,dst=50:54:00:00:01:78),eth_type(0x0800),ipv4(frag=no), actions: <del>
 ])
 
-AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed SED_NUMA_CORE_PATTERN | sed '/cycles/d' | grep pmd -A 10], [0], [dnl
+AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed SED_NUMA_CORE_PATTERN | sed '/cycles/d' | grep pmd -A 11], [0], [dnl
 pmd thread numa_id <cleared> core_id <cleared>:
   packets received: 20
   packet recirculations: 0
   avg. datapath passes per packet: 1.00
   phwol hits: 0
+  mfex opt hits: 0
   emc hits: 19
   smc hits: 0
   megaflow hits: 0