1880d22f2SFrederic Weisbecker#!/usr/bin/python 2880d22f2SFrederic Weisbecker# 3880d22f2SFrederic Weisbecker# Cpu task migration overview toy 4880d22f2SFrederic Weisbecker# 5880d22f2SFrederic Weisbecker# Copyright (C) 2010 Frederic Weisbecker <[email protected]> 6880d22f2SFrederic Weisbecker# 7765532c8SArnaldo Carvalho de Melo# perf script event handlers have been generated by perf script -g python 8880d22f2SFrederic Weisbecker# 9df92b408SFrederic Weisbecker# This software is distributed under the terms of the GNU General 10df92b408SFrederic Weisbecker# Public License ("GPL") version 2 as published by the Free Software 11df92b408SFrederic Weisbecker# Foundation. 12880d22f2SFrederic Weisbecker 13880d22f2SFrederic Weisbecker 14880d22f2SFrederic Weisbeckerimport os 15880d22f2SFrederic Weisbeckerimport sys 16880d22f2SFrederic Weisbecker 17880d22f2SFrederic Weisbeckerfrom collections import defaultdict 18880d22f2SFrederic Weisbeckerfrom UserList import UserList 19880d22f2SFrederic Weisbecker 20880d22f2SFrederic Weisbeckersys.path.append(os.environ['PERF_EXEC_PATH'] + \ 21880d22f2SFrederic Weisbecker '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 22df92b408SFrederic Weisbeckersys.path.append('scripts/python/Perf-Trace-Util/lib/Perf/Trace') 23880d22f2SFrederic Weisbecker 24880d22f2SFrederic Weisbeckerfrom perf_trace_context import * 25880d22f2SFrederic Weisbeckerfrom Core import * 26df92b408SFrederic Weisbeckerfrom SchedGui import * 27880d22f2SFrederic Weisbecker 28880d22f2SFrederic Weisbecker 29880d22f2SFrederic Weisbeckerthreads = { 0 : "idle"} 30880d22f2SFrederic Weisbecker 31880d22f2SFrederic Weisbeckerdef thread_name(pid): 32880d22f2SFrederic Weisbecker return "%s:%d" % (threads[pid], pid) 33880d22f2SFrederic Weisbecker 34880d22f2SFrederic Weisbeckerclass RunqueueEventUnknown: 35880d22f2SFrederic Weisbecker @staticmethod 36880d22f2SFrederic Weisbecker def color(): 37880d22f2SFrederic Weisbecker return None 38880d22f2SFrederic Weisbecker 39880d22f2SFrederic Weisbecker def __repr__(self): 40880d22f2SFrederic Weisbecker return "unknown" 41880d22f2SFrederic Weisbecker 42880d22f2SFrederic Weisbeckerclass RunqueueEventSleep: 43880d22f2SFrederic Weisbecker @staticmethod 44880d22f2SFrederic Weisbecker def color(): 45880d22f2SFrederic Weisbecker return (0, 0, 0xff) 46880d22f2SFrederic Weisbecker 47880d22f2SFrederic Weisbecker def __init__(self, sleeper): 48880d22f2SFrederic Weisbecker self.sleeper = sleeper 49880d22f2SFrederic Weisbecker 50880d22f2SFrederic Weisbecker def __repr__(self): 51880d22f2SFrederic Weisbecker return "%s gone to sleep" % thread_name(self.sleeper) 52880d22f2SFrederic Weisbecker 53880d22f2SFrederic Weisbeckerclass RunqueueEventWakeup: 54880d22f2SFrederic Weisbecker @staticmethod 55880d22f2SFrederic Weisbecker def color(): 56880d22f2SFrederic Weisbecker return (0xff, 0xff, 0) 57880d22f2SFrederic Weisbecker 58880d22f2SFrederic Weisbecker def __init__(self, wakee): 59880d22f2SFrederic Weisbecker self.wakee = wakee 60880d22f2SFrederic Weisbecker 61880d22f2SFrederic Weisbecker def __repr__(self): 62880d22f2SFrederic Weisbecker return "%s woke up" % thread_name(self.wakee) 63880d22f2SFrederic Weisbecker 64880d22f2SFrederic Weisbeckerclass RunqueueEventFork: 65880d22f2SFrederic Weisbecker @staticmethod 66880d22f2SFrederic Weisbecker def color(): 67880d22f2SFrederic Weisbecker return (0, 0xff, 0) 68880d22f2SFrederic Weisbecker 69880d22f2SFrederic Weisbecker def __init__(self, child): 70880d22f2SFrederic Weisbecker self.child = child 71880d22f2SFrederic Weisbecker 72880d22f2SFrederic Weisbecker def __repr__(self): 73880d22f2SFrederic Weisbecker return "new forked task %s" % thread_name(self.child) 74880d22f2SFrederic Weisbecker 75880d22f2SFrederic Weisbeckerclass RunqueueMigrateIn: 76880d22f2SFrederic Weisbecker @staticmethod 77880d22f2SFrederic Weisbecker def color(): 78880d22f2SFrederic Weisbecker return (0, 0xf0, 0xff) 79880d22f2SFrederic Weisbecker 80880d22f2SFrederic Weisbecker def __init__(self, new): 81880d22f2SFrederic Weisbecker self.new = new 82880d22f2SFrederic Weisbecker 83880d22f2SFrederic Weisbecker def __repr__(self): 84880d22f2SFrederic Weisbecker return "task migrated in %s" % thread_name(self.new) 85880d22f2SFrederic Weisbecker 86880d22f2SFrederic Weisbeckerclass RunqueueMigrateOut: 87880d22f2SFrederic Weisbecker @staticmethod 88880d22f2SFrederic Weisbecker def color(): 89880d22f2SFrederic Weisbecker return (0xff, 0, 0xff) 90880d22f2SFrederic Weisbecker 91880d22f2SFrederic Weisbecker def __init__(self, old): 92880d22f2SFrederic Weisbecker self.old = old 93880d22f2SFrederic Weisbecker 94880d22f2SFrederic Weisbecker def __repr__(self): 95880d22f2SFrederic Weisbecker return "task migrated out %s" % thread_name(self.old) 96880d22f2SFrederic Weisbecker 97880d22f2SFrederic Weisbeckerclass RunqueueSnapshot: 98880d22f2SFrederic Weisbecker def __init__(self, tasks = [0], event = RunqueueEventUnknown()): 99880d22f2SFrederic Weisbecker self.tasks = tuple(tasks) 100880d22f2SFrederic Weisbecker self.event = event 101880d22f2SFrederic Weisbecker 102880d22f2SFrederic Weisbecker def sched_switch(self, prev, prev_state, next): 103880d22f2SFrederic Weisbecker event = RunqueueEventUnknown() 104880d22f2SFrederic Weisbecker 105880d22f2SFrederic Weisbecker if taskState(prev_state) == "R" and next in self.tasks \ 106880d22f2SFrederic Weisbecker and prev in self.tasks: 107880d22f2SFrederic Weisbecker return self 108880d22f2SFrederic Weisbecker 109880d22f2SFrederic Weisbecker if taskState(prev_state) != "R": 110880d22f2SFrederic Weisbecker event = RunqueueEventSleep(prev) 111880d22f2SFrederic Weisbecker 112880d22f2SFrederic Weisbecker next_tasks = list(self.tasks[:]) 113880d22f2SFrederic Weisbecker if prev in self.tasks: 114880d22f2SFrederic Weisbecker if taskState(prev_state) != "R": 115880d22f2SFrederic Weisbecker next_tasks.remove(prev) 116880d22f2SFrederic Weisbecker elif taskState(prev_state) == "R": 117880d22f2SFrederic Weisbecker next_tasks.append(prev) 118880d22f2SFrederic Weisbecker 119880d22f2SFrederic Weisbecker if next not in next_tasks: 120880d22f2SFrederic Weisbecker next_tasks.append(next) 121880d22f2SFrederic Weisbecker 122880d22f2SFrederic Weisbecker return RunqueueSnapshot(next_tasks, event) 123880d22f2SFrederic Weisbecker 124880d22f2SFrederic Weisbecker def migrate_out(self, old): 125880d22f2SFrederic Weisbecker if old not in self.tasks: 126880d22f2SFrederic Weisbecker return self 127880d22f2SFrederic Weisbecker next_tasks = [task for task in self.tasks if task != old] 128880d22f2SFrederic Weisbecker 129880d22f2SFrederic Weisbecker return RunqueueSnapshot(next_tasks, RunqueueMigrateOut(old)) 130880d22f2SFrederic Weisbecker 131880d22f2SFrederic Weisbecker def __migrate_in(self, new, event): 132880d22f2SFrederic Weisbecker if new in self.tasks: 133880d22f2SFrederic Weisbecker self.event = event 134880d22f2SFrederic Weisbecker return self 135880d22f2SFrederic Weisbecker next_tasks = self.tasks[:] + tuple([new]) 136880d22f2SFrederic Weisbecker 137880d22f2SFrederic Weisbecker return RunqueueSnapshot(next_tasks, event) 138880d22f2SFrederic Weisbecker 139880d22f2SFrederic Weisbecker def migrate_in(self, new): 140880d22f2SFrederic Weisbecker return self.__migrate_in(new, RunqueueMigrateIn(new)) 141880d22f2SFrederic Weisbecker 142880d22f2SFrederic Weisbecker def wake_up(self, new): 143880d22f2SFrederic Weisbecker return self.__migrate_in(new, RunqueueEventWakeup(new)) 144880d22f2SFrederic Weisbecker 145880d22f2SFrederic Weisbecker def wake_up_new(self, new): 146880d22f2SFrederic Weisbecker return self.__migrate_in(new, RunqueueEventFork(new)) 147880d22f2SFrederic Weisbecker 148880d22f2SFrederic Weisbecker def load(self): 149880d22f2SFrederic Weisbecker """ Provide the number of tasks on the runqueue. 150880d22f2SFrederic Weisbecker Don't count idle""" 151880d22f2SFrederic Weisbecker return len(self.tasks) - 1 152880d22f2SFrederic Weisbecker 153880d22f2SFrederic Weisbecker def __repr__(self): 154880d22f2SFrederic Weisbecker ret = self.tasks.__repr__() 155880d22f2SFrederic Weisbecker ret += self.origin_tostring() 156880d22f2SFrederic Weisbecker 157880d22f2SFrederic Weisbecker return ret 158880d22f2SFrederic Weisbecker 159880d22f2SFrederic Weisbeckerclass TimeSlice: 160880d22f2SFrederic Weisbecker def __init__(self, start, prev): 161880d22f2SFrederic Weisbecker self.start = start 162880d22f2SFrederic Weisbecker self.prev = prev 163880d22f2SFrederic Weisbecker self.end = start 164880d22f2SFrederic Weisbecker # cpus that triggered the event 165880d22f2SFrederic Weisbecker self.event_cpus = [] 166880d22f2SFrederic Weisbecker if prev is not None: 167880d22f2SFrederic Weisbecker self.total_load = prev.total_load 168880d22f2SFrederic Weisbecker self.rqs = prev.rqs.copy() 169880d22f2SFrederic Weisbecker else: 170880d22f2SFrederic Weisbecker self.rqs = defaultdict(RunqueueSnapshot) 171880d22f2SFrederic Weisbecker self.total_load = 0 172880d22f2SFrederic Weisbecker 173880d22f2SFrederic Weisbecker def __update_total_load(self, old_rq, new_rq): 174880d22f2SFrederic Weisbecker diff = new_rq.load() - old_rq.load() 175880d22f2SFrederic Weisbecker self.total_load += diff 176880d22f2SFrederic Weisbecker 177880d22f2SFrederic Weisbecker def sched_switch(self, ts_list, prev, prev_state, next, cpu): 178880d22f2SFrederic Weisbecker old_rq = self.prev.rqs[cpu] 179880d22f2SFrederic Weisbecker new_rq = old_rq.sched_switch(prev, prev_state, next) 180880d22f2SFrederic Weisbecker 181880d22f2SFrederic Weisbecker if old_rq is new_rq: 182880d22f2SFrederic Weisbecker return 183880d22f2SFrederic Weisbecker 184880d22f2SFrederic Weisbecker self.rqs[cpu] = new_rq 185880d22f2SFrederic Weisbecker self.__update_total_load(old_rq, new_rq) 186880d22f2SFrederic Weisbecker ts_list.append(self) 187880d22f2SFrederic Weisbecker self.event_cpus = [cpu] 188880d22f2SFrederic Weisbecker 189880d22f2SFrederic Weisbecker def migrate(self, ts_list, new, old_cpu, new_cpu): 190880d22f2SFrederic Weisbecker if old_cpu == new_cpu: 191880d22f2SFrederic Weisbecker return 192880d22f2SFrederic Weisbecker old_rq = self.prev.rqs[old_cpu] 193880d22f2SFrederic Weisbecker out_rq = old_rq.migrate_out(new) 194880d22f2SFrederic Weisbecker self.rqs[old_cpu] = out_rq 195880d22f2SFrederic Weisbecker self.__update_total_load(old_rq, out_rq) 196880d22f2SFrederic Weisbecker 197880d22f2SFrederic Weisbecker new_rq = self.prev.rqs[new_cpu] 198880d22f2SFrederic Weisbecker in_rq = new_rq.migrate_in(new) 199880d22f2SFrederic Weisbecker self.rqs[new_cpu] = in_rq 200880d22f2SFrederic Weisbecker self.__update_total_load(new_rq, in_rq) 201880d22f2SFrederic Weisbecker 202880d22f2SFrederic Weisbecker ts_list.append(self) 203749e5074SFrederic Weisbecker 204749e5074SFrederic Weisbecker if old_rq is not out_rq: 205749e5074SFrederic Weisbecker self.event_cpus.append(old_cpu) 206749e5074SFrederic Weisbecker self.event_cpus.append(new_cpu) 207880d22f2SFrederic Weisbecker 208880d22f2SFrederic Weisbecker def wake_up(self, ts_list, pid, cpu, fork): 209880d22f2SFrederic Weisbecker old_rq = self.prev.rqs[cpu] 210880d22f2SFrederic Weisbecker if fork: 211880d22f2SFrederic Weisbecker new_rq = old_rq.wake_up_new(pid) 212880d22f2SFrederic Weisbecker else: 213880d22f2SFrederic Weisbecker new_rq = old_rq.wake_up(pid) 214880d22f2SFrederic Weisbecker 215880d22f2SFrederic Weisbecker if new_rq is old_rq: 216880d22f2SFrederic Weisbecker return 217880d22f2SFrederic Weisbecker self.rqs[cpu] = new_rq 218880d22f2SFrederic Weisbecker self.__update_total_load(old_rq, new_rq) 219880d22f2SFrederic Weisbecker ts_list.append(self) 220880d22f2SFrederic Weisbecker self.event_cpus = [cpu] 221880d22f2SFrederic Weisbecker 222880d22f2SFrederic Weisbecker def next(self, t): 223880d22f2SFrederic Weisbecker self.end = t 224880d22f2SFrederic Weisbecker return TimeSlice(t, self) 225880d22f2SFrederic Weisbecker 226880d22f2SFrederic Weisbeckerclass TimeSliceList(UserList): 227880d22f2SFrederic Weisbecker def __init__(self, arg = []): 228880d22f2SFrederic Weisbecker self.data = arg 229880d22f2SFrederic Weisbecker 230880d22f2SFrederic Weisbecker def get_time_slice(self, ts): 231880d22f2SFrederic Weisbecker if len(self.data) == 0: 232880d22f2SFrederic Weisbecker slice = TimeSlice(ts, TimeSlice(-1, None)) 233880d22f2SFrederic Weisbecker else: 234880d22f2SFrederic Weisbecker slice = self.data[-1].next(ts) 235880d22f2SFrederic Weisbecker return slice 236880d22f2SFrederic Weisbecker 237880d22f2SFrederic Weisbecker def find_time_slice(self, ts): 238880d22f2SFrederic Weisbecker start = 0 239880d22f2SFrederic Weisbecker end = len(self.data) 240880d22f2SFrederic Weisbecker found = -1 241880d22f2SFrederic Weisbecker searching = True 242880d22f2SFrederic Weisbecker while searching: 243880d22f2SFrederic Weisbecker if start == end or start == end - 1: 244880d22f2SFrederic Weisbecker searching = False 245880d22f2SFrederic Weisbecker 246880d22f2SFrederic Weisbecker i = (end + start) / 2 247880d22f2SFrederic Weisbecker if self.data[i].start <= ts and self.data[i].end >= ts: 248880d22f2SFrederic Weisbecker found = i 249880d22f2SFrederic Weisbecker end = i 250880d22f2SFrederic Weisbecker continue 251880d22f2SFrederic Weisbecker 252880d22f2SFrederic Weisbecker if self.data[i].end < ts: 253880d22f2SFrederic Weisbecker start = i 254880d22f2SFrederic Weisbecker 255880d22f2SFrederic Weisbecker elif self.data[i].start > ts: 256880d22f2SFrederic Weisbecker end = i 257880d22f2SFrederic Weisbecker 258880d22f2SFrederic Weisbecker return found 259880d22f2SFrederic Weisbecker 260699b6d92SFrederic Weisbecker def set_root_win(self, win): 261699b6d92SFrederic Weisbecker self.root_win = win 262699b6d92SFrederic Weisbecker 263699b6d92SFrederic Weisbecker def mouse_down(self, cpu, t): 264699b6d92SFrederic Weisbecker idx = self.find_time_slice(t) 265699b6d92SFrederic Weisbecker if idx == -1: 266699b6d92SFrederic Weisbecker return 267699b6d92SFrederic Weisbecker 268699b6d92SFrederic Weisbecker ts = self[idx] 269699b6d92SFrederic Weisbecker rq = ts.rqs[cpu] 270699b6d92SFrederic Weisbecker raw = "CPU: %d\n" % cpu 271699b6d92SFrederic Weisbecker raw += "Last event : %s\n" % rq.event.__repr__() 272699b6d92SFrederic Weisbecker raw += "Timestamp : %d.%06d\n" % (ts.start / (10 ** 9), (ts.start % (10 ** 9)) / 1000) 273699b6d92SFrederic Weisbecker raw += "Duration : %6d us\n" % ((ts.end - ts.start) / (10 ** 6)) 274699b6d92SFrederic Weisbecker raw += "Load = %d\n" % rq.load() 275699b6d92SFrederic Weisbecker for t in rq.tasks: 276699b6d92SFrederic Weisbecker raw += "%s \n" % thread_name(t) 277699b6d92SFrederic Weisbecker 278699b6d92SFrederic Weisbecker self.root_win.update_summary(raw) 279699b6d92SFrederic Weisbecker 280699b6d92SFrederic Weisbecker def update_rectangle_cpu(self, slice, cpu): 281699b6d92SFrederic Weisbecker rq = slice.rqs[cpu] 282699b6d92SFrederic Weisbecker 283699b6d92SFrederic Weisbecker if slice.total_load != 0: 284699b6d92SFrederic Weisbecker load_rate = rq.load() / float(slice.total_load) 285699b6d92SFrederic Weisbecker else: 286699b6d92SFrederic Weisbecker load_rate = 0 287699b6d92SFrederic Weisbecker 288699b6d92SFrederic Weisbecker red_power = int(0xff - (0xff * load_rate)) 289699b6d92SFrederic Weisbecker color = (0xff, red_power, red_power) 290699b6d92SFrederic Weisbecker 291699b6d92SFrederic Weisbecker top_color = None 292699b6d92SFrederic Weisbecker 293699b6d92SFrederic Weisbecker if cpu in slice.event_cpus: 294699b6d92SFrederic Weisbecker top_color = rq.event.color() 295699b6d92SFrederic Weisbecker 296699b6d92SFrederic Weisbecker self.root_win.paint_rectangle_zone(cpu, color, top_color, slice.start, slice.end) 297699b6d92SFrederic Weisbecker 298699b6d92SFrederic Weisbecker def fill_zone(self, start, end): 299699b6d92SFrederic Weisbecker i = self.find_time_slice(start) 300699b6d92SFrederic Weisbecker if i == -1: 301699b6d92SFrederic Weisbecker return 302699b6d92SFrederic Weisbecker 303699b6d92SFrederic Weisbecker for i in xrange(i, len(self.data)): 304699b6d92SFrederic Weisbecker timeslice = self.data[i] 305699b6d92SFrederic Weisbecker if timeslice.start > end: 306699b6d92SFrederic Weisbecker return 307699b6d92SFrederic Weisbecker 308699b6d92SFrederic Weisbecker for cpu in timeslice.rqs: 309699b6d92SFrederic Weisbecker self.update_rectangle_cpu(timeslice, cpu) 310699b6d92SFrederic Weisbecker 311880d22f2SFrederic Weisbecker def interval(self): 312880d22f2SFrederic Weisbecker if len(self.data) == 0: 313880d22f2SFrederic Weisbecker return (0, 0) 314880d22f2SFrederic Weisbecker 315880d22f2SFrederic Weisbecker return (self.data[0].start, self.data[-1].end) 316880d22f2SFrederic Weisbecker 317699b6d92SFrederic Weisbecker def nr_rectangles(self): 31870d815a3SFrederic Weisbecker last_ts = self.data[-1] 31970d815a3SFrederic Weisbecker max_cpu = 0 32070d815a3SFrederic Weisbecker for cpu in last_ts.rqs: 32170d815a3SFrederic Weisbecker if cpu > max_cpu: 32270d815a3SFrederic Weisbecker max_cpu = cpu 32370d815a3SFrederic Weisbecker return max_cpu 32470d815a3SFrederic Weisbecker 325880d22f2SFrederic Weisbecker 326880d22f2SFrederic Weisbeckerclass SchedEventProxy: 327880d22f2SFrederic Weisbecker def __init__(self): 328880d22f2SFrederic Weisbecker self.current_tsk = defaultdict(lambda : -1) 329880d22f2SFrederic Weisbecker self.timeslices = TimeSliceList() 330880d22f2SFrederic Weisbecker 331880d22f2SFrederic Weisbecker def sched_switch(self, headers, prev_comm, prev_pid, prev_prio, prev_state, 332880d22f2SFrederic Weisbecker next_comm, next_pid, next_prio): 333880d22f2SFrederic Weisbecker """ Ensure the task we sched out this cpu is really the one 334880d22f2SFrederic Weisbecker we logged. Otherwise we may have missed traces """ 335880d22f2SFrederic Weisbecker 336880d22f2SFrederic Weisbecker on_cpu_task = self.current_tsk[headers.cpu] 337880d22f2SFrederic Weisbecker 338880d22f2SFrederic Weisbecker if on_cpu_task != -1 and on_cpu_task != prev_pid: 339880d22f2SFrederic Weisbecker print "Sched switch event rejected ts: %s cpu: %d prev: %s(%d) next: %s(%d)" % \ 340880d22f2SFrederic Weisbecker (headers.ts_format(), headers.cpu, prev_comm, prev_pid, next_comm, next_pid) 341880d22f2SFrederic Weisbecker 342880d22f2SFrederic Weisbecker threads[prev_pid] = prev_comm 343880d22f2SFrederic Weisbecker threads[next_pid] = next_comm 344880d22f2SFrederic Weisbecker self.current_tsk[headers.cpu] = next_pid 345880d22f2SFrederic Weisbecker 346880d22f2SFrederic Weisbecker ts = self.timeslices.get_time_slice(headers.ts()) 347880d22f2SFrederic Weisbecker ts.sched_switch(self.timeslices, prev_pid, prev_state, next_pid, headers.cpu) 348880d22f2SFrederic Weisbecker 349880d22f2SFrederic Weisbecker def migrate(self, headers, pid, prio, orig_cpu, dest_cpu): 350880d22f2SFrederic Weisbecker ts = self.timeslices.get_time_slice(headers.ts()) 351880d22f2SFrederic Weisbecker ts.migrate(self.timeslices, pid, orig_cpu, dest_cpu) 352880d22f2SFrederic Weisbecker 353880d22f2SFrederic Weisbecker def wake_up(self, headers, comm, pid, success, target_cpu, fork): 354880d22f2SFrederic Weisbecker if success == 0: 355880d22f2SFrederic Weisbecker return 356880d22f2SFrederic Weisbecker ts = self.timeslices.get_time_slice(headers.ts()) 357880d22f2SFrederic Weisbecker ts.wake_up(self.timeslices, pid, target_cpu, fork) 358880d22f2SFrederic Weisbecker 359880d22f2SFrederic Weisbecker 360880d22f2SFrederic Weisbeckerdef trace_begin(): 361880d22f2SFrederic Weisbecker global parser 362880d22f2SFrederic Weisbecker parser = SchedEventProxy() 363880d22f2SFrederic Weisbecker 364880d22f2SFrederic Weisbeckerdef trace_end(): 365880d22f2SFrederic Weisbecker app = wx.App(False) 366880d22f2SFrederic Weisbecker timeslices = parser.timeslices 367699b6d92SFrederic Weisbecker frame = RootFrame(timeslices, "Migration") 368880d22f2SFrederic Weisbecker app.MainLoop() 369880d22f2SFrederic Weisbecker 370880d22f2SFrederic Weisbeckerdef sched__sched_stat_runtime(event_name, context, common_cpu, 371880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 372*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid, runtime, vruntime): 373880d22f2SFrederic Weisbecker pass 374880d22f2SFrederic Weisbecker 375880d22f2SFrederic Weisbeckerdef sched__sched_stat_iowait(event_name, context, common_cpu, 376880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 377*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid, delay): 378880d22f2SFrederic Weisbecker pass 379880d22f2SFrederic Weisbecker 380880d22f2SFrederic Weisbeckerdef sched__sched_stat_sleep(event_name, context, common_cpu, 381880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 382*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid, delay): 383880d22f2SFrederic Weisbecker pass 384880d22f2SFrederic Weisbecker 385880d22f2SFrederic Weisbeckerdef sched__sched_stat_wait(event_name, context, common_cpu, 386880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 387*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid, delay): 388880d22f2SFrederic Weisbecker pass 389880d22f2SFrederic Weisbecker 390880d22f2SFrederic Weisbeckerdef sched__sched_process_fork(event_name, context, common_cpu, 391880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 392*0f5f5bcdSJoseph Schuchart common_callchain, parent_comm, parent_pid, child_comm, child_pid): 393880d22f2SFrederic Weisbecker pass 394880d22f2SFrederic Weisbecker 395880d22f2SFrederic Weisbeckerdef sched__sched_process_wait(event_name, context, common_cpu, 396880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 397*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid, prio): 398880d22f2SFrederic Weisbecker pass 399880d22f2SFrederic Weisbecker 400880d22f2SFrederic Weisbeckerdef sched__sched_process_exit(event_name, context, common_cpu, 401880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 402*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid, prio): 403880d22f2SFrederic Weisbecker pass 404880d22f2SFrederic Weisbecker 405880d22f2SFrederic Weisbeckerdef sched__sched_process_free(event_name, context, common_cpu, 406880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 407*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid, prio): 408880d22f2SFrederic Weisbecker pass 409880d22f2SFrederic Weisbecker 410880d22f2SFrederic Weisbeckerdef sched__sched_migrate_task(event_name, context, common_cpu, 411880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 412*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid, prio, orig_cpu, 413880d22f2SFrederic Weisbecker dest_cpu): 414880d22f2SFrederic Weisbecker headers = EventHeaders(common_cpu, common_secs, common_nsecs, 415*0f5f5bcdSJoseph Schuchart common_pid, common_comm, common_callchain) 416880d22f2SFrederic Weisbecker parser.migrate(headers, pid, prio, orig_cpu, dest_cpu) 417880d22f2SFrederic Weisbecker 418880d22f2SFrederic Weisbeckerdef sched__sched_switch(event_name, context, common_cpu, 419*0f5f5bcdSJoseph Schuchart common_secs, common_nsecs, common_pid, common_comm, common_callchain, 420880d22f2SFrederic Weisbecker prev_comm, prev_pid, prev_prio, prev_state, 421880d22f2SFrederic Weisbecker next_comm, next_pid, next_prio): 422880d22f2SFrederic Weisbecker 423880d22f2SFrederic Weisbecker headers = EventHeaders(common_cpu, common_secs, common_nsecs, 424*0f5f5bcdSJoseph Schuchart common_pid, common_comm, common_callchain) 425880d22f2SFrederic Weisbecker parser.sched_switch(headers, prev_comm, prev_pid, prev_prio, prev_state, 426880d22f2SFrederic Weisbecker next_comm, next_pid, next_prio) 427880d22f2SFrederic Weisbecker 428880d22f2SFrederic Weisbeckerdef sched__sched_wakeup_new(event_name, context, common_cpu, 429880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 430*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid, prio, success, 431880d22f2SFrederic Weisbecker target_cpu): 432880d22f2SFrederic Weisbecker headers = EventHeaders(common_cpu, common_secs, common_nsecs, 433*0f5f5bcdSJoseph Schuchart common_pid, common_comm, common_callchain) 434880d22f2SFrederic Weisbecker parser.wake_up(headers, comm, pid, success, target_cpu, 1) 435880d22f2SFrederic Weisbecker 436880d22f2SFrederic Weisbeckerdef sched__sched_wakeup(event_name, context, common_cpu, 437880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 438*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid, prio, success, 439880d22f2SFrederic Weisbecker target_cpu): 440880d22f2SFrederic Weisbecker headers = EventHeaders(common_cpu, common_secs, common_nsecs, 441*0f5f5bcdSJoseph Schuchart common_pid, common_comm, common_callchain) 442880d22f2SFrederic Weisbecker parser.wake_up(headers, comm, pid, success, target_cpu, 0) 443880d22f2SFrederic Weisbecker 444880d22f2SFrederic Weisbeckerdef sched__sched_wait_task(event_name, context, common_cpu, 445880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 446*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid, prio): 447880d22f2SFrederic Weisbecker pass 448880d22f2SFrederic Weisbecker 449880d22f2SFrederic Weisbeckerdef sched__sched_kthread_stop_ret(event_name, context, common_cpu, 450880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 451*0f5f5bcdSJoseph Schuchart common_callchain, ret): 452880d22f2SFrederic Weisbecker pass 453880d22f2SFrederic Weisbecker 454880d22f2SFrederic Weisbeckerdef sched__sched_kthread_stop(event_name, context, common_cpu, 455880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 456*0f5f5bcdSJoseph Schuchart common_callchain, comm, pid): 457880d22f2SFrederic Weisbecker pass 458880d22f2SFrederic Weisbecker 459*0f5f5bcdSJoseph Schuchartdef trace_unhandled(event_name, context, event_fields_dict): 460880d22f2SFrederic Weisbecker pass 461