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