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