xref: /aosp_15_r20/external/bcc/tests/python/test_perf_event.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) 2016 PLUMgrid
3*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License")
4*387f9dfdSAndroid Build Coastguard Worker
5*387f9dfdSAndroid Build Coastguard Workerimport bcc
6*387f9dfdSAndroid Build Coastguard Workerimport ctypes
7*387f9dfdSAndroid Build Coastguard Workerimport multiprocessing
8*387f9dfdSAndroid Build Coastguard Workerimport os
9*387f9dfdSAndroid Build Coastguard Workerimport time
10*387f9dfdSAndroid Build Coastguard Workerimport unittest
11*387f9dfdSAndroid Build Coastguard Worker
12*387f9dfdSAndroid Build Coastguard Workerclass TestPerfCounter(unittest.TestCase):
13*387f9dfdSAndroid Build Coastguard Worker    def test_cycles(self):
14*387f9dfdSAndroid Build Coastguard Worker        text = b"""
15*387f9dfdSAndroid Build Coastguard WorkerBPF_PERF_ARRAY(cnt1, NUM_CPUS);
16*387f9dfdSAndroid Build Coastguard WorkerBPF_ARRAY(prev, u64, NUM_CPUS);
17*387f9dfdSAndroid Build Coastguard WorkerBPF_HISTOGRAM(dist);
18*387f9dfdSAndroid Build Coastguard Workerint do_sys_getuid(void *ctx) {
19*387f9dfdSAndroid Build Coastguard Worker    u32 cpu = bpf_get_smp_processor_id();
20*387f9dfdSAndroid Build Coastguard Worker    u64 val = cnt1.perf_read(CUR_CPU_IDENTIFIER);
21*387f9dfdSAndroid Build Coastguard Worker
22*387f9dfdSAndroid Build Coastguard Worker    if (((s64)val < 0) && ((s64)val > -256))
23*387f9dfdSAndroid Build Coastguard Worker        return 0;
24*387f9dfdSAndroid Build Coastguard Worker
25*387f9dfdSAndroid Build Coastguard Worker    prev.update(&cpu, &val);
26*387f9dfdSAndroid Build Coastguard Worker    return 0;
27*387f9dfdSAndroid Build Coastguard Worker}
28*387f9dfdSAndroid Build Coastguard Workerint do_ret_sys_getuid(void *ctx) {
29*387f9dfdSAndroid Build Coastguard Worker    u32 cpu = bpf_get_smp_processor_id();
30*387f9dfdSAndroid Build Coastguard Worker    u64 val = cnt1.perf_read(CUR_CPU_IDENTIFIER);
31*387f9dfdSAndroid Build Coastguard Worker
32*387f9dfdSAndroid Build Coastguard Worker    if (((s64)val < 0) && ((s64)val > -256))
33*387f9dfdSAndroid Build Coastguard Worker        return 0;
34*387f9dfdSAndroid Build Coastguard Worker
35*387f9dfdSAndroid Build Coastguard Worker    u64 *prevp = prev.lookup(&cpu);
36*387f9dfdSAndroid Build Coastguard Worker    if (prevp) {
37*387f9dfdSAndroid Build Coastguard Worker        dist.increment(bpf_log2l(val - *prevp));
38*387f9dfdSAndroid Build Coastguard Worker        dist.atomic_increment(bpf_log2l(val - *prevp));
39*387f9dfdSAndroid Build Coastguard Worker    }
40*387f9dfdSAndroid Build Coastguard Worker    return 0;
41*387f9dfdSAndroid Build Coastguard Worker}
42*387f9dfdSAndroid Build Coastguard Worker"""
43*387f9dfdSAndroid Build Coastguard Worker        mypid = os.getpid()
44*387f9dfdSAndroid Build Coastguard Worker        b = bcc.BPF(text=text, debug=0,
45*387f9dfdSAndroid Build Coastguard Worker                cflags=["-DNUM_CPUS=%d" % multiprocessing.cpu_count()])
46*387f9dfdSAndroid Build Coastguard Worker        event_name = b.get_syscall_fnname(b"getuid")
47*387f9dfdSAndroid Build Coastguard Worker        b.attach_kprobe(event=event_name, fn_name=b"do_sys_getuid")
48*387f9dfdSAndroid Build Coastguard Worker        b.attach_kretprobe(event=event_name, fn_name=b"do_ret_sys_getuid")
49*387f9dfdSAndroid Build Coastguard Worker        cnt1 = b[b"cnt1"]
50*387f9dfdSAndroid Build Coastguard Worker        try:
51*387f9dfdSAndroid Build Coastguard Worker            cnt1.open_perf_event(bcc.PerfType.HARDWARE,
52*387f9dfdSAndroid Build Coastguard Worker                                 bcc.PerfHWConfig.CPU_CYCLES, pid=mypid)
53*387f9dfdSAndroid Build Coastguard Worker        except:
54*387f9dfdSAndroid Build Coastguard Worker            if ctypes.get_errno() == 2:
55*387f9dfdSAndroid Build Coastguard Worker                raise self.skipTest("hardware events unsupported")
56*387f9dfdSAndroid Build Coastguard Worker            raise
57*387f9dfdSAndroid Build Coastguard Worker        for i in range(0, 100):
58*387f9dfdSAndroid Build Coastguard Worker            os.getuid()
59*387f9dfdSAndroid Build Coastguard Worker        b[b"dist"].print_log2_hist()
60*387f9dfdSAndroid Build Coastguard Worker
61*387f9dfdSAndroid Build Coastguard Workerif __name__ == "__main__":
62*387f9dfdSAndroid Build Coastguard Worker    unittest.main()
63