Priyaranjan Jha
610058f519
tcp_bbr: adapt cwnd based on ack aggregation estimation
...
commit 78dc70ebaa38aa303274e333be6c98eef87619e2 upstream.
Aggregation effects are extremely common with wifi, cellular, and cable
modem link technologies, ACK decimation in middleboxes, and LRO and GRO
in receiving hosts. The aggregation can happen in either direction,
data or ACKs, but in either case the aggregation effect is visible
to the sender in the ACK stream.
Previously BBR's sending was often limited by cwnd under severe ACK
aggregation/decimation because BBR sized the cwnd at 2*BDP. If packets
were acked in bursts after long delays (e.g. one ACK acking 5*BDP after
5*RTT), BBR's sending was halted after sending 2*BDP over 2*RTT, leaving
the bottleneck idle for potentially long periods. Note that loss-based
congestion control does not have this issue because when facing
aggregation it continues increasing cwnd after bursts of ACKs, growing
cwnd until the buffer is full.
To achieve good throughput in the presence of aggregation effects, this
algorithm allows the BBR sender to put extra data in flight to keep the
bottleneck utilized during silences in the ACK stream that it has evidence
to suggest were caused by aggregation.
A summary of the algorithm: when a burst of packets are acked by a
stretched ACK or a burst of ACKs or both, BBR first estimates the expected
amount of data that should have been acked, based on its estimated
bandwidth. Then the surplus ("extra_acked") is recorded in a windowed-max
filter to estimate the recent level of observed ACK aggregation. Then cwnd
is increased by the ACK aggregation estimate. The larger cwnd avoids BBR
being cwnd-limited in the face of ACK silences that recent history suggests
were caused by aggregation. As a sanity check, the ACK aggregation degree
is upper-bounded by the cwnd (at the time of measurement) and a global max
of BW * 100ms. The algorithm is further described by the following
presentation:
https://datatracker.ietf.org/meeting/101/materials/slides-101-iccrg-an-update-on-bbr-work-at-google-00
In our internal testing, we observed a significant increase in BBR
throughput (measured using netperf), in a basic wifi setup.
- Host1 (sender on ethernet) -> AP -> Host2 (receiver on wifi)
- 2.4 GHz -> BBR before: ~73 Mbps; BBR after: ~102 Mbps; CUBIC: ~100 Mbps
- 5.0 GHz -> BBR before: ~362 Mbps; BBR after: ~593 Mbps; CUBIC: ~601 Mbps
Also, this code is running globally on YouTube TCP connections and produced
significant bandwidth increases for YouTube traffic.
This is based on Ian Swett's max_ack_height_ algorithm from the
QUIC BBR implementation.
Signed-off-by: Priyaranjan Jha <priyarjha@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-09-26 18:01:32 +02:00
..
9p
9p: Add refcount to p9_req_t
2019-07-03 13:14:42 +02:00
bluetooth
Bluetooth: Align minimum encryption key size for LE and BR/EDR connections
2019-06-25 11:36:01 +08:00
caif
caif: reduce stack size with KASAN
2018-01-19 14:02:12 -05:00
iucv
Revert changes to convert to ->poll_mask() and aio IOCB_CMD_POLL
2018-06-28 10:40:47 -07:00
netfilter
netfilter: nf_tables: fix destination register zeroing
2020-09-09 19:04:25 +02:00
netns
tcp: add tcp_min_snd_mss sysctl
2019-06-17 19:51:56 +02:00
nfc
nfc: nci: Potential off by one in ->pipes[] array
2019-05-16 19:41:27 +02:00
phonet
phonet: fix building with clang
2019-03-23 20:09:51 +01:00
sctp
sctp: Don't advertise IPv4 addresses if ipv6only is set on the socket
2020-06-30 23:17:05 -04:00
tc_act
net/sched: don't dereference a->goto_chain to read the chain index
2019-05-04 09:20:18 +02:00
6lowpan.h
act_api.h
net sched: fix reporting the first-time use timestamp
2020-06-03 08:19:15 +02:00
addrconf.h
ipv6: fix memory leaks on IPV6_ADDRFORM path
2020-08-11 15:32:34 +02:00
af_ieee802154.h
ieee802154: add rx LQI from userspace
2018-07-13 12:18:18 -04:00
af_rxrpc.h
rxrpc: Push iov_iter up from rxrpc_kernel_recv_data() to caller
2018-08-03 12:46:20 -07:00
af_unix.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
af_vsock.h
vsock: split dwork to avoid reinitializations
2018-08-07 12:39:13 -07:00
ah.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
arp.h
ipv4: Define __ipv4_neigh_lookup_noref when CONFIG_INET is disabled
2019-06-11 12:20:57 +02:00
atmclip.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
ax25.h
ax25: fix possible use-after-free
2019-02-23 09:07:27 +01:00
ax88796.h
net-next: ax88796: add interrupt status callback to platform data
2018-04-19 16:11:11 -04:00
bond_3ad.h
include/net/bond_3ad: Simplify the code by using the ARRAY_SIZE
2018-08-04 13:23:15 -07:00
bond_alb.h
bond_options.h
bonding.h
bonding: fix state transition issue in link monitoring
2019-11-12 19:20:26 +01:00
busy_poll.h
net: annotate lockless accesses to sk->sk_napi_id
2019-11-10 11:27:39 +01:00
calipso.h
net, calipso: convert calipso_doi.refcount from atomic_t to refcount_t
2017-07-04 22:35:16 +01:00
cfg80211-wext.h
cfg80211.h
cfg80211: Fix radar event during another phy CAC
2020-02-05 14:43:46 +00:00
cfg802154.h
checksum.h
cipso_ipv4.h
net, ipv4: convert cipso_v4_doi.refcount from atomic_t to refcount_t
2017-07-04 01:29:04 -07:00
cls_cgroup.h
codel.h
codel_impl.h
codel_qdisc.h
compat.h
net: remove compat_sys_*() prototypes from net/compat.h
2018-04-02 20:16:17 +02:00
datalink.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
dcbevent.h
dcbnl.h
net: dcb: Add priority-to-DSCP map getters
2018-07-27 13:17:50 -07:00
devlink.h
devlink: Add helper function for safely copy string param
2018-10-10 10:19:10 -07:00
dn.h
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
2017-11-04 09:26:51 +09:00
dn_dev.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
dn_fib.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
dn_neigh.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
dn_nsp.h
net/decnet: Convert timers to use timer_setup()
2017-10-18 12:39:36 +01:00
dn_route.h
decnet: Move dn_next into decnet route structure.
2017-11-30 09:54:25 -05:00
dsa.h
net: dsa: Remove VLA usage
2018-07-18 15:08:31 -07:00
dsfield.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
dst.h
net: Added pointer check for dst->ops->neigh_lookup in dst_neigh_lookup_skb
2020-07-22 09:31:59 +02:00
dst_cache.h
net: core: dst_cache_set_ip6: Rename 'addr' parameter to 'saddr' for consistency
2018-03-05 12:52:45 -05:00
dst_metadata.h
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
2017-11-04 09:26:51 +09:00
dst_ops.h
net: add bool confirm_neigh parameter for dst_ops.update_pmtu
2020-01-04 19:13:37 +01:00
erspan.h
erspan: set bso bit based on mirrored packet's len
2018-05-20 18:31:42 -04:00
esp.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
ethoc.h
inet: whitespace cleanup
2018-02-28 11:43:28 -05:00
failover.h
net: Introduce generic failover module
2018-05-28 22:59:54 -04:00
fib_notifier.h
net: Add extack to fib_notifier_info
2017-11-01 11:50:43 +09:00
fib_rules.h
fib: add missing attribute validation for tun_id
2020-03-18 07:14:14 +01:00
firewire.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
flow.h
xfrm: Remove xfrmi interface ID from flowi
2018-07-20 10:14:41 +02:00
flow_dissector.h
net: sched: correct flower port blocking
2020-03-05 16:42:16 +01:00
fou.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
fq.h
net/flow_dissector: switch to siphash
2019-11-10 11:27:54 +01:00
fq_impl.h
net/fq_impl: Switch to kvmalloc() for memory allocation
2019-12-05 09:19:45 +01:00
garp.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
gen_stats.h
net: core: protect rate estimator statistics pointer with lock
2018-08-11 12:37:10 -07:00
genetlink.h
genetlink: remove genl_bind
2020-07-22 09:31:58 +02:00
geneve.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
gre.h
net: GRE: Add is_gretap_dev, is_ip6gretap_dev
2018-02-27 14:46:26 -05:00
gro_cells.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
gtp.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
gue.h
fou: fix some member types in guehdr
2017-12-11 14:10:06 -05:00
hwbm.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
icmp.h
net: Add __icmp_send helper.
2019-03-10 07:17:19 +01:00
ieee80211_radiotap.h
radiotap: add structs for HE
2018-06-15 14:04:00 +02:00
ieee802154_netdev.h
if_inet6.h
net/ipv6: Add support for specifying metric of connected routes
2018-05-29 10:12:45 -04:00
ife.h
net: sched: ife: handle malformed tlv length
2018-04-22 21:12:00 -04:00
ila.h
inet6_connection_sock.h
inet6_hashtables.h
net: ipv6: add second dif to inet6 socket lookups
2017-08-07 11:39:22 -07:00
inet_common.h
net: Convert GRO SKB handling to list_head.
2018-06-26 11:33:04 +09:00
inet_connection_sock.h
tcp_bbr: adapt cwnd based on ack aggregation estimation
2020-09-26 18:01:32 +02:00
inet_ecn.h
sched: consistently handle layer3 header accesses in the presence of VLANs
2020-07-22 09:32:00 +02:00
inet_frag.h
net: IP defrag: encapsulate rbtree defrag code into callable functions
2019-04-27 09:36:33 +02:00
inet_hashtables.h
tcp/dccp: fix possible race __inet_lookup_established()
2020-01-04 19:13:41 +01:00
inet_sock.h
inet: make sure to grab rcu_read_lock before using ireq->ireq_opt
2018-10-02 15:52:12 -07:00
inet_timewait_sock.h
net-tcp: remove useless tw_timeout field
2018-06-05 10:45:24 -04:00
inetpeer.h
net: ipv4: use a dedicated counter for icmp_v4 redirect packets
2019-02-23 09:07:24 +01:00
ip.h
inet: protect against too small mtu values.
2019-12-21 10:57:08 +01:00
ip6_checksum.h
ip6_fib.h
ipv6: fix the check before getting the cookie in rt6_get_cookie
2019-06-11 12:20:48 +02:00
ip6_route.h
net: ipv6: do not consider routes via gateways for anycast address check
2020-04-21 09:03:04 +02:00
ip6_tunnel.h
ip6_tunnel: allow not to count pkts on tstats by passing dev as NULL
2019-07-14 08:11:14 +02:00
ip_fib.h
net: ipv4: Fix memory leak in network namespace dismantle
2019-01-31 08:14:32 +01:00
ip_tunnels.h
ip: validate header length on virtual device xmit
2019-01-09 17:38:31 +01:00
ip_vs.h
ipvs: allow connection reuse for unconfirmed conntrack
2020-08-19 08:14:56 +02:00
ipcomp.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
ipconfig.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
ipv6.h
net: ipv6: add net argument to ip6_dst_lookup_flow
2020-04-29 16:31:16 +02:00
ipv6_frag.h
ip6: fix skb leak in ip6frag_expire_frag_queue()
2019-07-10 09:53:46 +02:00
ipx.h
bonding/alb: properly access headers in bond_alb_xmit()
2020-02-11 04:34:14 -08:00
iw_handler.h
net: Spelling s/stucture/structure/
2018-03-27 09:51:23 +02:00
kcm.h
l3mdev.h
ipvlan, l3mdev: fix broken l3s mode wrt local routes
2019-02-06 17:30:06 +01:00
lag.h
net: Add lag.h, net_lag_port_dev_txable()
2018-07-11 23:10:19 -07:00
lapb.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
lib80211.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
llc.h
llc: avoid blocking in llc_sap_close()
2019-11-20 18:46:35 +01:00
llc_c_ac.h
net: LLC: Convert timers to use timer_setup()
2017-10-25 12:06:25 +09:00
llc_c_ev.h
llc_c_st.h
llc_conn.h
llc: fix sk_buff leak in llc_conn_service()
2019-11-06 13:06:23 +01:00
llc_if.h
llc_pdu.h
llc_s_ac.h
llc_s_ev.h
llc_s_st.h
llc_sap.h
lwtunnel.h
net: Move ipv4 set_lwt_redirect helper to lwtunnel
2018-02-14 14:43:32 -05:00
mac80211.h
mac80211: add support for HE
2018-06-18 22:40:32 +02:00
mac802154.h
mip6.h
mld.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
mpls.h
mpls_iptunnel.h
mrp.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
ncsi.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
ndisc.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
neighbour.h
net: add annotations on hh->hh_len lockless accesses
2020-01-09 10:19:09 +01:00
net_failover.h
net: Introduce net_failover driver
2018-05-28 22:59:54 -04:00
net_namespace.h
netns: fix GFP flags in rtnl_net_notifyid()
2019-11-10 11:27:42 +01:00
net_ratelimit.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
netevent.h
net: ipv4: Notify about changes to ip_forward_update_priority
2018-08-01 09:52:30 -07:00
netlabel.h
net: convert netlbl_lsm_cache.refcount from atomic_t to refcount_t
2017-07-01 07:39:09 -07:00
netlink.h
netlink: fix typo in nla_parse_nested() comment
2018-09-29 11:48:26 -07:00
netprio_cgroup.h
netrom.h
net: netrom: Fix error cleanup path of nr_proto_init
2019-05-02 09:58:57 +02:00
nexthop.h
net: fix rtnh_ok()
2018-04-07 22:32:31 -04:00
nl802154.h
nsh.h
openvswitch: enable NSH support
2017-11-08 16:12:33 +09:00
p8022.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
page_pool.h
xdp: introduce xdp_return_frame_rx_napi
2018-05-24 18:36:15 -07:00
ping.h
ipv{4,6}/ping: simplify proc file creation
2018-05-16 07:23:35 +02:00
pkt_cls.h
net_sched: fix ops->bind_class() implementations
2020-02-01 09:37:06 +00:00
pkt_sched.h
sched: consistently handle layer3 header accesses in the presence of VLANs
2020-07-22 09:32:00 +02:00
pptp.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
protocol.h
IPv4: early demux can return an error code
2017-10-01 03:55:47 +01:00
psample.h
net: sched: act_sample: fix psample group handling on overwrite
2019-09-10 10:33:38 +01:00
psnap.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
raw.h
ipv{4,6}/raw: simplify ѕeq_file code
2018-05-16 07:23:35 +02:00
rawv6.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
red.h
net_sched: red: Avoid illegal values
2017-12-05 14:37:13 -05:00
regulatory.h
cfg80211: make wmm_rule part of the reg_rule structure
2018-08-28 11:11:47 +02:00
request_sock.h
net: add {READ|WRITE}_ONCE() annotations on ->rskq_accept_head
2020-01-27 14:51:18 +01:00
rose.h
proc: introduce proc_create_seq{,_data}
2018-05-16 07:23:35 +02:00
route.h
net/ipv4: Add support for specifying metric of connected routes
2018-05-29 10:12:45 -04:00
rsi_91x.h
Bluetooth: btrsi: add new rsi bluetooth driver
2018-03-13 18:37:02 +02:00
rtnetlink.h
rtnetlink: Remove VLA usage
2018-05-31 22:48:46 -04:00
sch_generic.h
net_sched: fix ops->bind_class() implementations
2020-02-01 09:37:06 +00:00
scm.h
pids: Compute task_tgid using signal->leader_pid
2018-07-21 10:43:12 -05:00
secure_seq.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
seg6.h
rhashtable: split rhashtable.h
2018-06-22 13:43:27 +09:00
seg6_hmac.h
rhashtable: split rhashtable.h
2018-06-22 13:43:27 +09:00
seg6_local.h
bpf: add End.DT6 action to bpf_lwt_seg6_action helper
2018-07-31 09:22:48 +02:00
slhc_vj.h
slip: Check if rstate is initialized before uncompressing
2018-04-11 10:33:46 -04:00
smc.h
net/smc: add pnetid support for SMC-D and ISM
2018-06-30 20:42:25 +09:00
snmp.h
sock.h
net/compat: Add missing sock updates for SCM_RIGHTS
2020-08-21 11:05:32 +02:00
sock_reuseport.h
udp: correct reuseport selection with connected sockets
2019-09-21 07:16:43 +02:00
Space.h
net/mac89x0: Convert to platform_driver
2018-03-01 21:21:36 -05:00
stp.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
strparser.h
strparser: Add __strp_unpause and use it in ktls.
2018-06-06 14:07:53 -04:00
switchdev.h
switchdev: Add fdb.added_by_user to switchdev notifications
2018-05-03 13:46:47 -04:00
tcp.h
tcp: fix SO_RCVLOWAT hangs with fat skbs
2020-05-20 08:18:38 +02:00
tcp_states.h
tcp: remove the hardcode in the definition of TCPF Macro
2018-02-21 15:06:05 -05:00
timewait_sock.h
tipc.h
flow_dissector: do not rely on implicit casts
2018-05-08 00:02:41 -04:00
tls.h
net/tls: make sure offload also gets the keys wiped
2019-07-28 08:29:27 +02:00
transp_v6.h
ipv6: fold sockcm_cookie into ipcm6_cookie
2018-07-07 10:58:49 +09:00
tso.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
tun_proto.h
vxlan: factor out VXLAN-GPE next protocol
2017-08-29 15:16:52 -07:00
udp.h
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
2018-07-03 10:29:26 +09:00
udp_tunnel.h
net: Convert GRO SKB handling to list_head.
2018-06-26 11:33:04 +09:00
udplite.h
udplite: fix partial checksum initialization
2018-02-16 15:57:42 -05:00
vsock_addr.h
vxlan.h
vxlan: add ttl inherit support
2018-04-17 13:53:13 -04:00
wext.h
lift handling of SIOCIW... out of dev_ioctl()
2018-01-24 19:13:45 -05:00
wimax.h
x25.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
x25device.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
xdp.h
xdp: Helper function to clear kernel pointers in xdp_frame
2018-08-10 16:12:20 +02:00
xdp_sock.h
xsk: fix umem memory leak on cleanup
2019-05-04 09:20:12 +02:00
xfrm.h
xfrm: Fix crash when the hold queue is used.
2020-08-05 10:06:02 +02:00