Proc socket stats use sk_prot->inuse_idx value to record inuse sock stats. We currently do not set this correctly from sockmap side. The result is reading sock stats '/proc/net/sockstat' gives incorrect values. The socket counter is incremented correctly, but because we don't set the counter correctly when we replace sk_prot we may omit the decrement. Fixes: 604326b41a6fb ("bpf, sockmap: convert to generic sk_msg interface") Signed-off-by: John Fastabend <john.fastabend@xxxxxxxxx> --- net/core/sock_map.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/net/core/sock_map.c b/net/core/sock_map.c index 60decd6420ca..29e7bae65db5 100644 --- a/net/core/sock_map.c +++ b/net/core/sock_map.c @@ -221,7 +221,7 @@ static int sock_map_link(struct bpf_map *map, struct sock *sk) struct bpf_prog *skb_verdict = NULL; struct bpf_prog *msg_parser = NULL; struct sk_psock *psock; - int ret; + int ret, idx; /* Only sockets we can redirect into/from in BPF need to hold * refs to parser/verdict progs and have their sk_data_ready @@ -293,9 +293,11 @@ static int sock_map_link(struct bpf_map *map, struct sock *sk) if (msg_parser) psock_set_prog(&psock->progs.msg_parser, msg_parser); + idx = sk->sk_prot->inuse_idx; ret = sock_map_init_proto(sk, psock); if (ret < 0) goto out_drop; + sk->sk_prot->inuse_idx = idx; write_lock_bh(&sk->sk_callback_lock); if (stream_parser && stream_verdict && !psock->saved_data_ready) { -- 2.25.1