1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) PLUMgrid, Inc. 3*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License") 4*387f9dfdSAndroid Build Coastguard Worker 5*387f9dfdSAndroid Build Coastguard Workerfrom ctypes import c_uint, c_ulong, Structure 6*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF 7*387f9dfdSAndroid Build Coastguard Workerfrom time import sleep 8*387f9dfdSAndroid Build Coastguard Workerimport sys 9*387f9dfdSAndroid Build Coastguard Workerfrom unittest import main, TestCase 10*387f9dfdSAndroid Build Coastguard Worker 11*387f9dfdSAndroid Build Coastguard Workertext = b""" 12*387f9dfdSAndroid Build Coastguard Worker#include <linux/ptrace.h> 13*387f9dfdSAndroid Build Coastguard Workerstruct Ptr { u64 ptr; }; 14*387f9dfdSAndroid Build Coastguard Workerstruct Counters { char unused; __int128 stat1; }; 15*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(stats, struct Ptr, struct Counters, 1024); 16*387f9dfdSAndroid Build Coastguard Worker 17*387f9dfdSAndroid Build Coastguard Workerint count_sched(struct pt_regs *ctx) { 18*387f9dfdSAndroid Build Coastguard Worker struct Ptr key = {.ptr=PT_REGS_PARM1(ctx)}; 19*387f9dfdSAndroid Build Coastguard Worker struct Counters zleaf; 20*387f9dfdSAndroid Build Coastguard Worker 21*387f9dfdSAndroid Build Coastguard Worker memset(&zleaf, 0, sizeof(zleaf)); 22*387f9dfdSAndroid Build Coastguard Worker struct Counters *val = stats.lookup_or_try_init(&key, &zleaf); 23*387f9dfdSAndroid Build Coastguard Worker if (val) { 24*387f9dfdSAndroid Build Coastguard Worker val->stat1++; 25*387f9dfdSAndroid Build Coastguard Worker } 26*387f9dfdSAndroid Build Coastguard Worker return 0; 27*387f9dfdSAndroid Build Coastguard Worker} 28*387f9dfdSAndroid Build Coastguard Worker""" 29*387f9dfdSAndroid Build Coastguard Worker 30*387f9dfdSAndroid Build Coastguard Workerclass TestTracingEvent(TestCase): 31*387f9dfdSAndroid Build Coastguard Worker def setUp(self): 32*387f9dfdSAndroid Build Coastguard Worker b = BPF(text=text, debug=0) 33*387f9dfdSAndroid Build Coastguard Worker self.stats = b.get_table(b"stats") 34*387f9dfdSAndroid Build Coastguard Worker b.attach_kprobe(event_re=b"^finish_task_switch$|^finish_task_switch\.isra\.\d$", 35*387f9dfdSAndroid Build Coastguard Worker fn_name=b"count_sched") 36*387f9dfdSAndroid Build Coastguard Worker 37*387f9dfdSAndroid Build Coastguard Worker def test_sched1(self): 38*387f9dfdSAndroid Build Coastguard Worker for i in range(0, 100): 39*387f9dfdSAndroid Build Coastguard Worker sleep(0.01) 40*387f9dfdSAndroid Build Coastguard Worker for key, leaf in self.stats.items(): 41*387f9dfdSAndroid Build Coastguard Worker print("ptr %x:" % key.ptr, "stat1 (%d %d)" % (leaf.stat1[1], leaf.stat1[0])) 42*387f9dfdSAndroid Build Coastguard Worker 43*387f9dfdSAndroid Build Coastguard Workerif __name__ == "__main__": 44*387f9dfdSAndroid Build Coastguard Worker main() 45