1*387f9dfdSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0
2*387f9dfdSAndroid Build Coastguard Worker /* Copyright (c) 2021 Google LLC. */
3*387f9dfdSAndroid Build Coastguard Worker #include "vmlinux.h"
4*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_core_read.h>
5*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_helpers.h>
6*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_tracing.h>
7*387f9dfdSAndroid Build Coastguard Worker #include "funclatency.h"
8*387f9dfdSAndroid Build Coastguard Worker #include "bits.bpf.h"
9*387f9dfdSAndroid Build Coastguard Worker
10*387f9dfdSAndroid Build Coastguard Worker const volatile pid_t targ_tgid = 0;
11*387f9dfdSAndroid Build Coastguard Worker const volatile int units = 0;
12*387f9dfdSAndroid Build Coastguard Worker const volatile bool filter_cg = false;
13*387f9dfdSAndroid Build Coastguard Worker
14*387f9dfdSAndroid Build Coastguard Worker struct {
15*387f9dfdSAndroid Build Coastguard Worker __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY);
16*387f9dfdSAndroid Build Coastguard Worker __type(key, u32);
17*387f9dfdSAndroid Build Coastguard Worker __type(value, u32);
18*387f9dfdSAndroid Build Coastguard Worker __uint(max_entries, 1);
19*387f9dfdSAndroid Build Coastguard Worker } cgroup_map SEC(".maps");
20*387f9dfdSAndroid Build Coastguard Worker
21*387f9dfdSAndroid Build Coastguard Worker /* key: pid. value: start time */
22*387f9dfdSAndroid Build Coastguard Worker struct {
23*387f9dfdSAndroid Build Coastguard Worker __uint(type, BPF_MAP_TYPE_HASH);
24*387f9dfdSAndroid Build Coastguard Worker __uint(max_entries, MAX_PIDS);
25*387f9dfdSAndroid Build Coastguard Worker __type(key, u32);
26*387f9dfdSAndroid Build Coastguard Worker __type(value, u64);
27*387f9dfdSAndroid Build Coastguard Worker } starts SEC(".maps");
28*387f9dfdSAndroid Build Coastguard Worker
29*387f9dfdSAndroid Build Coastguard Worker __u32 hist[MAX_SLOTS] = {};
30*387f9dfdSAndroid Build Coastguard Worker
entry(void)31*387f9dfdSAndroid Build Coastguard Worker static void entry(void)
32*387f9dfdSAndroid Build Coastguard Worker {
33*387f9dfdSAndroid Build Coastguard Worker u64 id = bpf_get_current_pid_tgid();
34*387f9dfdSAndroid Build Coastguard Worker u32 tgid = id >> 32;
35*387f9dfdSAndroid Build Coastguard Worker u32 pid = id;
36*387f9dfdSAndroid Build Coastguard Worker u64 nsec;
37*387f9dfdSAndroid Build Coastguard Worker
38*387f9dfdSAndroid Build Coastguard Worker if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0))
39*387f9dfdSAndroid Build Coastguard Worker return;
40*387f9dfdSAndroid Build Coastguard Worker
41*387f9dfdSAndroid Build Coastguard Worker if (targ_tgid && targ_tgid != tgid)
42*387f9dfdSAndroid Build Coastguard Worker return;
43*387f9dfdSAndroid Build Coastguard Worker nsec = bpf_ktime_get_ns();
44*387f9dfdSAndroid Build Coastguard Worker bpf_map_update_elem(&starts, &pid, &nsec, BPF_ANY);
45*387f9dfdSAndroid Build Coastguard Worker }
46*387f9dfdSAndroid Build Coastguard Worker
47*387f9dfdSAndroid Build Coastguard Worker SEC("fentry/dummy_fentry")
BPF_PROG(dummy_fentry)48*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(dummy_fentry)
49*387f9dfdSAndroid Build Coastguard Worker {
50*387f9dfdSAndroid Build Coastguard Worker entry();
51*387f9dfdSAndroid Build Coastguard Worker return 0;
52*387f9dfdSAndroid Build Coastguard Worker }
53*387f9dfdSAndroid Build Coastguard Worker
54*387f9dfdSAndroid Build Coastguard Worker SEC("kprobe/dummy_kprobe")
BPF_KPROBE(dummy_kprobe)55*387f9dfdSAndroid Build Coastguard Worker int BPF_KPROBE(dummy_kprobe)
56*387f9dfdSAndroid Build Coastguard Worker {
57*387f9dfdSAndroid Build Coastguard Worker entry();
58*387f9dfdSAndroid Build Coastguard Worker return 0;
59*387f9dfdSAndroid Build Coastguard Worker }
60*387f9dfdSAndroid Build Coastguard Worker
exit(void)61*387f9dfdSAndroid Build Coastguard Worker static void exit(void)
62*387f9dfdSAndroid Build Coastguard Worker {
63*387f9dfdSAndroid Build Coastguard Worker u64 *start;
64*387f9dfdSAndroid Build Coastguard Worker u64 nsec = bpf_ktime_get_ns();
65*387f9dfdSAndroid Build Coastguard Worker u64 id = bpf_get_current_pid_tgid();
66*387f9dfdSAndroid Build Coastguard Worker u32 pid = id;
67*387f9dfdSAndroid Build Coastguard Worker u64 slot, delta;
68*387f9dfdSAndroid Build Coastguard Worker
69*387f9dfdSAndroid Build Coastguard Worker if (filter_cg && !bpf_current_task_under_cgroup(&cgroup_map, 0))
70*387f9dfdSAndroid Build Coastguard Worker return;
71*387f9dfdSAndroid Build Coastguard Worker
72*387f9dfdSAndroid Build Coastguard Worker start = bpf_map_lookup_elem(&starts, &pid);
73*387f9dfdSAndroid Build Coastguard Worker if (!start)
74*387f9dfdSAndroid Build Coastguard Worker return;
75*387f9dfdSAndroid Build Coastguard Worker
76*387f9dfdSAndroid Build Coastguard Worker delta = nsec - *start;
77*387f9dfdSAndroid Build Coastguard Worker
78*387f9dfdSAndroid Build Coastguard Worker switch (units) {
79*387f9dfdSAndroid Build Coastguard Worker case USEC:
80*387f9dfdSAndroid Build Coastguard Worker delta /= 1000;
81*387f9dfdSAndroid Build Coastguard Worker break;
82*387f9dfdSAndroid Build Coastguard Worker case MSEC:
83*387f9dfdSAndroid Build Coastguard Worker delta /= 1000000;
84*387f9dfdSAndroid Build Coastguard Worker break;
85*387f9dfdSAndroid Build Coastguard Worker }
86*387f9dfdSAndroid Build Coastguard Worker
87*387f9dfdSAndroid Build Coastguard Worker slot = log2l(delta);
88*387f9dfdSAndroid Build Coastguard Worker if (slot >= MAX_SLOTS)
89*387f9dfdSAndroid Build Coastguard Worker slot = MAX_SLOTS - 1;
90*387f9dfdSAndroid Build Coastguard Worker __sync_fetch_and_add(&hist[slot], 1);
91*387f9dfdSAndroid Build Coastguard Worker }
92*387f9dfdSAndroid Build Coastguard Worker
93*387f9dfdSAndroid Build Coastguard Worker SEC("fexit/dummy_fexit")
BPF_PROG(dummy_fexit)94*387f9dfdSAndroid Build Coastguard Worker int BPF_PROG(dummy_fexit)
95*387f9dfdSAndroid Build Coastguard Worker {
96*387f9dfdSAndroid Build Coastguard Worker exit();
97*387f9dfdSAndroid Build Coastguard Worker return 0;
98*387f9dfdSAndroid Build Coastguard Worker }
99*387f9dfdSAndroid Build Coastguard Worker
100*387f9dfdSAndroid Build Coastguard Worker SEC("kretprobe/dummy_kretprobe")
BPF_KRETPROBE(dummy_kretprobe)101*387f9dfdSAndroid Build Coastguard Worker int BPF_KRETPROBE(dummy_kretprobe)
102*387f9dfdSAndroid Build Coastguard Worker {
103*387f9dfdSAndroid Build Coastguard Worker exit();
104*387f9dfdSAndroid Build Coastguard Worker return 0;
105*387f9dfdSAndroid Build Coastguard Worker }
106*387f9dfdSAndroid Build Coastguard Worker
107*387f9dfdSAndroid Build Coastguard Worker char LICENSE[] SEC("license") = "GPL";
108