net: sk_msg: Simplify sk_psock initialization
authorLorenz Bauer <lmb@cloudflare.com>
Fri, 21 Aug 2020 10:29:43 +0000 (11:29 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 21 Aug 2020 22:16:11 +0000 (15:16 -0700)
commit7b219da43f94a3b4d5a8aa4cc52b75b34f0301ec
tree9e8b69676747ae4417cb3110697a45ccd5898539
parentdca5612f8eb9d0cf1dc254eb2adff1f16a588a7d
net: sk_msg: Simplify sk_psock initialization

Initializing psock->sk_proto and other saved callbacks is only
done in sk_psock_update_proto, after sk_psock_init has returned.
The logic for this is difficult to follow, and needlessly complex.

Instead, initialize psock->sk_proto whenever we allocate a new
psock. Additionally, assert the following invariants:

* The SK has no ULP: ULP does it's own finagling of sk->sk_prot
* sk_user_data is unused: we need it to store sk_psock

Protect our access to sk_user_data with sk_callback_lock, which
is what other users like reuseport arrays, etc. do.

The result is that an sk_psock is always fully initialized, and
that psock->sk_proto is always the "original" struct proto.
The latter allows us to use psock->sk_proto when initializing
IPv6 TCP / UDP callbacks for sockmap.

Signed-off-by: Lorenz Bauer <lmb@cloudflare.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20200821102948.21918-2-lmb@cloudflare.com
include/linux/skmsg.h
net/core/skmsg.c
net/core/sock_map.c
net/ipv4/tcp_bpf.c
net/ipv4/udp_bpf.c