1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2 // Copyright (c) 2021 Google
4 #include <bpf/bpf_helpers.h>
5 #include <bpf/bpf_tracing.h>
7 // This should be in sync with "util/ftrace.h"
11 __uint(type
, BPF_MAP_TYPE_HASH
);
12 __uint(key_size
, sizeof(__u64
));
13 __uint(value_size
, sizeof(__u64
));
14 __uint(max_entries
, 10000);
15 } functime
SEC(".maps");
18 __uint(type
, BPF_MAP_TYPE_HASH
);
19 __uint(key_size
, sizeof(__u32
));
20 __uint(value_size
, sizeof(__u8
));
21 __uint(max_entries
, 1);
22 } cpu_filter
SEC(".maps");
25 __uint(type
, BPF_MAP_TYPE_HASH
);
26 __uint(key_size
, sizeof(__u32
));
27 __uint(value_size
, sizeof(__u8
));
28 __uint(max_entries
, 1);
29 } task_filter
SEC(".maps");
32 __uint(type
, BPF_MAP_TYPE_PERCPU_ARRAY
);
33 __uint(key_size
, sizeof(__u32
));
34 __uint(value_size
, sizeof(__u64
));
35 __uint(max_entries
, NUM_BUCKET
);
36 } latency
SEC(".maps");
41 const volatile int has_cpu
= 0;
42 const volatile int has_task
= 0;
43 const volatile int use_nsec
= 0;
46 int BPF_PROG(func_begin
)
53 key
= bpf_get_current_pid_tgid();
56 __u32 cpu
= bpf_get_smp_processor_id();
59 ok
= bpf_map_lookup_elem(&cpu_filter
, &cpu
);
65 __u32 pid
= key
& 0xffffffff;
68 ok
= bpf_map_lookup_elem(&task_filter
, &pid
);
73 now
= bpf_ktime_get_ns();
75 // overwrite timestamp for nested functions
76 bpf_map_update_elem(&functime
, &key
, &now
, BPF_ANY
);
81 int BPF_PROG(func_end
)
85 __u64 cmp_base
= use_nsec
? 1 : 1000;
90 tid
= bpf_get_current_pid_tgid();
92 start
= bpf_map_lookup_elem(&functime
, &tid
);
94 __s64 delta
= bpf_ktime_get_ns() - *start
;
98 bpf_map_delete_elem(&functime
, &tid
);
103 // calculate index using delta
104 for (key
= 0; key
< (NUM_BUCKET
- 1); key
++) {
105 if (delta
< (cmp_base
<< key
))
109 hist
= bpf_map_lookup_elem(&latency
, &key
);