Commit 8b52cc2a authored by Martin KaFai Lau's avatar Martin KaFai Lau

Merge branch 'Allow BPF TCP CCs to write app_limited'

Yixin Shen says:

====================

This series allow BPF TCP CCs to write app_limited of struct
tcp_sock. A built-in CC or one from a kernel module is already
able to write to app_limited of struct tcp_sock. Until now,
a BPF CC doesn't have write access to this member of struct
tcp_sock.

v2:
 - Merge the test of writing app_limited into the test of
   writing sk_pacing. (Martin KaFai Lau)
====================
Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
parents d8d8b008 4239561b
...@@ -113,6 +113,9 @@ static int bpf_tcp_ca_btf_struct_access(struct bpf_verifier_log *log, ...@@ -113,6 +113,9 @@ static int bpf_tcp_ca_btf_struct_access(struct bpf_verifier_log *log,
case offsetof(struct tcp_sock, ecn_flags): case offsetof(struct tcp_sock, ecn_flags):
end = offsetofend(struct tcp_sock, ecn_flags); end = offsetofend(struct tcp_sock, ecn_flags);
break; break;
case offsetof(struct tcp_sock, app_limited):
end = offsetofend(struct tcp_sock, app_limited);
break;
default: default:
bpf_log(log, "no write support to tcp_sock at off %d\n", off); bpf_log(log, "no write support to tcp_sock at off %d\n", off);
return -EACCES; return -EACCES;
......
...@@ -16,6 +16,16 @@ static inline struct tcp_sock *tcp_sk(const struct sock *sk) ...@@ -16,6 +16,16 @@ static inline struct tcp_sock *tcp_sk(const struct sock *sk)
return (struct tcp_sock *)sk; return (struct tcp_sock *)sk;
} }
static inline unsigned int tcp_left_out(const struct tcp_sock *tp)
{
return tp->sacked_out + tp->lost_out;
}
static inline unsigned int tcp_packets_in_flight(const struct tcp_sock *tp)
{
return tp->packets_out - tcp_left_out(tp) + tp->retrans_out;
}
SEC("struct_ops/write_sk_pacing_init") SEC("struct_ops/write_sk_pacing_init")
void BPF_PROG(write_sk_pacing_init, struct sock *sk) void BPF_PROG(write_sk_pacing_init, struct sock *sk)
{ {
...@@ -31,11 +41,12 @@ SEC("struct_ops/write_sk_pacing_cong_control") ...@@ -31,11 +41,12 @@ SEC("struct_ops/write_sk_pacing_cong_control")
void BPF_PROG(write_sk_pacing_cong_control, struct sock *sk, void BPF_PROG(write_sk_pacing_cong_control, struct sock *sk,
const struct rate_sample *rs) const struct rate_sample *rs)
{ {
const struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
unsigned long rate = unsigned long rate =
((tp->snd_cwnd * tp->mss_cache * USEC_PER_SEC) << 3) / ((tp->snd_cwnd * tp->mss_cache * USEC_PER_SEC) << 3) /
(tp->srtt_us ?: 1U << 3); (tp->srtt_us ?: 1U << 3);
sk->sk_pacing_rate = min(rate, sk->sk_max_pacing_rate); sk->sk_pacing_rate = min(rate, sk->sk_max_pacing_rate);
tp->app_limited = (tp->delivered + tcp_packets_in_flight(tp)) ?: 1;
} }
SEC("struct_ops/write_sk_pacing_ssthresh") SEC("struct_ops/write_sk_pacing_ssthresh")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment