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