On Tue, Apr 24, 2018 at 6:58 PM, Willem de Bruijn <willemdebruijn.ker...@gmail.com> wrote: > On Mon, Apr 23, 2018 at 9:56 AM, Björn Töpel <bjorn.to...@gmail.com> wrote: >> From: Magnus Karlsson <magnus.karls...@intel.com> >> >> In this commit, a new getsockopt is added: XDP_STATISTICS. This is >> used to obtain stats from the sockets. >> >> Signed-off-by: Magnus Karlsson <magnus.karls...@intel.com> > >> +static int xsk_getsockopt(struct socket *sock, int level, int optname, >> + char __user *optval, int __user *optlen) >> +{ >> + struct sock *sk = sock->sk; >> + struct xdp_sock *xs = xdp_sk(sk); >> + int len; >> + >> + if (level != SOL_XDP) >> + return -ENOPROTOOPT; >> + >> + if (get_user(len, optlen)) >> + return -EFAULT; >> + if (len < 0) >> + return -EINVAL; >> + >> + switch (optname) { >> + case XDP_STATISTICS: >> + { >> + struct xdp_statistics stats; >> + >> + if (len != sizeof(stats)) >> + return -EINVAL; >> + >> + mutex_lock(&xs->mutex); >> + stats.rx_dropped = xs->rx_dropped; >> + stats.rx_invalid_descs = xskq_nb_invalid_descs(xs->rx); >> + stats.tx_invalid_descs = xskq_nb_invalid_descs(xs->tx); >> + mutex_unlock(&xs->mutex); >> + >> + if (copy_to_user(optval, &stats, sizeof(stats))) >> + return -EFAULT; >> + return 0; > > For forward compatibility, could allow caller to pass a struct larger > than stats and return the number of bytes filled in.
Yes definitely. Will fix right away. > The lock can also be elided with something like gnet_stats, but it is probably > taken rarely enough that that is not worth the effort, at least right now. Will put this on the ever expanding todo list for future patches ;-). Thanks: Magnus