Skip to content

Commit e85bd8f

Browse files
chenhengqiyonghong-song
authored andcommitted
libbpf-tools: Allow softirqs to run on old kernels
This is part of efforts towards #4231. Fallback to raw tracepoints if tp_btf is not available. Signed-off-by: Hengqi Chen <chenhengqi@outlook.com>
1 parent c2b9f6e commit e85bd8f

File tree

2 files changed

+37
-10
lines changed

2 files changed

+37
-10
lines changed

libbpf-tools/softirqs.bpf.c

+29-10
Original file line numberDiff line numberDiff line change
@@ -20,31 +20,26 @@ struct {
2020
__u64 counts[NR_SOFTIRQS] = {};
2121
struct hist hists[NR_SOFTIRQS] = {};
2222

23-
SEC("tp_btf/softirq_entry")
24-
int BPF_PROG(softirq_entry, unsigned int vec_nr)
23+
static int handle_entry(unsigned int vec_nr)
2524
{
2625
u64 ts = bpf_ktime_get_ns();
2726
u32 key = 0;
2827

29-
bpf_map_update_elem(&start, &key, &ts, 0);
28+
bpf_map_update_elem(&start, &key, &ts, BPF_ANY);
3029
return 0;
3130
}
3231

33-
SEC("tp_btf/softirq_exit")
34-
int BPF_PROG(softirq_exit, unsigned int vec_nr)
32+
static int handle_exit(unsigned int vec_nr)
3533
{
34+
u64 delta, *tsp;
3635
u32 key = 0;
37-
s64 delta;
38-
u64 *tsp;
3936

4037
if (vec_nr >= NR_SOFTIRQS)
4138
return 0;
4239
tsp = bpf_map_lookup_elem(&start, &key);
43-
if (!tsp || !*tsp)
40+
if (!tsp)
4441
return 0;
4542
delta = bpf_ktime_get_ns() - *tsp;
46-
if (delta < 0)
47-
return 0;
4843
if (!targ_ns)
4944
delta /= 1000U;
5045

@@ -64,4 +59,28 @@ int BPF_PROG(softirq_exit, unsigned int vec_nr)
6459
return 0;
6560
}
6661

62+
SEC("tp_btf/softirq_entry")
63+
int BPF_PROG(softirq_entry_btf, unsigned int vec_nr)
64+
{
65+
return handle_entry(vec_nr);
66+
}
67+
68+
SEC("tp_btf/softirq_exit")
69+
int BPF_PROG(softirq_exit_btf, unsigned int vec_nr)
70+
{
71+
return handle_exit(vec_nr);
72+
}
73+
74+
SEC("raw_tp/softirq_entry")
75+
int BPF_PROG(softirq_entry, unsigned int vec_nr)
76+
{
77+
return handle_entry(vec_nr);
78+
}
79+
80+
SEC("raw_tp/softirq_exit")
81+
int BPF_PROG(softirq_exit, unsigned int vec_nr)
82+
{
83+
return handle_exit(vec_nr);
84+
}
85+
6786
char LICENSE[] SEC("license") = "GPL";

libbpf-tools/softirqs.c

+8
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,14 @@ int main(int argc, char **argv)
204204
return 1;
205205
}
206206

207+
if (probe_tp_btf("softirq_entry")) {
208+
bpf_program__set_autoload(obj->progs.softirq_entry, false);
209+
bpf_program__set_autoload(obj->progs.softirq_exit, false);
210+
} else {
211+
bpf_program__set_autoload(obj->progs.softirq_entry_btf, false);
212+
bpf_program__set_autoload(obj->progs.softirq_exit_btf, false);
213+
}
214+
207215
/* initialize global data (filtering options) */
208216
obj->rodata->targ_dist = env.distributed;
209217
obj->rodata->targ_ns = env.nanoseconds;

0 commit comments

Comments
 (0)