mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
bpf: make tcp_tso_autosize() available to BPF congestion controls
Expose tcp_tso_autosize() as a BPF kfunc and register it in the TCP congestion-control kfunc set. This allows BPF congestion controls to reuse the kernel TSO autosizing logic while applying their own minimum TSO segment policy. To make the kfunc robust against BPF-provided inputs, min_tso_segs is sanitized to at least 1 and mss_now == 0 returns the sanitized minimum value instead of performing autosizing. Signed-off-by: Chia-Yu Chang <chia-yu.chang@nokia-bell-labs.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
cb145191e9
commit
f69a094441
|
|
@ -194,6 +194,7 @@ BTF_ID_FLAGS(func, tcp_reno_cong_avoid)
|
|||
BTF_ID_FLAGS(func, tcp_reno_undo_cwnd)
|
||||
BTF_ID_FLAGS(func, tcp_slow_start)
|
||||
BTF_ID_FLAGS(func, tcp_cong_avoid_ai)
|
||||
BTF_ID_FLAGS(func, tcp_tso_autosize)
|
||||
BTF_KFUNCS_END(bpf_tcp_ca_check_kfunc_ids)
|
||||
|
||||
static const struct btf_kfunc_id_set bpf_tcp_ca_kfunc_set = {
|
||||
|
|
|
|||
|
|
@ -2252,13 +2252,21 @@ static bool tcp_nagle_check(bool partial, const struct tcp_sock *tp,
|
|||
* in bigger TSO bursts. We we cut the RTT-based allowance in half
|
||||
* for every 2^9 usec (aka 512 us) of RTT, so that the RTT-based allowance
|
||||
* is below 1500 bytes after 6 * ~500 usec = 3ms.
|
||||
*
|
||||
* The min_tso_segs is floored to 1 to avoid surprising conversion. Also,
|
||||
* BPF callers may pass mss_now == 0. In that case the function returns the
|
||||
* sanitized min_tso_segs value and skips autosizing.
|
||||
*/
|
||||
u32 tcp_tso_autosize(const struct sock *sk, unsigned int mss_now,
|
||||
int min_tso_segs)
|
||||
__bpf_kfunc u32 tcp_tso_autosize(const struct sock *sk, unsigned int mss_now,
|
||||
int min_tso_segs)
|
||||
{
|
||||
u32 min_tso = max(min_tso_segs, 1);
|
||||
unsigned long bytes;
|
||||
u32 r;
|
||||
|
||||
if (unlikely(!mss_now))
|
||||
return min_tso;
|
||||
|
||||
bytes = READ_ONCE(sk->sk_pacing_rate) >> READ_ONCE(sk->sk_pacing_shift);
|
||||
|
||||
r = tcp_min_rtt(tcp_sk(sk)) >> READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_tso_rtt_log);
|
||||
|
|
@ -2267,7 +2275,7 @@ u32 tcp_tso_autosize(const struct sock *sk, unsigned int mss_now,
|
|||
|
||||
bytes = min_t(unsigned long, bytes, sk->sk_gso_max_size);
|
||||
|
||||
return max_t(u32, bytes / mss_now, min_tso_segs);
|
||||
return max_t(u32, bytes / mss_now, min_tso);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tcp_tso_autosize);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user