The command ovs-dpctl can wrongly output the masks even if the datapath does not implement mega flows. In this case the output will be similar to the following:
system@ovs-system: lookups: hit:14 missed:41 lost:0 flows: 0 masks: hit:18446744073709551615 total:4294967295 hit/pkt:335395346794719104.00 port 0: ovs-system (internal) port 1: gre_system (gre: df_default=false, ttl=0) port 2: ots-br0 (internal) port 3: int0 (internal) port 4: vnet0 port 5: vnet1 The problem depends on the fact that n_masks stats is stored as a uint32 in the struct ovs_dp_megaflow_stats and as a uint64 in the struct dpif_dp_stats. UINT32_MAX instead of UINT64_MAX should be used to detect if the datapath supports megaflows or not. Signed-off-by: Francesco Fusco <ffu...@redhat.com> --- lib/dpif-netdev.c | 2 +- lib/dpif.h | 2 +- utilities/ovs-dpctl.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 1b0039c..2185911 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -394,7 +394,7 @@ dpif_netdev_get_stats(const struct dpif *dpif, struct dpif_dp_stats *stats) stats->n_hit = dp->n_hit; stats->n_missed = dp->n_missed; stats->n_lost = dp->n_lost; - stats->n_masks = UINT64_MAX; + stats->n_masks = UINT32_MAX; stats->n_mask_hit = UINT64_MAX; ovs_mutex_unlock(&dp_netdev_mutex); diff --git a/lib/dpif.h b/lib/dpif.h index 6db6ad3..aee935c 100644 --- a/lib/dpif.h +++ b/lib/dpif.h @@ -387,9 +387,9 @@ struct dpif_dp_stats { uint64_t n_missed; /* Number of flow table misses. */ uint64_t n_lost; /* Number of misses not sent to userspace. */ uint64_t n_flows; /* Number of flows present. */ - uint64_t n_masks; /* Number of mega flow masks. */ uint64_t n_mask_hit; /* Number of mega flow masks visited for flow table matches. */ + uint32_t n_masks; /* Number of mega flow masks. */ }; int dpif_get_dp_stats(const struct dpif *, struct dpif_dp_stats *); diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c index 78475e7..3766f8a 100644 --- a/utilities/ovs-dpctl.c +++ b/utilities/ovs-dpctl.c @@ -563,11 +563,11 @@ show_dpif(struct dpif *dpif) printf("\tlookups: hit:%"PRIu64" missed:%"PRIu64" lost:%"PRIu64"\n" "\tflows: %"PRIu64"\n", stats.n_hit, stats.n_missed, stats.n_lost, stats.n_flows); - if (stats.n_masks != UINT64_MAX) { + if (stats.n_masks != UINT32_MAX) { uint64_t n_pkts = stats.n_hit + stats.n_missed; double avg = n_pkts ? (double) stats.n_mask_hit / n_pkts : 0.0; - printf("\tmasks: hit:%"PRIu64" total:%"PRIu64" hit/pkt:%.2f\n", + printf("\tmasks: hit:%"PRIu64" total:%"PRIu32" hit/pkt:%.2f\n", stats.n_mask_hit, stats.n_masks, avg); } } -- 1.8.3.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev