Messages in this thread Patch in this message | | | From | Eric Dumazet <> | Date | Fri, 2 Dec 2022 06:05:28 +0100 | Subject | Re: [PATCH v6 3/5] net/tcp: Disable TCP-MD5 static key on tcp_md5sig_info destruction |
| |
On Thu, Dec 1, 2022 at 8:38 PM Eric Dumazet <edumazet@google.com> wrote: > > On Wed, Nov 23, 2022 at 6:39 PM Dmitry Safonov <dima@arista.com> wrote: > > > > To do that, separate two scenarios: > > - where it's the first MD5 key on the system, which means that enabling > > of the static key may need to sleep; > > - copying of an existing key from a listening socket to the request > > socket upon receiving a signed TCP segment, where static key was > > already enabled (when the key was added to the listening socket). > > > > Now the life-time of the static branch for TCP-MD5 is until: > > - last tcp_md5sig_info is destroyed > > - last socket in time-wait state with MD5 key is closed. > > > > Which means that after all sockets with TCP-MD5 keys are gone, the > > system gets back the performance of disabled md5-key static branch. > > > > While at here, provide static_key_fast_inc() helper that does ref > > counter increment in atomic fashion (without grabbing cpus_read_lock() > > on CONFIG_JUMP_LABEL=y). This is needed to add a new user for > > a static_key when the caller controls the lifetime of another user. > > > > Signed-off-by: Dmitry Safonov <dima@arista.com> > > Acked-by: Jakub Kicinski <kuba@kernel.org> > > Reviewed-by: Eric Dumazet <edumazet@google.com>
Hmm, I missed two kfree_rcu(key) calls, I will send the following fix:
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 7fae586405cfb10011a0674289280bf400dfa8d8..8320d0ecb13ae1e3e259f3c13a4c2797fbd984a5 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1245,7 +1245,7 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,
md5sig = rcu_dereference_protected(tp->md5sig_info, lockdep_sock_is_held(sk)); rcu_assign_pointer(tp->md5sig_info, NULL); - kfree_rcu(md5sig); + kfree_rcu(md5sig, rcu); return -EUSERS; } } @@ -1271,7 +1271,7 @@ int tcp_md5_key_copy(struct sock *sk, const union tcp_md5_addr *addr, md5sig = rcu_dereference_protected(tp->md5sig_info, lockdep_sock_is_held(sk)); net_warn_ratelimited("Too many TCP-MD5 keys in the system\n"); rcu_assign_pointer(tp->md5sig_info, NULL); - kfree_rcu(md5sig); + kfree_rcu(md5sig, rcu); return -EUSERS; } }
| |