diff options
Diffstat (limited to 'tools/testing/selftests/bpf/progs/bpf_cubic.c')
| -rw-r--r-- | tools/testing/selftests/bpf/progs/bpf_cubic.c | 74 | 
1 files changed, 41 insertions, 33 deletions
diff --git a/tools/testing/selftests/bpf/progs/bpf_cubic.c b/tools/testing/selftests/bpf/progs/bpf_cubic.c index c997e3e3d3fb..d665b8a15cc4 100644 --- a/tools/testing/selftests/bpf/progs/bpf_cubic.c +++ b/tools/testing/selftests/bpf/progs/bpf_cubic.c @@ -14,14 +14,22 @@   *    "ca->ack_cnt / delta" operation.   */ -#include <linux/bpf.h> -#include <linux/stddef.h> -#include <linux/tcp.h> -#include "bpf_tcp_helpers.h" +#include "bpf_tracing_net.h" +#include <bpf/bpf_tracing.h>  char _license[] SEC("license") = "GPL";  #define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi) +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) +static bool before(__u32 seq1, __u32 seq2) +{ +	return (__s32)(seq1-seq2) < 0; +} +#define after(seq2, seq1) 	before(seq1, seq2) + +extern __u32 tcp_slow_start(struct tcp_sock *tp, __u32 acked) __ksym; +extern void tcp_cong_avoid_ai(struct tcp_sock *tp, __u32 w, __u32 acked) __ksym;  #define BICTCP_BETA_SCALE    1024	/* Scale factor beta calculation  					 * max_cwnd = snd_cwnd * beta @@ -70,7 +78,7 @@ static const __u64 cube_factor = (__u64)(1ull << (10+3*BICTCP_HZ))  				/ (bic_scale * 10);  /* BIC TCP Parameters */ -struct bictcp { +struct bpf_bictcp {  	__u32	cnt;		/* increase cwnd by 1 after ACKs */  	__u32	last_max_cwnd;	/* last maximum snd_cwnd */  	__u32	last_cwnd;	/* the last snd_cwnd */ @@ -91,7 +99,7 @@ struct bictcp {  	__u32	curr_rtt;	/* the minimum rtt of current round */  }; -static inline void bictcp_reset(struct bictcp *ca) +static void bictcp_reset(struct bpf_bictcp *ca)  {  	ca->cnt = 0;  	ca->last_max_cwnd = 0; @@ -112,7 +120,7 @@ extern unsigned long CONFIG_HZ __kconfig;  #define USEC_PER_SEC	1000000UL  #define USEC_PER_JIFFY	(USEC_PER_SEC / HZ) -static __always_inline __u64 div64_u64(__u64 dividend, __u64 divisor) +static __u64 div64_u64(__u64 dividend, __u64 divisor)  {  	return dividend / divisor;  } @@ -120,7 +128,7 @@ static __always_inline __u64 div64_u64(__u64 dividend, __u64 divisor)  #define div64_ul div64_u64  #define BITS_PER_U64 (sizeof(__u64) * 8) -static __always_inline int fls64(__u64 x) +static int fls64(__u64 x)  {  	int num = BITS_PER_U64 - 1; @@ -153,15 +161,15 @@ static __always_inline int fls64(__u64 x)  	return num + 1;  } -static __always_inline __u32 bictcp_clock_us(const struct sock *sk) +static __u32 bictcp_clock_us(const struct sock *sk)  {  	return tcp_sk(sk)->tcp_mstamp;  } -static __always_inline void bictcp_hystart_reset(struct sock *sk) +static void bictcp_hystart_reset(struct sock *sk)  {  	struct tcp_sock *tp = tcp_sk(sk); -	struct bictcp *ca = inet_csk_ca(sk); +	struct bpf_bictcp *ca = inet_csk_ca(sk);  	ca->round_start = ca->last_ack = bictcp_clock_us(sk);  	ca->end_seq = tp->snd_nxt; @@ -169,11 +177,10 @@ static __always_inline void bictcp_hystart_reset(struct sock *sk)  	ca->sample_cnt = 0;  } -/* "struct_ops/" prefix is a requirement */ -SEC("struct_ops/bpf_cubic_init") +SEC("struct_ops")  void BPF_PROG(bpf_cubic_init, struct sock *sk)  { -	struct bictcp *ca = inet_csk_ca(sk); +	struct bpf_bictcp *ca = inet_csk_ca(sk);  	bictcp_reset(ca); @@ -184,12 +191,11 @@ void BPF_PROG(bpf_cubic_init, struct sock *sk)  		tcp_sk(sk)->snd_ssthresh = initial_ssthresh;  } -/* "struct_ops" prefix is a requirement */ -SEC("struct_ops/bpf_cubic_cwnd_event") +SEC("struct_ops")  void BPF_PROG(bpf_cubic_cwnd_event, struct sock *sk, enum tcp_ca_event event)  {  	if (event == CA_EVENT_TX_START) { -		struct bictcp *ca = inet_csk_ca(sk); +		struct bpf_bictcp *ca = inet_csk_ca(sk);  		__u32 now = tcp_jiffies32;  		__s32 delta; @@ -230,7 +236,7 @@ static const __u8 v[] = {   * Newton-Raphson iteration.   * Avg err ~= 0.195%   */ -static __always_inline __u32 cubic_root(__u64 a) +static __u32 cubic_root(__u64 a)  {  	__u32 x, b, shift; @@ -263,8 +269,7 @@ static __always_inline __u32 cubic_root(__u64 a)  /*   * Compute congestion window to use.   */ -static __always_inline void bictcp_update(struct bictcp *ca, __u32 cwnd, -					  __u32 acked) +static void bictcp_update(struct bpf_bictcp *ca, __u32 cwnd, __u32 acked)  {  	__u32 delta, bic_target, max_cnt;  	__u64 offs, t; @@ -377,11 +382,11 @@ tcp_friendliness:  	ca->cnt = max(ca->cnt, 2U);  } -/* Or simply use the BPF_STRUCT_OPS to avoid the SEC boiler plate. */ -void BPF_STRUCT_OPS(bpf_cubic_cong_avoid, struct sock *sk, __u32 ack, __u32 acked) +SEC("struct_ops") +void BPF_PROG(bpf_cubic_cong_avoid, struct sock *sk, __u32 ack, __u32 acked)  {  	struct tcp_sock *tp = tcp_sk(sk); -	struct bictcp *ca = inet_csk_ca(sk); +	struct bpf_bictcp *ca = inet_csk_ca(sk);  	if (!tcp_is_cwnd_limited(sk))  		return; @@ -397,10 +402,11 @@ void BPF_STRUCT_OPS(bpf_cubic_cong_avoid, struct sock *sk, __u32 ack, __u32 acke  	tcp_cong_avoid_ai(tp, ca->cnt, acked);  } -__u32 BPF_STRUCT_OPS(bpf_cubic_recalc_ssthresh, struct sock *sk) +SEC("struct_ops") +__u32 BPF_PROG(bpf_cubic_recalc_ssthresh, struct sock *sk)  {  	const struct tcp_sock *tp = tcp_sk(sk); -	struct bictcp *ca = inet_csk_ca(sk); +	struct bpf_bictcp *ca = inet_csk_ca(sk);  	ca->epoch_start = 0;	/* end of epoch */ @@ -414,7 +420,8 @@ __u32 BPF_STRUCT_OPS(bpf_cubic_recalc_ssthresh, struct sock *sk)  	return max((tp->snd_cwnd * beta) / BICTCP_BETA_SCALE, 2U);  } -void BPF_STRUCT_OPS(bpf_cubic_state, struct sock *sk, __u8 new_state) +SEC("struct_ops") +void BPF_PROG(bpf_cubic_state, struct sock *sk, __u8 new_state)  {  	if (new_state == TCP_CA_Loss) {  		bictcp_reset(inet_csk_ca(sk)); @@ -433,7 +440,7 @@ void BPF_STRUCT_OPS(bpf_cubic_state, struct sock *sk, __u8 new_state)   * We apply another 100% factor because @rate is doubled at this point.   * We cap the cushion to 1ms.   */ -static __always_inline __u32 hystart_ack_delay(struct sock *sk) +static __u32 hystart_ack_delay(struct sock *sk)  {  	unsigned long rate; @@ -444,10 +451,10 @@ static __always_inline __u32 hystart_ack_delay(struct sock *sk)  		   div64_ul((__u64)GSO_MAX_SIZE * 4 * USEC_PER_SEC, rate));  } -static __always_inline void hystart_update(struct sock *sk, __u32 delay) +static void hystart_update(struct sock *sk, __u32 delay)  {  	struct tcp_sock *tp = tcp_sk(sk); -	struct bictcp *ca = inet_csk_ca(sk); +	struct bpf_bictcp *ca = inet_csk_ca(sk);  	__u32 threshold;  	if (hystart_detect & HYSTART_ACK_TRAIN) { @@ -492,11 +499,11 @@ static __always_inline void hystart_update(struct sock *sk, __u32 delay)  int bpf_cubic_acked_called = 0; -void BPF_STRUCT_OPS(bpf_cubic_acked, struct sock *sk, -		    const struct ack_sample *sample) +SEC("struct_ops") +void BPF_PROG(bpf_cubic_acked, struct sock *sk, const struct ack_sample *sample)  {  	const struct tcp_sock *tp = tcp_sk(sk); -	struct bictcp *ca = inet_csk_ca(sk); +	struct bpf_bictcp *ca = inet_csk_ca(sk);  	__u32 delay;  	bpf_cubic_acked_called = 1; @@ -524,7 +531,8 @@ void BPF_STRUCT_OPS(bpf_cubic_acked, struct sock *sk,  extern __u32 tcp_reno_undo_cwnd(struct sock *sk) __ksym; -__u32 BPF_STRUCT_OPS(bpf_cubic_undo_cwnd, struct sock *sk) +SEC("struct_ops") +__u32 BPF_PROG(bpf_cubic_undo_cwnd, struct sock *sk)  {  	return tcp_reno_undo_cwnd(sk);  }  |