]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
net/tcp_fastopen: remove tcp_fastopen_ctx_lock
authorEric Dumazet <edumazet@google.com>
Mon, 19 Jul 2021 10:11:07 +0000 (03:11 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 20 Jul 2021 10:07:07 +0000 (12:07 +0200)
Remove the (per netns) spinlock in favor of xchg() atomic operations.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Yuchung Cheng <ycheng@google.com>
Cc: Neal Cardwell <ncardwell@google.com>
Acked-by: Wei Wang <weiwan@google.com>
Link: https://lore.kernel.org/r/20210719101107.3203943-1-eric.dumazet@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/netns/ipv4.h
net/ipv4/tcp_fastopen.c
net/ipv4/tcp_ipv4.c

index b8620519eace8191c76c41f37bd51ac0d3788bc2..2f65701a43c953bd3a9a9e3d491882cb7bb11859 100644 (file)
@@ -174,7 +174,6 @@ struct netns_ipv4 {
        int sysctl_tcp_fastopen;
        const struct tcp_congestion_ops __rcu  *tcp_congestion_control;
        struct tcp_fastopen_context __rcu *tcp_fastopen_ctx;
-       spinlock_t tcp_fastopen_ctx_lock;
        unsigned int sysctl_tcp_fastopen_blackhole_timeout;
        atomic_t tfo_active_disable_times;
        unsigned long tfo_active_disable_stamp;
index 47c32604d38fca960d2cd56f3588bfd2e390b789..1a9fbd5448a719bb5407a8d1e8fbfbe54f56f258 100644 (file)
@@ -55,12 +55,7 @@ void tcp_fastopen_ctx_destroy(struct net *net)
 {
        struct tcp_fastopen_context *ctxt;
 
-       spin_lock(&net->ipv4.tcp_fastopen_ctx_lock);
-
-       ctxt = rcu_dereference_protected(net->ipv4.tcp_fastopen_ctx,
-                               lockdep_is_held(&net->ipv4.tcp_fastopen_ctx_lock));
-       rcu_assign_pointer(net->ipv4.tcp_fastopen_ctx, NULL);
-       spin_unlock(&net->ipv4.tcp_fastopen_ctx_lock);
+       ctxt = xchg((__force struct tcp_fastopen_context **)&net->ipv4.tcp_fastopen_ctx, NULL);
 
        if (ctxt)
                call_rcu(&ctxt->rcu, tcp_fastopen_ctx_free);
@@ -89,18 +84,12 @@ int tcp_fastopen_reset_cipher(struct net *net, struct sock *sk,
                ctx->num = 1;
        }
 
-       spin_lock(&net->ipv4.tcp_fastopen_ctx_lock);
        if (sk) {
                q = &inet_csk(sk)->icsk_accept_queue.fastopenq;
-               octx = rcu_dereference_protected(q->ctx,
-                       lockdep_is_held(&net->ipv4.tcp_fastopen_ctx_lock));
-               rcu_assign_pointer(q->ctx, ctx);
+               octx = xchg((__force struct tcp_fastopen_context **)&q->ctx, ctx);
        } else {
-               octx = rcu_dereference_protected(net->ipv4.tcp_fastopen_ctx,
-                       lockdep_is_held(&net->ipv4.tcp_fastopen_ctx_lock));
-               rcu_assign_pointer(net->ipv4.tcp_fastopen_ctx, ctx);
+               octx = xchg((__force struct tcp_fastopen_context **)&net->ipv4.tcp_fastopen_ctx, ctx);
        }
-       spin_unlock(&net->ipv4.tcp_fastopen_ctx_lock);
 
        if (octx)
                call_rcu(&octx->rcu, tcp_fastopen_ctx_free);
index b9dc2d6197be8b8b03a4d052ad1c87987c7a62aa..e9321dd39cdbcb664843d4ada09a21685b93abb7 100644 (file)
@@ -2964,7 +2964,6 @@ static int __net_init tcp_sk_init(struct net *net)
        net->ipv4.sysctl_tcp_comp_sack_slack_ns = 100 * NSEC_PER_USEC;
        net->ipv4.sysctl_tcp_comp_sack_nr = 44;
        net->ipv4.sysctl_tcp_fastopen = TFO_CLIENT_ENABLE;
-       spin_lock_init(&net->ipv4.tcp_fastopen_ctx_lock);
        net->ipv4.sysctl_tcp_fastopen_blackhole_timeout = 60 * 60;
        atomic_set(&net->ipv4.tfo_active_disable_times, 0);