Skip to content

Commit

Permalink
dpctl: dpif: add kernel datapath cache hit output
Browse files Browse the repository at this point in the history
This patch adds cache usage statistics to the output:

$ ovs-dpctl show
system@ovs-system:
  lookups: hit:24 missed:71 lost:0
  flows: 0
  masks: hit:334 total:0 hit/pkt:3.52
  cache: hit:4 hit rate:4.2105%
  port 0: ovs-system (internal)
  port 1: genev_sys_6081 (geneve: packet_type=ptap)
  port 2: br-int (internal)
  port 3: br-ex (internal)
  port 4: eth2
  port 5: sw1p1 (internal)
  port 6: sw0p4 (internal)

Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
Signed-off-by: 0-day Robot <robot@bytheb.org>
  • Loading branch information
chaudron authored and ovsrobot committed Mar 3, 2021
1 parent cdaa7e0 commit 0997a02
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 1 deletion.
2 changes: 1 addition & 1 deletion datapath/linux/compat/include/linux/openvswitch.h
Expand Up @@ -122,8 +122,8 @@ struct ovs_dp_megaflow_stats {
__u64 n_mask_hit; /* Number of masks used for flow lookups. */
__u32 n_masks; /* Number of masks for the datapath. */
__u32 pad0; /* Pad for future expension. */
__u64 n_cache_hit; /* Number of cache matches for flow lookups. */
__u64 pad1; /* Pad for future expension. */
__u64 pad2; /* Pad for future expension. */
};

struct ovs_vport_stats {
Expand Down
9 changes: 9 additions & 0 deletions lib/dpctl.c
Expand Up @@ -611,6 +611,15 @@ show_dpif(struct dpif *dpif, struct dpctl_params *dpctl_p)
dpctl_print(dpctl_p, " masks: hit:%"PRIu64" total:%"PRIu32
" hit/pkt:%.2f\n",
stats.n_mask_hit, stats.n_masks, avg);

if (stats.n_cache_hit != UINT64_MAX) {
double avg_hits = n_pkts ?
(double) stats.n_cache_hit / n_pkts * 100 : 0.0;

dpctl_print(dpctl_p,
" cache: hit:%"PRIu64" hit rate:%.2f%%\n",
stats.n_cache_hit, avg_hits);
}
}
}

Expand Down
1 change: 1 addition & 0 deletions lib/dpif-netdev.c
Expand Up @@ -2025,6 +2025,7 @@ dpif_netdev_get_stats(const struct dpif *dpif, struct dpif_dp_stats *stats)
}
stats->n_masks = UINT32_MAX;
stats->n_mask_hit = UINT64_MAX;
stats->n_cache_hit = UINT64_MAX;

return 0;
}
Expand Down
9 changes: 9 additions & 0 deletions lib/dpif-netlink.c
Expand Up @@ -672,9 +672,18 @@ dpif_netlink_get_stats(const struct dpif *dpif_, struct dpif_dp_stats *stats)
stats->n_masks = dp.megaflow_stats->n_masks;
stats->n_mask_hit = get_32aligned_u64(
&dp.megaflow_stats->n_mask_hit);
stats->n_cache_hit = get_32aligned_u64(
&dp.megaflow_stats->n_cache_hit);

if (!stats->n_cache_hit) {
/* Old kernels don't use this field and always
* report zero instead. Disable this stat. */
stats->n_cache_hit = UINT64_MAX;
}
} else {
stats->n_masks = UINT32_MAX;
stats->n_mask_hit = UINT64_MAX;
stats->n_cache_hit = UINT64_MAX;
}
ofpbuf_delete(buf);
}
Expand Down
2 changes: 2 additions & 0 deletions lib/dpif.h
Expand Up @@ -429,6 +429,8 @@ 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_cache_hit; /* Number of mega flow mask cache hits for
flow table matches. */
uint64_t n_mask_hit; /* Number of mega flow masks visited for
flow table matches. */
uint32_t n_masks; /* Number of mega flow masks. */
Expand Down

0 comments on commit 0997a02

Please sign in to comment.