xref: /aosp_15_r20/external/bcc/tools/criticalstat.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker#!/usr/bin/env python
2*387f9dfdSAndroid Build Coastguard Worker# @lint-avoid-python-3-compatibility-imports
3*387f9dfdSAndroid Build Coastguard Worker#
4*387f9dfdSAndroid Build Coastguard Worker# criticalstat  Trace long critical sections (IRQs or preemption disabled)
5*387f9dfdSAndroid Build Coastguard Worker#               For Linux, uses BCC, eBPF. Requires kernel built with
6*387f9dfdSAndroid Build Coastguard Worker#               CONFIG_DEBUG_PREEMPT and CONFIG_PREEMPTIRQ_EVENTS
7*387f9dfdSAndroid Build Coastguard Worker#
8*387f9dfdSAndroid Build Coastguard Worker# USAGE: criticalstat [-h] [-p] [-i] [-d DURATION]
9*387f9dfdSAndroid Build Coastguard Worker#
10*387f9dfdSAndroid Build Coastguard Worker# Copyright (c) 2018, Google, Inc.
11*387f9dfdSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License")
12*387f9dfdSAndroid Build Coastguard Worker#
13*387f9dfdSAndroid Build Coastguard Worker# By Joel Fernandes <[email protected]>
14*387f9dfdSAndroid Build Coastguard Worker
15*387f9dfdSAndroid Build Coastguard Workerfrom __future__ import print_function
16*387f9dfdSAndroid Build Coastguard Workerfrom bcc import BPF
17*387f9dfdSAndroid Build Coastguard Workerimport argparse
18*387f9dfdSAndroid Build Coastguard Workerimport sys
19*387f9dfdSAndroid Build Coastguard Workerimport subprocess
20*387f9dfdSAndroid Build Coastguard Workerimport os.path
21*387f9dfdSAndroid Build Coastguard Worker
22*387f9dfdSAndroid Build Coastguard Workerexamples=""
23*387f9dfdSAndroid Build Coastguard Worker
24*387f9dfdSAndroid Build Coastguard Workerparser = argparse.ArgumentParser(
25*387f9dfdSAndroid Build Coastguard Worker    description="Trace long critical sections",
26*387f9dfdSAndroid Build Coastguard Worker    formatter_class=argparse.RawDescriptionHelpFormatter,
27*387f9dfdSAndroid Build Coastguard Worker    epilog=examples)
28*387f9dfdSAndroid Build Coastguard Worker
29*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("-p", "--preemptoff", action="store_true",
30*387f9dfdSAndroid Build Coastguard Worker                    help="Find long sections where preemption was off")
31*387f9dfdSAndroid Build Coastguard Worker
32*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("-i", "--irqoff", action="store_true",
33*387f9dfdSAndroid Build Coastguard Worker                    help="Find long sections where IRQ was off")
34*387f9dfdSAndroid Build Coastguard Worker
35*387f9dfdSAndroid Build Coastguard Workerparser.add_argument("-d", "--duration", default=100,
36*387f9dfdSAndroid Build Coastguard Worker                    help="Duration in uS (microseconds) below which we filter")
37*387f9dfdSAndroid Build Coastguard Worker
38*387f9dfdSAndroid Build Coastguard Workerargs = parser.parse_args()
39*387f9dfdSAndroid Build Coastguard Worker
40*387f9dfdSAndroid Build Coastguard Workerpreemptoff = False
41*387f9dfdSAndroid Build Coastguard Workerirqoff = False
42*387f9dfdSAndroid Build Coastguard Worker
43*387f9dfdSAndroid Build Coastguard Workerif args.irqoff:
44*387f9dfdSAndroid Build Coastguard Worker    preemptoff = False
45*387f9dfdSAndroid Build Coastguard Worker    irqoff = True
46*387f9dfdSAndroid Build Coastguard Workerelif args.preemptoff:
47*387f9dfdSAndroid Build Coastguard Worker    preemptoff = True
48*387f9dfdSAndroid Build Coastguard Worker    irqoff = False
49*387f9dfdSAndroid Build Coastguard Worker
50*387f9dfdSAndroid Build Coastguard Workerdebugfs_path = subprocess.Popen ("cat /proc/mounts | grep -w debugfs" +
51*387f9dfdSAndroid Build Coastguard Worker    " | awk '{print $2}'",
52*387f9dfdSAndroid Build Coastguard Worker    shell=True,
53*387f9dfdSAndroid Build Coastguard Worker    stdout=subprocess.PIPE).stdout.read().split(b"\n")[0]
54*387f9dfdSAndroid Build Coastguard Worker
55*387f9dfdSAndroid Build Coastguard Workerif debugfs_path == "":
56*387f9dfdSAndroid Build Coastguard Worker    print("ERROR: Unable to find debugfs mount point");
57*387f9dfdSAndroid Build Coastguard Worker    sys.exit(0);
58*387f9dfdSAndroid Build Coastguard Worker
59*387f9dfdSAndroid Build Coastguard Workertrace_path = debugfs_path + b"/tracing/events/preemptirq/";
60*387f9dfdSAndroid Build Coastguard Worker
61*387f9dfdSAndroid Build Coastguard Workerif (not os.path.exists(trace_path + b"irq_disable") or
62*387f9dfdSAndroid Build Coastguard Worker   not os.path.exists(trace_path + b"irq_enable") or
63*387f9dfdSAndroid Build Coastguard Worker   not os.path.exists(trace_path + b"preempt_disable") or
64*387f9dfdSAndroid Build Coastguard Worker   not os.path.exists(trace_path + b"preempt_enable")):
65*387f9dfdSAndroid Build Coastguard Worker    print("ERROR: required tracing events are not available\n" +
66*387f9dfdSAndroid Build Coastguard Worker        "Make sure the kernel is built with CONFIG_DEBUG_PREEMPT " +
67*387f9dfdSAndroid Build Coastguard Worker        "CONFIG_PREEMPT_TRACER " +
68*387f9dfdSAndroid Build Coastguard Worker        "and CONFIG_PREEMPTIRQ_EVENTS (CONFIG_PREEMPTIRQ_TRACEPOINTS in "
69*387f9dfdSAndroid Build Coastguard Worker        "kernel 4.19 and later) enabled. Also please disable " +
70*387f9dfdSAndroid Build Coastguard Worker        "CONFIG_PROVE_LOCKING and CONFIG_LOCKDEP on older kernels.")
71*387f9dfdSAndroid Build Coastguard Worker    sys.exit(0)
72*387f9dfdSAndroid Build Coastguard Worker
73*387f9dfdSAndroid Build Coastguard Workerbpf_text = """
74*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
75*387f9dfdSAndroid Build Coastguard Worker#include <linux/sched.h>
76*387f9dfdSAndroid Build Coastguard Worker
77*387f9dfdSAndroid Build Coastguard Workerenum addr_offs {
78*387f9dfdSAndroid Build Coastguard Worker    START_CALLER_OFF,
79*387f9dfdSAndroid Build Coastguard Worker    START_PARENT_OFF,
80*387f9dfdSAndroid Build Coastguard Worker    END_CALLER_OFF,
81*387f9dfdSAndroid Build Coastguard Worker    END_PARENT_OFF
82*387f9dfdSAndroid Build Coastguard Worker};
83*387f9dfdSAndroid Build Coastguard Worker
84*387f9dfdSAndroid Build Coastguard Workerstruct start_data {
85*387f9dfdSAndroid Build Coastguard Worker    u32 addr_offs[2];
86*387f9dfdSAndroid Build Coastguard Worker    u64 ts;
87*387f9dfdSAndroid Build Coastguard Worker    int idle_skip;
88*387f9dfdSAndroid Build Coastguard Worker    int active;
89*387f9dfdSAndroid Build Coastguard Worker};
90*387f9dfdSAndroid Build Coastguard Worker
91*387f9dfdSAndroid Build Coastguard Workerstruct data_t {
92*387f9dfdSAndroid Build Coastguard Worker    u64 time;
93*387f9dfdSAndroid Build Coastguard Worker    s64 stack_id;
94*387f9dfdSAndroid Build Coastguard Worker    u32 cpu;
95*387f9dfdSAndroid Build Coastguard Worker    u64 id;
96*387f9dfdSAndroid Build Coastguard Worker    u32 addrs[4];   /* indexed by addr_offs */
97*387f9dfdSAndroid Build Coastguard Worker    char comm[TASK_COMM_LEN];
98*387f9dfdSAndroid Build Coastguard Worker};
99*387f9dfdSAndroid Build Coastguard Worker
100*387f9dfdSAndroid Build Coastguard WorkerBPF_STACK_TRACE(stack_traces, 16384);
101*387f9dfdSAndroid Build Coastguard WorkerBPF_PERCPU_ARRAY(sts, struct start_data, 1);
102*387f9dfdSAndroid Build Coastguard WorkerBPF_PERCPU_ARRAY(isidle, u64, 1);
103*387f9dfdSAndroid Build Coastguard WorkerBPF_PERF_OUTPUT(events);
104*387f9dfdSAndroid Build Coastguard Worker
105*387f9dfdSAndroid Build Coastguard Worker/*
106*387f9dfdSAndroid Build Coastguard Worker * In the below code we install tracepoint probes on preempt or
107*387f9dfdSAndroid Build Coastguard Worker * IRQ disable/enable critical sections and idle events, the cases
108*387f9dfdSAndroid Build Coastguard Worker * are combinations of 4 different states.
109*387f9dfdSAndroid Build Coastguard Worker * The states are defined as:
110*387f9dfdSAndroid Build Coastguard Worker * CSenter: A critical section has been entered. Either due to
111*387f9dfdSAndroid Build Coastguard Worker *          preempt disable or irq disable.
112*387f9dfdSAndroid Build Coastguard Worker * CSexit: A critical section has been exited. Either due to
113*387f9dfdSAndroid Build Coastguard Worker *         preempt enable or irq enable.
114*387f9dfdSAndroid Build Coastguard Worker * Ienter: The CPU has entered an idle state.
115*387f9dfdSAndroid Build Coastguard Worker * Iexit: The CPU has exited an idle state.
116*387f9dfdSAndroid Build Coastguard Worker *
117*387f9dfdSAndroid Build Coastguard Worker * The scenario we are trying to detect is if there is an overlap
118*387f9dfdSAndroid Build Coastguard Worker * between Critical sections and idle entry/exit. If there are any
119*387f9dfdSAndroid Build Coastguard Worker * such cases, we avoid recording those critical sections since they
120*387f9dfdSAndroid Build Coastguard Worker * are not worth while to record and just add noise.
121*387f9dfdSAndroid Build Coastguard Worker */
122*387f9dfdSAndroid Build Coastguard WorkerTRACEPOINT_PROBE(power, cpu_idle)
123*387f9dfdSAndroid Build Coastguard Worker{
124*387f9dfdSAndroid Build Coastguard Worker    int idx = 0;
125*387f9dfdSAndroid Build Coastguard Worker    u64 val;
126*387f9dfdSAndroid Build Coastguard Worker    struct start_data *stdp, std;
127*387f9dfdSAndroid Build Coastguard Worker
128*387f9dfdSAndroid Build Coastguard Worker    // Mark active sections as that they should be skipped
129*387f9dfdSAndroid Build Coastguard Worker
130*387f9dfdSAndroid Build Coastguard Worker    // Handle the case CSenter, Ienter, CSexit, Iexit
131*387f9dfdSAndroid Build Coastguard Worker    // Handle the case CSenter, Ienter, Iexit, CSexit
132*387f9dfdSAndroid Build Coastguard Worker    stdp = sts.lookup(&idx);
133*387f9dfdSAndroid Build Coastguard Worker    if (stdp && stdp->active) {
134*387f9dfdSAndroid Build Coastguard Worker        /*
135*387f9dfdSAndroid Build Coastguard Worker         * Due to verifier issues, we have to copy contents
136*387f9dfdSAndroid Build Coastguard Worker         * of stdp onto the stack before the update.
137*387f9dfdSAndroid Build Coastguard Worker         * Fix it to directly update once kernel patch d71962f
138*387f9dfdSAndroid Build Coastguard Worker         * becomes more widespread.
139*387f9dfdSAndroid Build Coastguard Worker         */
140*387f9dfdSAndroid Build Coastguard Worker        std = *stdp;
141*387f9dfdSAndroid Build Coastguard Worker        std.idle_skip = 1;
142*387f9dfdSAndroid Build Coastguard Worker        sts.update(&idx, &std);
143*387f9dfdSAndroid Build Coastguard Worker    }
144*387f9dfdSAndroid Build Coastguard Worker
145*387f9dfdSAndroid Build Coastguard Worker    // Mark CPU as actively within idle or not.
146*387f9dfdSAndroid Build Coastguard Worker    if (args->state < 100) {
147*387f9dfdSAndroid Build Coastguard Worker        val = 1;
148*387f9dfdSAndroid Build Coastguard Worker        isidle.update(&idx, &val);
149*387f9dfdSAndroid Build Coastguard Worker    } else {
150*387f9dfdSAndroid Build Coastguard Worker        val = 0;
151*387f9dfdSAndroid Build Coastguard Worker        isidle.update(&idx, &val);
152*387f9dfdSAndroid Build Coastguard Worker    }
153*387f9dfdSAndroid Build Coastguard Worker    return 0;
154*387f9dfdSAndroid Build Coastguard Worker}
155*387f9dfdSAndroid Build Coastguard Worker
156*387f9dfdSAndroid Build Coastguard Workerstatic int in_idle(void)
157*387f9dfdSAndroid Build Coastguard Worker{
158*387f9dfdSAndroid Build Coastguard Worker     u64 *idlep;
159*387f9dfdSAndroid Build Coastguard Worker     int idx = 0;
160*387f9dfdSAndroid Build Coastguard Worker
161*387f9dfdSAndroid Build Coastguard Worker    // Skip event if we're in idle loop
162*387f9dfdSAndroid Build Coastguard Worker    idlep = isidle.lookup(&idx);
163*387f9dfdSAndroid Build Coastguard Worker    if (idlep && *idlep)
164*387f9dfdSAndroid Build Coastguard Worker        return 1;
165*387f9dfdSAndroid Build Coastguard Worker    return 0;
166*387f9dfdSAndroid Build Coastguard Worker}
167*387f9dfdSAndroid Build Coastguard Worker
168*387f9dfdSAndroid Build Coastguard Workerstatic void reset_state(void)
169*387f9dfdSAndroid Build Coastguard Worker{
170*387f9dfdSAndroid Build Coastguard Worker    int idx = 0;
171*387f9dfdSAndroid Build Coastguard Worker    struct start_data s = {};
172*387f9dfdSAndroid Build Coastguard Worker
173*387f9dfdSAndroid Build Coastguard Worker    sts.update(&idx, &s);
174*387f9dfdSAndroid Build Coastguard Worker}
175*387f9dfdSAndroid Build Coastguard Worker
176*387f9dfdSAndroid Build Coastguard WorkerTRACEPOINT_PROBE(preemptirq, TYPE_disable)
177*387f9dfdSAndroid Build Coastguard Worker{
178*387f9dfdSAndroid Build Coastguard Worker    int idx = 0;
179*387f9dfdSAndroid Build Coastguard Worker    struct start_data s;
180*387f9dfdSAndroid Build Coastguard Worker
181*387f9dfdSAndroid Build Coastguard Worker    // Handle the case Ienter, CSenter, CSexit, Iexit
182*387f9dfdSAndroid Build Coastguard Worker    // Handle the case Ienter, CSenter, Iexit, CSexit
183*387f9dfdSAndroid Build Coastguard Worker    if (in_idle()) {
184*387f9dfdSAndroid Build Coastguard Worker        reset_state();
185*387f9dfdSAndroid Build Coastguard Worker        return 0;
186*387f9dfdSAndroid Build Coastguard Worker    }
187*387f9dfdSAndroid Build Coastguard Worker
188*387f9dfdSAndroid Build Coastguard Worker    u64 ts = bpf_ktime_get_ns();
189*387f9dfdSAndroid Build Coastguard Worker
190*387f9dfdSAndroid Build Coastguard Worker    s.idle_skip = 0;
191*387f9dfdSAndroid Build Coastguard Worker    s.addr_offs[START_CALLER_OFF] = args->caller_offs;
192*387f9dfdSAndroid Build Coastguard Worker    s.addr_offs[START_PARENT_OFF] = args->parent_offs;
193*387f9dfdSAndroid Build Coastguard Worker    s.ts = ts;
194*387f9dfdSAndroid Build Coastguard Worker    s.active = 1;
195*387f9dfdSAndroid Build Coastguard Worker
196*387f9dfdSAndroid Build Coastguard Worker    sts.update(&idx, &s);
197*387f9dfdSAndroid Build Coastguard Worker    return 0;
198*387f9dfdSAndroid Build Coastguard Worker}
199*387f9dfdSAndroid Build Coastguard Worker
200*387f9dfdSAndroid Build Coastguard WorkerTRACEPOINT_PROBE(preemptirq, TYPE_enable)
201*387f9dfdSAndroid Build Coastguard Worker{
202*387f9dfdSAndroid Build Coastguard Worker    int idx = 0;
203*387f9dfdSAndroid Build Coastguard Worker    u64 start_ts, end_ts, diff;
204*387f9dfdSAndroid Build Coastguard Worker    struct start_data *stdp;
205*387f9dfdSAndroid Build Coastguard Worker
206*387f9dfdSAndroid Build Coastguard Worker    // Handle the case CSenter, Ienter, CSexit, Iexit
207*387f9dfdSAndroid Build Coastguard Worker    // Handle the case Ienter, CSenter, CSexit, Iexit
208*387f9dfdSAndroid Build Coastguard Worker    if (in_idle()) {
209*387f9dfdSAndroid Build Coastguard Worker        reset_state();
210*387f9dfdSAndroid Build Coastguard Worker        return 0;
211*387f9dfdSAndroid Build Coastguard Worker    }
212*387f9dfdSAndroid Build Coastguard Worker
213*387f9dfdSAndroid Build Coastguard Worker    stdp = sts.lookup(&idx);
214*387f9dfdSAndroid Build Coastguard Worker    if (!stdp) {
215*387f9dfdSAndroid Build Coastguard Worker        reset_state();
216*387f9dfdSAndroid Build Coastguard Worker        return 0;
217*387f9dfdSAndroid Build Coastguard Worker    }
218*387f9dfdSAndroid Build Coastguard Worker
219*387f9dfdSAndroid Build Coastguard Worker    // Handle the case Ienter, Csenter, Iexit, Csexit
220*387f9dfdSAndroid Build Coastguard Worker    if (!stdp->active) {
221*387f9dfdSAndroid Build Coastguard Worker        reset_state();
222*387f9dfdSAndroid Build Coastguard Worker        return 0;
223*387f9dfdSAndroid Build Coastguard Worker    }
224*387f9dfdSAndroid Build Coastguard Worker
225*387f9dfdSAndroid Build Coastguard Worker    // Handle the case CSenter, Ienter, Iexit, CSexit
226*387f9dfdSAndroid Build Coastguard Worker    if (stdp->idle_skip) {
227*387f9dfdSAndroid Build Coastguard Worker        reset_state();
228*387f9dfdSAndroid Build Coastguard Worker        return 0;
229*387f9dfdSAndroid Build Coastguard Worker    }
230*387f9dfdSAndroid Build Coastguard Worker
231*387f9dfdSAndroid Build Coastguard Worker    end_ts = bpf_ktime_get_ns();
232*387f9dfdSAndroid Build Coastguard Worker    start_ts = stdp->ts;
233*387f9dfdSAndroid Build Coastguard Worker
234*387f9dfdSAndroid Build Coastguard Worker    if (start_ts > end_ts) {
235*387f9dfdSAndroid Build Coastguard Worker        reset_state();
236*387f9dfdSAndroid Build Coastguard Worker        return 0;
237*387f9dfdSAndroid Build Coastguard Worker    }
238*387f9dfdSAndroid Build Coastguard Worker
239*387f9dfdSAndroid Build Coastguard Worker    diff = end_ts - start_ts;
240*387f9dfdSAndroid Build Coastguard Worker
241*387f9dfdSAndroid Build Coastguard Worker    if (diff < DURATION) {
242*387f9dfdSAndroid Build Coastguard Worker        reset_state();
243*387f9dfdSAndroid Build Coastguard Worker        return 0;
244*387f9dfdSAndroid Build Coastguard Worker    }
245*387f9dfdSAndroid Build Coastguard Worker
246*387f9dfdSAndroid Build Coastguard Worker    u64 id = bpf_get_current_pid_tgid();
247*387f9dfdSAndroid Build Coastguard Worker    struct data_t data = {};
248*387f9dfdSAndroid Build Coastguard Worker
249*387f9dfdSAndroid Build Coastguard Worker    if (bpf_get_current_comm(&data.comm, sizeof(data.comm)) == 0) {
250*387f9dfdSAndroid Build Coastguard Worker        data.addrs[START_CALLER_OFF] = stdp->addr_offs[START_CALLER_OFF];
251*387f9dfdSAndroid Build Coastguard Worker        data.addrs[START_PARENT_OFF] = stdp->addr_offs[START_PARENT_OFF];
252*387f9dfdSAndroid Build Coastguard Worker        data.addrs[END_CALLER_OFF] = args->caller_offs;
253*387f9dfdSAndroid Build Coastguard Worker        data.addrs[END_PARENT_OFF] = args->parent_offs;
254*387f9dfdSAndroid Build Coastguard Worker
255*387f9dfdSAndroid Build Coastguard Worker        data.id = id;
256*387f9dfdSAndroid Build Coastguard Worker        data.stack_id = stack_traces.get_stackid(args, 0);
257*387f9dfdSAndroid Build Coastguard Worker        data.time = diff;
258*387f9dfdSAndroid Build Coastguard Worker        data.cpu = bpf_get_smp_processor_id();
259*387f9dfdSAndroid Build Coastguard Worker        events.perf_submit(args, &data, sizeof(data));
260*387f9dfdSAndroid Build Coastguard Worker    }
261*387f9dfdSAndroid Build Coastguard Worker
262*387f9dfdSAndroid Build Coastguard Worker    reset_state();
263*387f9dfdSAndroid Build Coastguard Worker    return 0;
264*387f9dfdSAndroid Build Coastguard Worker}
265*387f9dfdSAndroid Build Coastguard Worker"""
266*387f9dfdSAndroid Build Coastguard Workerbpf_text = bpf_text.replace('DURATION', '{}'.format(int(args.duration) * 1000))
267*387f9dfdSAndroid Build Coastguard Worker
268*387f9dfdSAndroid Build Coastguard Workerif preemptoff:
269*387f9dfdSAndroid Build Coastguard Worker    bpf_text = bpf_text.replace('TYPE', 'preempt')
270*387f9dfdSAndroid Build Coastguard Workerelse:
271*387f9dfdSAndroid Build Coastguard Worker    bpf_text = bpf_text.replace('TYPE', 'irq')
272*387f9dfdSAndroid Build Coastguard Worker
273*387f9dfdSAndroid Build Coastguard Workerb = BPF(text=bpf_text)
274*387f9dfdSAndroid Build Coastguard Worker
275*387f9dfdSAndroid Build Coastguard Workerdef get_syms(kstack):
276*387f9dfdSAndroid Build Coastguard Worker    syms = []
277*387f9dfdSAndroid Build Coastguard Worker
278*387f9dfdSAndroid Build Coastguard Worker    for addr in kstack:
279*387f9dfdSAndroid Build Coastguard Worker        s = b.ksym(addr, show_offset=True)
280*387f9dfdSAndroid Build Coastguard Worker        syms.append(s)
281*387f9dfdSAndroid Build Coastguard Worker
282*387f9dfdSAndroid Build Coastguard Worker    return syms
283*387f9dfdSAndroid Build Coastguard Worker
284*387f9dfdSAndroid Build Coastguard Worker# process event
285*387f9dfdSAndroid Build Coastguard Workerdef print_event(cpu, data, size):
286*387f9dfdSAndroid Build Coastguard Worker    try:
287*387f9dfdSAndroid Build Coastguard Worker        global b
288*387f9dfdSAndroid Build Coastguard Worker        event = b["events"].event(data)
289*387f9dfdSAndroid Build Coastguard Worker        stack_traces = b['stack_traces']
290*387f9dfdSAndroid Build Coastguard Worker        stext = b.ksymname('_stext')
291*387f9dfdSAndroid Build Coastguard Worker
292*387f9dfdSAndroid Build Coastguard Worker        print("===================================")
293*387f9dfdSAndroid Build Coastguard Worker        print("TASK: %s (pid %5d tid %5d) Total Time: %-9.3fus\n\n" % (event.comm, \
294*387f9dfdSAndroid Build Coastguard Worker            (event.id >> 32), (event.id & 0xffffffff), float(event.time) / 1000), end="")
295*387f9dfdSAndroid Build Coastguard Worker        print("Section start: {} -> {}".format(b.ksym(stext + event.addrs[0]), b.ksym(stext + event.addrs[1])))
296*387f9dfdSAndroid Build Coastguard Worker        print("Section end:   {} -> {}".format(b.ksym(stext + event.addrs[2]), b.ksym(stext + event.addrs[3])))
297*387f9dfdSAndroid Build Coastguard Worker
298*387f9dfdSAndroid Build Coastguard Worker        if event.stack_id >= 0:
299*387f9dfdSAndroid Build Coastguard Worker            kstack = stack_traces.walk(event.stack_id)
300*387f9dfdSAndroid Build Coastguard Worker            syms = get_syms(kstack)
301*387f9dfdSAndroid Build Coastguard Worker            if not syms:
302*387f9dfdSAndroid Build Coastguard Worker                return
303*387f9dfdSAndroid Build Coastguard Worker
304*387f9dfdSAndroid Build Coastguard Worker            for s in syms:
305*387f9dfdSAndroid Build Coastguard Worker                print("  ", end="")
306*387f9dfdSAndroid Build Coastguard Worker                print("%s" % s)
307*387f9dfdSAndroid Build Coastguard Worker        else:
308*387f9dfdSAndroid Build Coastguard Worker            print("NO STACK FOUND DUE TO COLLISION")
309*387f9dfdSAndroid Build Coastguard Worker        print("===================================")
310*387f9dfdSAndroid Build Coastguard Worker        print("")
311*387f9dfdSAndroid Build Coastguard Worker    except Exception:
312*387f9dfdSAndroid Build Coastguard Worker        sys.exit(0)
313*387f9dfdSAndroid Build Coastguard Worker
314*387f9dfdSAndroid Build Coastguard Workerb["events"].open_perf_buffer(print_event, page_cnt=256)
315*387f9dfdSAndroid Build Coastguard Worker
316*387f9dfdSAndroid Build Coastguard Workerprint("Finding critical section with {} disabled for > {}us".format(
317*387f9dfdSAndroid Build Coastguard Worker    ('preempt' if preemptoff else 'IRQ'), args.duration))
318*387f9dfdSAndroid Build Coastguard Worker
319*387f9dfdSAndroid Build Coastguard Workerwhile 1:
320*387f9dfdSAndroid Build Coastguard Worker    try:
321*387f9dfdSAndroid Build Coastguard Worker        b.perf_buffer_poll()
322*387f9dfdSAndroid Build Coastguard Worker    except KeyboardInterrupt:
323*387f9dfdSAndroid Build Coastguard Worker        exit()
324