Merge branch 'bpf: add mrtt and srtt as ctx->args for BPF_SOCK_OPS_RTT_CB'
Philo Lu says: ==================== These provides more information about tcp RTT estimation. The selftest for BPF_SOCK_OPS_RTT_CB is extended for the added args. changelogs -> v1: - extend rtt selftest for added args (suggested by Stanislav) ==================== Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
This commit is contained in:
+2
-2
@@ -2706,10 +2706,10 @@ static inline bool tcp_bpf_ca_needs_ecn(struct sock *sk)
|
||||
return (tcp_call_bpf(sk, BPF_SOCK_OPS_NEEDS_ECN, 0, NULL) == 1);
|
||||
}
|
||||
|
||||
static inline void tcp_bpf_rtt(struct sock *sk)
|
||||
static inline void tcp_bpf_rtt(struct sock *sk, long mrtt, u32 srtt)
|
||||
{
|
||||
if (BPF_SOCK_OPS_TEST_FLAG(tcp_sk(sk), BPF_SOCK_OPS_RTT_CB_FLAG))
|
||||
tcp_call_bpf(sk, BPF_SOCK_OPS_RTT_CB, 0, NULL);
|
||||
tcp_call_bpf_2arg(sk, BPF_SOCK_OPS_RTT_CB, mrtt, srtt);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_SMC)
|
||||
|
||||
@@ -6947,6 +6947,8 @@ enum {
|
||||
* socket transition to LISTEN state.
|
||||
*/
|
||||
BPF_SOCK_OPS_RTT_CB, /* Called on every RTT.
|
||||
* Arg1: measured RTT input (mrtt)
|
||||
* Arg2: updated srtt
|
||||
*/
|
||||
BPF_SOCK_OPS_PARSE_HDR_OPT_CB, /* Parse the header option.
|
||||
* It will be called to handle
|
||||
|
||||
@@ -911,7 +911,7 @@ static void tcp_rtt_estimator(struct sock *sk, long mrtt_us)
|
||||
tp->rtt_seq = tp->snd_nxt;
|
||||
tp->mdev_max_us = tcp_rto_min_us(sk);
|
||||
|
||||
tcp_bpf_rtt(sk);
|
||||
tcp_bpf_rtt(sk, mrtt_us, srtt);
|
||||
}
|
||||
} else {
|
||||
/* no previous measure. */
|
||||
@@ -921,7 +921,7 @@ static void tcp_rtt_estimator(struct sock *sk, long mrtt_us)
|
||||
tp->mdev_max_us = tp->rttvar_us;
|
||||
tp->rtt_seq = tp->snd_nxt;
|
||||
|
||||
tcp_bpf_rtt(sk);
|
||||
tcp_bpf_rtt(sk, mrtt_us, srtt);
|
||||
}
|
||||
tp->srtt_us = max(1U, srtt);
|
||||
}
|
||||
|
||||
@@ -6947,6 +6947,8 @@ enum {
|
||||
* socket transition to LISTEN state.
|
||||
*/
|
||||
BPF_SOCK_OPS_RTT_CB, /* Called on every RTT.
|
||||
* Arg1: measured RTT input (mrtt)
|
||||
* Arg2: updated srtt
|
||||
*/
|
||||
BPF_SOCK_OPS_PARSE_HDR_OPT_CB, /* Parse the header option.
|
||||
* It will be called to handle
|
||||
|
||||
@@ -10,6 +10,9 @@ struct tcp_rtt_storage {
|
||||
__u32 delivered;
|
||||
__u32 delivered_ce;
|
||||
__u32 icsk_retransmits;
|
||||
|
||||
__u32 mrtt_us; /* args[0] */
|
||||
__u32 srtt; /* args[1] */
|
||||
};
|
||||
|
||||
static void send_byte(int fd)
|
||||
@@ -83,6 +86,17 @@ static int verify_sk(int map_fd, int client_fd, const char *msg, __u32 invoked,
|
||||
err++;
|
||||
}
|
||||
|
||||
/* Precise values of mrtt and srtt are unavailable, just make sure they are nonzero */
|
||||
if (val.mrtt_us == 0) {
|
||||
log_err("%s: unexpected bpf_tcp_sock.args[0] (mrtt_us) %u == 0", msg, val.mrtt_us);
|
||||
err++;
|
||||
}
|
||||
|
||||
if (val.srtt == 0) {
|
||||
log_err("%s: unexpected bpf_tcp_sock.args[1] (srtt) %u == 0", msg, val.srtt);
|
||||
err++;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,9 @@ struct tcp_rtt_storage {
|
||||
__u32 delivered;
|
||||
__u32 delivered_ce;
|
||||
__u32 icsk_retransmits;
|
||||
|
||||
__u32 mrtt_us; /* args[0] */
|
||||
__u32 srtt; /* args[1] */
|
||||
};
|
||||
|
||||
struct {
|
||||
@@ -55,5 +58,8 @@ int _sockops(struct bpf_sock_ops *ctx)
|
||||
storage->delivered_ce = tcp_sk->delivered_ce;
|
||||
storage->icsk_retransmits = tcp_sk->icsk_retransmits;
|
||||
|
||||
storage->mrtt_us = ctx->args[0];
|
||||
storage->srtt = ctx->args[1];
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user