]> 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)
commit8919a9b31eb4fb4c0a93e5fb350a626924302aa6
treed14bd9273c39e4e536f2108a182cf294d8c59120
parent18841da98100c936990ac9013d55bf6b40e1f609
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