xsk: Add xdp statistics to xsk_diag
authorCiara Loftus <ciara.loftus@intel.com>
Wed, 8 Jul 2020 07:28:35 +0000 (07:28 +0000)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 13 Jul 2020 22:32:56 +0000 (15:32 -0700)
Add xdp statistics to the information dumped through the xsk_diag interface

Signed-off-by: Ciara Loftus <ciara.loftus@intel.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200708072835.4427-4-ciara.loftus@intel.com
include/uapi/linux/xdp_diag.h
net/xdp/xsk_diag.c

index 78b2591..66b9973 100644 (file)
@@ -30,6 +30,7 @@ struct xdp_diag_msg {
 #define XDP_SHOW_RING_CFG      (1 << 1)
 #define XDP_SHOW_UMEM          (1 << 2)
 #define XDP_SHOW_MEMINFO       (1 << 3)
+#define XDP_SHOW_STATS         (1 << 4)
 
 enum {
        XDP_DIAG_NONE,
@@ -41,6 +42,7 @@ enum {
        XDP_DIAG_UMEM_FILL_RING,
        XDP_DIAG_UMEM_COMPLETION_RING,
        XDP_DIAG_MEMINFO,
+       XDP_DIAG_STATS,
        __XDP_DIAG_MAX,
 };
 
@@ -69,4 +71,13 @@ struct xdp_diag_umem {
        __u32   refs;
 };
 
+struct xdp_diag_stats {
+       __u64   n_rx_dropped;
+       __u64   n_rx_invalid;
+       __u64   n_rx_full;
+       __u64   n_fill_ring_empty;
+       __u64   n_tx_invalid;
+       __u64   n_tx_ring_empty;
+};
+
 #endif /* _LINUX_XDP_DIAG_H */
index 0163b26..21e9c2d 100644 (file)
@@ -76,6 +76,19 @@ static int xsk_diag_put_umem(const struct xdp_sock *xs, struct sk_buff *nlskb)
        return err;
 }
 
+static int xsk_diag_put_stats(const struct xdp_sock *xs, struct sk_buff *nlskb)
+{
+       struct xdp_diag_stats du = {};
+
+       du.n_rx_dropped = xs->rx_dropped;
+       du.n_rx_invalid = xskq_nb_invalid_descs(xs->rx);
+       du.n_rx_full = xs->rx_queue_full;
+       du.n_fill_ring_empty = xs->umem ? xskq_nb_queue_empty_descs(xs->umem->fq) : 0;
+       du.n_tx_invalid = xskq_nb_invalid_descs(xs->tx);
+       du.n_tx_ring_empty = xskq_nb_queue_empty_descs(xs->tx);
+       return nla_put(nlskb, XDP_DIAG_STATS, sizeof(du), &du);
+}
+
 static int xsk_diag_fill(struct sock *sk, struct sk_buff *nlskb,
                         struct xdp_diag_req *req,
                         struct user_namespace *user_ns,
@@ -118,6 +131,10 @@ static int xsk_diag_fill(struct sock *sk, struct sk_buff *nlskb,
            sock_diag_put_meminfo(sk, nlskb, XDP_DIAG_MEMINFO))
                goto out_nlmsg_trim;
 
+       if ((req->xdiag_show & XDP_SHOW_STATS) &&
+           xsk_diag_put_stats(xs, nlskb))
+               goto out_nlmsg_trim;
+
        mutex_unlock(&xs->mutex);
        nlmsg_end(nlskb, nlh);
        return 0;