Skip to content

Commit

Permalink
net/tcp: Separate tcp_md5sig_info allocation into tcp_md5sig_info_add()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
0x7f454c46 authored and intel-lab-lkp committed Jul 26, 2022
1 parent 0546532 commit b6cfe5c
Showing 1 changed file with 21 additions and 9 deletions.
30 changes: 21 additions & 9 deletions net/ipv4/tcp_ipv4.c
Expand Up @@ -1152,6 +1152,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,
Expand Down Expand Up @@ -1182,17 +1200,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)
Expand Down

0 comments on commit b6cfe5c

Please sign in to comment.