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.comzero-sugar-mainline-defconfig
parent
b36c3206f9
commit
0d80cb4612
|
@ -30,6 +30,7 @@ struct xdp_diag_msg {
|
||||||
#define XDP_SHOW_RING_CFG (1 << 1)
|
#define XDP_SHOW_RING_CFG (1 << 1)
|
||||||
#define XDP_SHOW_UMEM (1 << 2)
|
#define XDP_SHOW_UMEM (1 << 2)
|
||||||
#define XDP_SHOW_MEMINFO (1 << 3)
|
#define XDP_SHOW_MEMINFO (1 << 3)
|
||||||
|
#define XDP_SHOW_STATS (1 << 4)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
XDP_DIAG_NONE,
|
XDP_DIAG_NONE,
|
||||||
|
@ -41,6 +42,7 @@ enum {
|
||||||
XDP_DIAG_UMEM_FILL_RING,
|
XDP_DIAG_UMEM_FILL_RING,
|
||||||
XDP_DIAG_UMEM_COMPLETION_RING,
|
XDP_DIAG_UMEM_COMPLETION_RING,
|
||||||
XDP_DIAG_MEMINFO,
|
XDP_DIAG_MEMINFO,
|
||||||
|
XDP_DIAG_STATS,
|
||||||
__XDP_DIAG_MAX,
|
__XDP_DIAG_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -69,4 +71,13 @@ struct xdp_diag_umem {
|
||||||
__u32 refs;
|
__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 */
|
#endif /* _LINUX_XDP_DIAG_H */
|
||||||
|
|
|
@ -76,6 +76,19 @@ static int xsk_diag_put_umem(const struct xdp_sock *xs, struct sk_buff *nlskb)
|
||||||
return err;
|
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,
|
static int xsk_diag_fill(struct sock *sk, struct sk_buff *nlskb,
|
||||||
struct xdp_diag_req *req,
|
struct xdp_diag_req *req,
|
||||||
struct user_namespace *user_ns,
|
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))
|
sock_diag_put_meminfo(sk, nlskb, XDP_DIAG_MEMINFO))
|
||||||
goto out_nlmsg_trim;
|
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);
|
mutex_unlock(&xs->mutex);
|
||||||
nlmsg_end(nlskb, nlh);
|
nlmsg_end(nlskb, nlh);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue