mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-24 07:31:41 +00:00
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
This commit is contained in:
parent
dca5612f8e
commit
7b219da43f
5 changed files with 41 additions and 46 deletions
|
@ -184,8 +184,6 @@ static int sock_map_init_proto(struct sock *sk, struct sk_psock *psock)
|
|||
{
|
||||
struct proto *prot;
|
||||
|
||||
sock_owned_by_me(sk);
|
||||
|
||||
switch (sk->sk_type) {
|
||||
case SOCK_STREAM:
|
||||
prot = tcp_bpf_get_proto(sk, psock);
|
||||
|
@ -272,8 +270,8 @@ static int sock_map_link(struct bpf_map *map, struct sk_psock_progs *progs,
|
|||
}
|
||||
} else {
|
||||
psock = sk_psock_init(sk, map->numa_node);
|
||||
if (!psock) {
|
||||
ret = -ENOMEM;
|
||||
if (IS_ERR(psock)) {
|
||||
ret = PTR_ERR(psock);
|
||||
goto out_progs;
|
||||
}
|
||||
}
|
||||
|
@ -322,8 +320,8 @@ static int sock_map_link_no_progs(struct bpf_map *map, struct sock *sk)
|
|||
|
||||
if (!psock) {
|
||||
psock = sk_psock_init(sk, map->numa_node);
|
||||
if (!psock)
|
||||
return -ENOMEM;
|
||||
if (IS_ERR(psock))
|
||||
return PTR_ERR(psock);
|
||||
}
|
||||
|
||||
ret = sock_map_init_proto(sk, psock);
|
||||
|
@ -478,8 +476,6 @@ static int sock_map_update_common(struct bpf_map *map, u32 idx,
|
|||
return -EINVAL;
|
||||
if (unlikely(idx >= map->max_entries))
|
||||
return -E2BIG;
|
||||
if (inet_csk_has_ulp(sk))
|
||||
return -EINVAL;
|
||||
|
||||
link = sk_psock_init_link();
|
||||
if (!link)
|
||||
|
@ -855,8 +851,6 @@ static int sock_hash_update_common(struct bpf_map *map, void *key,
|
|||
WARN_ON_ONCE(!rcu_read_lock_held());
|
||||
if (unlikely(flags > BPF_EXIST))
|
||||
return -EINVAL;
|
||||
if (inet_csk_has_ulp(sk))
|
||||
return -EINVAL;
|
||||
|
||||
link = sk_psock_init_link();
|
||||
if (!link)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue