]> git.baikalelectronics.ru Git - kernel.git/commit
tcp: Only init congestion control if not initialized already
authorNeal Cardwell <ncardwell@google.com>
Thu, 10 Sep 2020 19:35:32 +0000 (15:35 -0400)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 11 Sep 2020 03:53:01 +0000 (20:53 -0700)
commita435903dcfb8ebb2897a36f22e743656e6314f02
treed14bd9273c39e4e536f2108a182cf294d8c59120
parent1cacbe5798b9b4b84d6c85f9d4fc9486d0d3f576
tcp: Only init congestion control if not initialized already

Change tcp_init_transfer() to only initialize congestion control if it
has not been initialized already.

With this new approach, we can arrange things so that if the EBPF code
sets the congestion control by calling setsockopt(TCP_CONGESTION) then
tcp_init_transfer() will not re-initialize the CC module.

This is an approach that has the following beneficial properties:

(1) This allows CC module customizations made by the EBPF called in
    tcp_init_transfer() to persist, and not be wiped out by a later
    call to tcp_init_congestion_control() in tcp_init_transfer().

(2) Does not flip the order of EBPF and CC init, to avoid causing bugs
    for existing code upstream that depends on the current order.

(3) Does not cause 2 initializations for for CC in the case where the
    EBPF called in tcp_init_transfer() wants to set the CC to a new CC
    algorithm.

(4) Allows follow-on simplifications to the code in net/core/filter.c
    and net/ipv4/tcp_cong.c, which currently both have some complexity
    to special-case CC initialization to avoid double CC
    initialization if EBPF sets the CC.

Signed-off-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Yuchung Cheng <ycheng@google.com>
Acked-by: Kevin Yang <yyd@google.com>
Cc: Lawrence Brakmo <brakmo@fb.com>
include/net/inet_connection_sock.h
net/ipv4/tcp.c
net/ipv4/tcp_cong.c
net/ipv4/tcp_input.c