xref: /aosp_15_r20/external/bcc/tests/python/test_trace2.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
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