diff options
author | Ilya Maximets <i.maximets@samsung.com> | 2019-07-05 11:37:58 -0400 |
---|---|---|
committer | Ilya Maximets <i.maximets@samsung.com> | 2019-07-24 19:22:05 +0300 |
commit | d560bc1baa522e3c101d3740ecfb17b7723df83d (patch) | |
tree | 658e7c81411717bfaa44d29154127932aeb3809c /lib | |
parent | f627cf1dd922bb644b6480bfbda67a9460cb2947 (diff) | |
download | openvswitch-d560bc1baa522e3c101d3740ecfb17b7723df83d.tar.gz |
netdev-afxdp: Convert AFXDP_DEBUG to custom stats.
These are valid statistics of a network interface and should be
exposed via custom stats.
The same MACRO trick as in vswitchd/bridge.c is used to reduce code
duplication and easily add new stats if necessary in the future.
Acked-by: William Tu <u9012063@gmail.com>
Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/netdev-afxdp.c | 65 | ||||
-rw-r--r-- | lib/netdev-afxdp.h | 4 | ||||
-rw-r--r-- | lib/netdev-linux.c | 1 |
3 files changed, 51 insertions, 19 deletions
diff --git a/lib/netdev-afxdp.c b/lib/netdev-afxdp.c index 6b0b93e7f..ff426750d 100644 --- a/lib/netdev-afxdp.c +++ b/lib/netdev-afxdp.c @@ -448,21 +448,6 @@ xsk_destroy_all(struct netdev *netdev) } } -static inline void OVS_UNUSED -log_xsk_stat(struct xsk_socket_info *xsk OVS_UNUSED) { - struct xdp_statistics stat; - socklen_t optlen; - - optlen = sizeof stat; - ovs_assert(getsockopt(xsk_socket__fd(xsk->xsk), SOL_XDP, XDP_STATISTICS, - &stat, &optlen) == 0); - - VLOG_DBG_RL(&rl, "rx dropped %llu, rx_invalid %llu, tx_invalid %llu", - stat.rx_dropped, - stat.rx_invalid_descs, - stat.tx_invalid_descs); -} - int netdev_afxdp_set_config(struct netdev *netdev, const struct smap *args, char **errp OVS_UNUSED) @@ -711,10 +696,6 @@ netdev_afxdp_rxq_recv(struct netdev_rxq *rxq_, struct dp_packet_batch *batch, /* TODO: return the number of remaining packets in the queue. */ *qfill = 0; } - -#ifdef AFXDP_DEBUG - log_xsk_stat(xsk_info); -#endif return 0; } @@ -1013,6 +994,52 @@ netdev_afxdp_destruct(struct netdev *netdev) } int +netdev_afxdp_get_custom_stats(const struct netdev *netdev, + struct netdev_custom_stats *custom_stats) +{ + struct netdev_linux *dev = netdev_linux_cast(netdev); + struct xsk_socket_info *xsk_info; + struct xdp_statistics stat; + uint32_t i, c = 0; + socklen_t optlen; + + ovs_mutex_lock(&dev->mutex); + +#define XDP_CSTATS \ + XDP_CSTAT(rx_dropped) \ + XDP_CSTAT(rx_invalid_descs) \ + XDP_CSTAT(tx_invalid_descs) + +#define XDP_CSTAT(NAME) + 1 + enum { N_XDP_CSTATS = XDP_CSTATS }; +#undef XDP_CSTAT + + custom_stats->counters = xcalloc(netdev_n_rxq(netdev) * N_XDP_CSTATS, + sizeof *custom_stats->counters); + + /* Account the stats for each xsk. */ + for (i = 0; i < netdev_n_rxq(netdev); i++) { + xsk_info = dev->xsks[i]; + optlen = sizeof stat; + + if (xsk_info && !getsockopt(xsk_socket__fd(xsk_info->xsk), SOL_XDP, + XDP_STATISTICS, &stat, &optlen)) { +#define XDP_CSTAT(NAME) \ + snprintf(custom_stats->counters[c].name, \ + NETDEV_CUSTOM_STATS_NAME_SIZE, \ + "xsk_queue_%d_" #NAME, i); \ + custom_stats->counters[c++].value = stat.NAME; + XDP_CSTATS; +#undef XDP_CSTAT + } + } + custom_stats->size = c; + ovs_mutex_unlock(&dev->mutex); + + return 0; +} + +int netdev_afxdp_get_stats(const struct netdev *netdev, struct netdev_stats *stats) { diff --git a/lib/netdev-afxdp.h b/lib/netdev-afxdp.h index 6a72bd9a8..e2f400b72 100644 --- a/lib/netdev-afxdp.h +++ b/lib/netdev-afxdp.h @@ -33,6 +33,7 @@ struct smap; struct dp_packet; struct netdev_rxq; struct netdev_stats; +struct netdev_custom_stats; int netdev_afxdp_rxq_construct(struct netdev_rxq *rxq_); void netdev_afxdp_rxq_destruct(struct netdev_rxq *rxq_); @@ -51,6 +52,9 @@ int netdev_afxdp_get_config(const struct netdev *netdev, struct smap *args); int netdev_afxdp_get_numa_id(const struct netdev *netdev); int netdev_afxdp_get_stats(const struct netdev *netdev_, struct netdev_stats *stats); +int netdev_afxdp_get_custom_stats(const struct netdev *netdev, + struct netdev_custom_stats *custom_stats); + void free_afxdp_buf(struct dp_packet *p); int netdev_afxdp_reconfigure(struct netdev *netdev); diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 2432cd176..f48192373 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -3293,6 +3293,7 @@ const struct netdev_class netdev_afxdp_class = { .construct = netdev_afxdp_construct, .destruct = netdev_afxdp_destruct, .get_stats = netdev_afxdp_get_stats, + .get_custom_stats = netdev_afxdp_get_custom_stats, .get_status = netdev_linux_get_status, .set_config = netdev_afxdp_set_config, .get_config = netdev_afxdp_get_config, |