> 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.
> 
> The pmd stats test is enhanced to include megaflow stats
> counting and checking.
> Also, miss and lost stats are annotated to make it clear
> what they mean.
> 
> Signed-off-by: Darrell Ball <dlu998 at gmail.com>
> ---
>  lib/dpif-netdev.c | 78 
> ++++++++++++++++++++++++++++++++++---------------------
>  tests/pmd.at      | 31 +++++++++++++++++-----
>  2 files changed, 74 insertions(+), 35 deletions(-)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 17e1666..dfc6684 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. */

Packets not passed up to the client and packets for which upcall wasn't executed
are different sets. Overlapping but different.
See below.

> +    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)++;

This is not correct. Upcall was done but failed. Why you're reporting that
there was no upcalls?

> +        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 (OVS_LIKELY(!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.
> diff --git a/tests/pmd.at b/tests/pmd.at
> index b6732ea..1faa977 100644
> --- a/tests/pmd.at
> +++ b/tests/pmd.at
> @@ -174,9 +174,9 @@ AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed 
> SED_NUMA_CORE_PATTERN | se
>  pmd thread numa_id <cleared> core_id <cleared>:
>       emc hits:0
>       megaflow hits:0
> -     avg. subtable lookups per hit:0.00
> -     miss:0
> -     lost:0
> +     avg. subtable lookups per megaflow hit:0.00
> +     miss(upcall done):0
> +     lost(upcall not done):0
>  ])
>  
>  ovs-appctl time/stop
> @@ -201,9 +201,28 @@ AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed 
> SED_NUMA_CORE_PATTERN | se
>  pmd thread numa_id <cleared> core_id <cleared>:
>       emc hits:19
>       megaflow hits:0
> -     avg. subtable lookups per hit:0.00
> -     miss:1
> -     lost:0
> +     avg. subtable lookups per megaflow hit:0.00
> +     miss(upcall done):1
> +     lost(upcall not done):0
> +])
> +
> +AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:emc-insert-inv-prob=0])
> +(
> +for i in `seq 0 5`;
> +    do
> +    
> pkt="in_port(7),eth(src=50:54:00:00:00:77,dst=50:54:00:00:01:78),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.1.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)"
> +    AT_CHECK([ovs-appctl netdev-dummy/receive p0 $pkt])
> +    done
> +)
> +ovs-appctl time/warp 100
> +
> +AT_CHECK([ovs-appctl dpif-netdev/pmd-stats-show | sed SED_NUMA_CORE_PATTERN 
> | sed '/cycles/d' | grep pmd -A 5], [0], [dnl
> +pmd thread numa_id <cleared> core_id <cleared>:
> +     emc hits:19
> +     megaflow hits:6
> +     avg. subtable lookups per megaflow hit:1.00
> +     miss(upcall done):1
> +     lost(upcall not done):0
>  ])
>  
>  OVS_VSWITCHD_STOP
> -- 
> 1.9.1
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to