net/tcp: Separate tcp_md5sig_info allocation into tcp_md5sig_info_add()
Add a helper to allocate tcp_md5sig_info, that will help later to do/allocate things when info allocated, once per socket. Signed-off-by: Dmitry Safonov <dima@arista.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Acked-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
eb8c507296
commit
f62c7517ff
@ -1161,6 +1161,24 @@ struct tcp_md5sig_key *tcp_v4_md5_lookup(const struct sock *sk,
|
||||
}
|
||||
EXPORT_SYMBOL(tcp_v4_md5_lookup);
|
||||
|
||||
static int tcp_md5sig_info_add(struct sock *sk, gfp_t gfp)
|
||||
{
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
struct tcp_md5sig_info *md5sig;
|
||||
|
||||
if (rcu_dereference_protected(tp->md5sig_info, lockdep_sock_is_held(sk)))
|
||||
return 0;
|
||||
|
||||
md5sig = kmalloc(sizeof(*md5sig), gfp);
|
||||
if (!md5sig)
|
||||
return -ENOMEM;
|
||||
|
||||
sk_gso_disable(sk);
|
||||
INIT_HLIST_HEAD(&md5sig->head);
|
||||
rcu_assign_pointer(tp->md5sig_info, md5sig);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This can be called on a newly created socket, from other files */
|
||||
int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,
|
||||
int family, u8 prefixlen, int l3index, u8 flags,
|
||||
@ -1191,17 +1209,11 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (tcp_md5sig_info_add(sk, gfp))
|
||||
return -ENOMEM;
|
||||
|
||||
md5sig = rcu_dereference_protected(tp->md5sig_info,
|
||||
lockdep_sock_is_held(sk));
|
||||
if (!md5sig) {
|
||||
md5sig = kmalloc(sizeof(*md5sig), gfp);
|
||||
if (!md5sig)
|
||||
return -ENOMEM;
|
||||
|
||||
sk_gso_disable(sk);
|
||||
INIT_HLIST_HEAD(&md5sig->head);
|
||||
rcu_assign_pointer(tp->md5sig_info, md5sig);
|
||||
}
|
||||
|
||||
key = sock_kmalloc(sk, sizeof(*key), gfp | __GFP_ZERO);
|
||||
if (!key)
|
||||
|
Loading…
Reference in New Issue
Block a user