forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'Add BPF-helper for accessing CLOCK_TAI'
Kurt Kanzenbach says: ==================== Hi, add a BPF-helper for accessing CLOCK_TAI. Use cases for such a BPF helper include functionalities such as Tx launch time (e.g. ETF and TAPRIO Qdiscs), timestamping and policing. Patch #1 - Introduce BPF helper Patch #2 - Add test case (skb based) Changes since v1: * Update changelog (Alexei Starovoitov) * Add test case (Alexei Starovoitov, Andrii Nakryiko) * Add missing function prototype (netdev ci) Previous versions: * v1: https://lore.kernel.org/r/20220606103734.92423-1-kurt@linutronix.de/ Jesper Dangaard Brouer (1): bpf: Add BPF-helper for accessing CLOCK_TAI ==================== Signed-off-by: Alexei Starovoitov <ast@kernel.org>
- Loading branch information
Showing
7 changed files
with
140 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright (C) 2022 Linutronix GmbH */ | ||
|
||
#include <test_progs.h> | ||
#include <network_helpers.h> | ||
|
||
#include "test_time_tai.skel.h" | ||
|
||
#include <time.h> | ||
#include <stdint.h> | ||
|
||
#define TAI_THRESHOLD 1000000000ULL /* 1s */ | ||
#define NSEC_PER_SEC 1000000000ULL | ||
|
||
static __u64 ts_to_ns(const struct timespec *ts) | ||
{ | ||
return ts->tv_sec * NSEC_PER_SEC + ts->tv_nsec; | ||
} | ||
|
||
void test_time_tai(void) | ||
{ | ||
struct __sk_buff skb = { | ||
.cb[0] = 0, | ||
.cb[1] = 0, | ||
.tstamp = 0, | ||
}; | ||
LIBBPF_OPTS(bpf_test_run_opts, topts, | ||
.data_in = &pkt_v4, | ||
.data_size_in = sizeof(pkt_v4), | ||
.ctx_in = &skb, | ||
.ctx_size_in = sizeof(skb), | ||
.ctx_out = &skb, | ||
.ctx_size_out = sizeof(skb), | ||
); | ||
struct test_time_tai *skel; | ||
struct timespec now_tai; | ||
__u64 ts1, ts2, now; | ||
int ret, prog_fd; | ||
|
||
/* Open and load */ | ||
skel = test_time_tai__open_and_load(); | ||
if (!ASSERT_OK_PTR(skel, "tai_open")) | ||
return; | ||
|
||
/* Run test program */ | ||
prog_fd = bpf_program__fd(skel->progs.time_tai); | ||
ret = bpf_prog_test_run_opts(prog_fd, &topts); | ||
ASSERT_OK(ret, "test_run"); | ||
|
||
/* Retrieve generated TAI timestamps */ | ||
ts1 = skb.tstamp; | ||
ts2 = skb.cb[0] | ((__u64)skb.cb[1] << 32); | ||
|
||
/* TAI != 0 */ | ||
ASSERT_NEQ(ts1, 0, "tai_ts1"); | ||
ASSERT_NEQ(ts2, 0, "tai_ts2"); | ||
|
||
/* TAI is moving forward only */ | ||
ASSERT_GT(ts2, ts1, "tai_forward"); | ||
|
||
/* Check for future */ | ||
ret = clock_gettime(CLOCK_TAI, &now_tai); | ||
ASSERT_EQ(ret, 0, "tai_gettime"); | ||
now = ts_to_ns(&now_tai); | ||
|
||
ASSERT_TRUE(now > ts1, "tai_future_ts1"); | ||
ASSERT_TRUE(now > ts2, "tai_future_ts2"); | ||
|
||
/* Check for reasonable range */ | ||
ASSERT_TRUE(now - ts1 < TAI_THRESHOLD, "tai_range_ts1"); | ||
ASSERT_TRUE(now - ts2 < TAI_THRESHOLD, "tai_range_ts2"); | ||
|
||
test_time_tai__destroy(skel); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright (C) 2022 Linutronix GmbH */ | ||
|
||
#include <linux/bpf.h> | ||
#include <bpf/bpf_helpers.h> | ||
|
||
char _license[] SEC("license") = "GPL"; | ||
|
||
SEC("tc") | ||
int time_tai(struct __sk_buff *skb) | ||
{ | ||
__u64 ts1, ts2; | ||
|
||
/* Get TAI timestamps */ | ||
ts1 = bpf_ktime_get_tai_ns(); | ||
ts2 = bpf_ktime_get_tai_ns(); | ||
|
||
/* Save TAI timestamps (Note: skb->hwtstamp is read-only) */ | ||
skb->tstamp = ts1; | ||
skb->cb[0] = ts2 & 0xffffffff; | ||
skb->cb[1] = ts2 >> 32; | ||
|
||
return 0; | ||
} |