Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xsk: Add xdp statistics to xsk_diag

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

authored by

Ciara Loftus and committed by
Alexei Starovoitov
0d80cb46 b36c3206

+28
+11
include/uapi/linux/xdp_diag.h
··· 30 30 #define XDP_SHOW_RING_CFG (1 << 1) 31 31 #define XDP_SHOW_UMEM (1 << 2) 32 32 #define XDP_SHOW_MEMINFO (1 << 3) 33 + #define XDP_SHOW_STATS (1 << 4) 33 34 34 35 enum { 35 36 XDP_DIAG_NONE, ··· 42 41 XDP_DIAG_UMEM_FILL_RING, 43 42 XDP_DIAG_UMEM_COMPLETION_RING, 44 43 XDP_DIAG_MEMINFO, 44 + XDP_DIAG_STATS, 45 45 __XDP_DIAG_MAX, 46 46 }; 47 47 ··· 69 67 __u32 queue_id; 70 68 __u32 flags; 71 69 __u32 refs; 70 + }; 71 + 72 + struct xdp_diag_stats { 73 + __u64 n_rx_dropped; 74 + __u64 n_rx_invalid; 75 + __u64 n_rx_full; 76 + __u64 n_fill_ring_empty; 77 + __u64 n_tx_invalid; 78 + __u64 n_tx_ring_empty; 72 79 }; 73 80 74 81 #endif /* _LINUX_XDP_DIAG_H */
+17
net/xdp/xsk_diag.c
··· 76 76 return err; 77 77 } 78 78 79 + static int xsk_diag_put_stats(const struct xdp_sock *xs, struct sk_buff *nlskb) 80 + { 81 + struct xdp_diag_stats du = {}; 82 + 83 + du.n_rx_dropped = xs->rx_dropped; 84 + du.n_rx_invalid = xskq_nb_invalid_descs(xs->rx); 85 + du.n_rx_full = xs->rx_queue_full; 86 + du.n_fill_ring_empty = xs->umem ? xskq_nb_queue_empty_descs(xs->umem->fq) : 0; 87 + du.n_tx_invalid = xskq_nb_invalid_descs(xs->tx); 88 + du.n_tx_ring_empty = xskq_nb_queue_empty_descs(xs->tx); 89 + return nla_put(nlskb, XDP_DIAG_STATS, sizeof(du), &du); 90 + } 91 + 79 92 static int xsk_diag_fill(struct sock *sk, struct sk_buff *nlskb, 80 93 struct xdp_diag_req *req, 81 94 struct user_namespace *user_ns, ··· 129 116 130 117 if ((req->xdiag_show & XDP_SHOW_MEMINFO) && 131 118 sock_diag_put_meminfo(sk, nlskb, XDP_DIAG_MEMINFO)) 119 + goto out_nlmsg_trim; 120 + 121 + if ((req->xdiag_show & XDP_SHOW_STATS) && 122 + xsk_diag_put_stats(xs, nlskb)) 132 123 goto out_nlmsg_trim; 133 124 134 125 mutex_unlock(&xs->mutex);