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# 7880d22f2SFrederic Weisbecker# perf trace event handlers have been generated by perf trace -g python 8880d22f2SFrederic Weisbecker# 9*df92b408SFrederic Weisbecker# This software is distributed under the terms of the GNU General 10*df92b408SFrederic Weisbecker# Public License ("GPL") version 2 as published by the Free Software 11*df92b408SFrederic 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') 22*df92b408SFrederic Weisbeckersys.path.append('scripts/python/Perf-Trace-Util/lib/Perf/Trace') 23880d22f2SFrederic Weisbecker 24880d22f2SFrederic Weisbeckerfrom perf_trace_context import * 25880d22f2SFrederic Weisbeckerfrom Core import * 26*df92b408SFrederic 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 EventHeaders: 35880d22f2SFrederic Weisbecker def __init__(self, common_cpu, common_secs, common_nsecs, 36880d22f2SFrederic Weisbecker common_pid, common_comm): 37880d22f2SFrederic Weisbecker self.cpu = common_cpu 38880d22f2SFrederic Weisbecker self.secs = common_secs 39880d22f2SFrederic Weisbecker self.nsecs = common_nsecs 40880d22f2SFrederic Weisbecker self.pid = common_pid 41880d22f2SFrederic Weisbecker self.comm = common_comm 42880d22f2SFrederic Weisbecker 43880d22f2SFrederic Weisbecker def ts(self): 44880d22f2SFrederic Weisbecker return (self.secs * (10 ** 9)) + self.nsecs 45880d22f2SFrederic Weisbecker 46880d22f2SFrederic Weisbecker def ts_format(self): 47880d22f2SFrederic Weisbecker return "%d.%d" % (self.secs, int(self.nsecs / 1000)) 48880d22f2SFrederic Weisbecker 49880d22f2SFrederic Weisbecker 50880d22f2SFrederic Weisbeckerdef taskState(state): 51880d22f2SFrederic Weisbecker states = { 52880d22f2SFrederic Weisbecker 0 : "R", 53880d22f2SFrederic Weisbecker 1 : "S", 54880d22f2SFrederic Weisbecker 2 : "D", 55880d22f2SFrederic Weisbecker 64: "DEAD" 56880d22f2SFrederic Weisbecker } 57880d22f2SFrederic Weisbecker 58880d22f2SFrederic Weisbecker if state not in states: 59207f90fcSFrederic Weisbecker return "Unknown" 60880d22f2SFrederic Weisbecker 61880d22f2SFrederic Weisbecker return states[state] 62880d22f2SFrederic Weisbecker 63880d22f2SFrederic Weisbecker 64880d22f2SFrederic Weisbeckerclass RunqueueEventUnknown: 65880d22f2SFrederic Weisbecker @staticmethod 66880d22f2SFrederic Weisbecker def color(): 67880d22f2SFrederic Weisbecker return None 68880d22f2SFrederic Weisbecker 69880d22f2SFrederic Weisbecker def __repr__(self): 70880d22f2SFrederic Weisbecker return "unknown" 71880d22f2SFrederic Weisbecker 72880d22f2SFrederic Weisbeckerclass RunqueueEventSleep: 73880d22f2SFrederic Weisbecker @staticmethod 74880d22f2SFrederic Weisbecker def color(): 75880d22f2SFrederic Weisbecker return (0, 0, 0xff) 76880d22f2SFrederic Weisbecker 77880d22f2SFrederic Weisbecker def __init__(self, sleeper): 78880d22f2SFrederic Weisbecker self.sleeper = sleeper 79880d22f2SFrederic Weisbecker 80880d22f2SFrederic Weisbecker def __repr__(self): 81880d22f2SFrederic Weisbecker return "%s gone to sleep" % thread_name(self.sleeper) 82880d22f2SFrederic Weisbecker 83880d22f2SFrederic Weisbeckerclass RunqueueEventWakeup: 84880d22f2SFrederic Weisbecker @staticmethod 85880d22f2SFrederic Weisbecker def color(): 86880d22f2SFrederic Weisbecker return (0xff, 0xff, 0) 87880d22f2SFrederic Weisbecker 88880d22f2SFrederic Weisbecker def __init__(self, wakee): 89880d22f2SFrederic Weisbecker self.wakee = wakee 90880d22f2SFrederic Weisbecker 91880d22f2SFrederic Weisbecker def __repr__(self): 92880d22f2SFrederic Weisbecker return "%s woke up" % thread_name(self.wakee) 93880d22f2SFrederic Weisbecker 94880d22f2SFrederic Weisbeckerclass RunqueueEventFork: 95880d22f2SFrederic Weisbecker @staticmethod 96880d22f2SFrederic Weisbecker def color(): 97880d22f2SFrederic Weisbecker return (0, 0xff, 0) 98880d22f2SFrederic Weisbecker 99880d22f2SFrederic Weisbecker def __init__(self, child): 100880d22f2SFrederic Weisbecker self.child = child 101880d22f2SFrederic Weisbecker 102880d22f2SFrederic Weisbecker def __repr__(self): 103880d22f2SFrederic Weisbecker return "new forked task %s" % thread_name(self.child) 104880d22f2SFrederic Weisbecker 105880d22f2SFrederic Weisbeckerclass RunqueueMigrateIn: 106880d22f2SFrederic Weisbecker @staticmethod 107880d22f2SFrederic Weisbecker def color(): 108880d22f2SFrederic Weisbecker return (0, 0xf0, 0xff) 109880d22f2SFrederic Weisbecker 110880d22f2SFrederic Weisbecker def __init__(self, new): 111880d22f2SFrederic Weisbecker self.new = new 112880d22f2SFrederic Weisbecker 113880d22f2SFrederic Weisbecker def __repr__(self): 114880d22f2SFrederic Weisbecker return "task migrated in %s" % thread_name(self.new) 115880d22f2SFrederic Weisbecker 116880d22f2SFrederic Weisbeckerclass RunqueueMigrateOut: 117880d22f2SFrederic Weisbecker @staticmethod 118880d22f2SFrederic Weisbecker def color(): 119880d22f2SFrederic Weisbecker return (0xff, 0, 0xff) 120880d22f2SFrederic Weisbecker 121880d22f2SFrederic Weisbecker def __init__(self, old): 122880d22f2SFrederic Weisbecker self.old = old 123880d22f2SFrederic Weisbecker 124880d22f2SFrederic Weisbecker def __repr__(self): 125880d22f2SFrederic Weisbecker return "task migrated out %s" % thread_name(self.old) 126880d22f2SFrederic Weisbecker 127880d22f2SFrederic Weisbeckerclass RunqueueSnapshot: 128880d22f2SFrederic Weisbecker def __init__(self, tasks = [0], event = RunqueueEventUnknown()): 129880d22f2SFrederic Weisbecker self.tasks = tuple(tasks) 130880d22f2SFrederic Weisbecker self.event = event 131880d22f2SFrederic Weisbecker 132880d22f2SFrederic Weisbecker def sched_switch(self, prev, prev_state, next): 133880d22f2SFrederic Weisbecker event = RunqueueEventUnknown() 134880d22f2SFrederic Weisbecker 135880d22f2SFrederic Weisbecker if taskState(prev_state) == "R" and next in self.tasks \ 136880d22f2SFrederic Weisbecker and prev in self.tasks: 137880d22f2SFrederic Weisbecker return self 138880d22f2SFrederic Weisbecker 139880d22f2SFrederic Weisbecker if taskState(prev_state) != "R": 140880d22f2SFrederic Weisbecker event = RunqueueEventSleep(prev) 141880d22f2SFrederic Weisbecker 142880d22f2SFrederic Weisbecker next_tasks = list(self.tasks[:]) 143880d22f2SFrederic Weisbecker if prev in self.tasks: 144880d22f2SFrederic Weisbecker if taskState(prev_state) != "R": 145880d22f2SFrederic Weisbecker next_tasks.remove(prev) 146880d22f2SFrederic Weisbecker elif taskState(prev_state) == "R": 147880d22f2SFrederic Weisbecker next_tasks.append(prev) 148880d22f2SFrederic Weisbecker 149880d22f2SFrederic Weisbecker if next not in next_tasks: 150880d22f2SFrederic Weisbecker next_tasks.append(next) 151880d22f2SFrederic Weisbecker 152880d22f2SFrederic Weisbecker return RunqueueSnapshot(next_tasks, event) 153880d22f2SFrederic Weisbecker 154880d22f2SFrederic Weisbecker def migrate_out(self, old): 155880d22f2SFrederic Weisbecker if old not in self.tasks: 156880d22f2SFrederic Weisbecker return self 157880d22f2SFrederic Weisbecker next_tasks = [task for task in self.tasks if task != old] 158880d22f2SFrederic Weisbecker 159880d22f2SFrederic Weisbecker return RunqueueSnapshot(next_tasks, RunqueueMigrateOut(old)) 160880d22f2SFrederic Weisbecker 161880d22f2SFrederic Weisbecker def __migrate_in(self, new, event): 162880d22f2SFrederic Weisbecker if new in self.tasks: 163880d22f2SFrederic Weisbecker self.event = event 164880d22f2SFrederic Weisbecker return self 165880d22f2SFrederic Weisbecker next_tasks = self.tasks[:] + tuple([new]) 166880d22f2SFrederic Weisbecker 167880d22f2SFrederic Weisbecker return RunqueueSnapshot(next_tasks, event) 168880d22f2SFrederic Weisbecker 169880d22f2SFrederic Weisbecker def migrate_in(self, new): 170880d22f2SFrederic Weisbecker return self.__migrate_in(new, RunqueueMigrateIn(new)) 171880d22f2SFrederic Weisbecker 172880d22f2SFrederic Weisbecker def wake_up(self, new): 173880d22f2SFrederic Weisbecker return self.__migrate_in(new, RunqueueEventWakeup(new)) 174880d22f2SFrederic Weisbecker 175880d22f2SFrederic Weisbecker def wake_up_new(self, new): 176880d22f2SFrederic Weisbecker return self.__migrate_in(new, RunqueueEventFork(new)) 177880d22f2SFrederic Weisbecker 178880d22f2SFrederic Weisbecker def load(self): 179880d22f2SFrederic Weisbecker """ Provide the number of tasks on the runqueue. 180880d22f2SFrederic Weisbecker Don't count idle""" 181880d22f2SFrederic Weisbecker return len(self.tasks) - 1 182880d22f2SFrederic Weisbecker 183880d22f2SFrederic Weisbecker def __repr__(self): 184880d22f2SFrederic Weisbecker ret = self.tasks.__repr__() 185880d22f2SFrederic Weisbecker ret += self.origin_tostring() 186880d22f2SFrederic Weisbecker 187880d22f2SFrederic Weisbecker return ret 188880d22f2SFrederic Weisbecker 189880d22f2SFrederic Weisbeckerclass TimeSlice: 190880d22f2SFrederic Weisbecker def __init__(self, start, prev): 191880d22f2SFrederic Weisbecker self.start = start 192880d22f2SFrederic Weisbecker self.prev = prev 193880d22f2SFrederic Weisbecker self.end = start 194880d22f2SFrederic Weisbecker # cpus that triggered the event 195880d22f2SFrederic Weisbecker self.event_cpus = [] 196880d22f2SFrederic Weisbecker if prev is not None: 197880d22f2SFrederic Weisbecker self.total_load = prev.total_load 198880d22f2SFrederic Weisbecker self.rqs = prev.rqs.copy() 199880d22f2SFrederic Weisbecker else: 200880d22f2SFrederic Weisbecker self.rqs = defaultdict(RunqueueSnapshot) 201880d22f2SFrederic Weisbecker self.total_load = 0 202880d22f2SFrederic Weisbecker 203880d22f2SFrederic Weisbecker def __update_total_load(self, old_rq, new_rq): 204880d22f2SFrederic Weisbecker diff = new_rq.load() - old_rq.load() 205880d22f2SFrederic Weisbecker self.total_load += diff 206880d22f2SFrederic Weisbecker 207880d22f2SFrederic Weisbecker def sched_switch(self, ts_list, prev, prev_state, next, cpu): 208880d22f2SFrederic Weisbecker old_rq = self.prev.rqs[cpu] 209880d22f2SFrederic Weisbecker new_rq = old_rq.sched_switch(prev, prev_state, next) 210880d22f2SFrederic Weisbecker 211880d22f2SFrederic Weisbecker if old_rq is new_rq: 212880d22f2SFrederic Weisbecker return 213880d22f2SFrederic Weisbecker 214880d22f2SFrederic Weisbecker self.rqs[cpu] = new_rq 215880d22f2SFrederic Weisbecker self.__update_total_load(old_rq, new_rq) 216880d22f2SFrederic Weisbecker ts_list.append(self) 217880d22f2SFrederic Weisbecker self.event_cpus = [cpu] 218880d22f2SFrederic Weisbecker 219880d22f2SFrederic Weisbecker def migrate(self, ts_list, new, old_cpu, new_cpu): 220880d22f2SFrederic Weisbecker if old_cpu == new_cpu: 221880d22f2SFrederic Weisbecker return 222880d22f2SFrederic Weisbecker old_rq = self.prev.rqs[old_cpu] 223880d22f2SFrederic Weisbecker out_rq = old_rq.migrate_out(new) 224880d22f2SFrederic Weisbecker self.rqs[old_cpu] = out_rq 225880d22f2SFrederic Weisbecker self.__update_total_load(old_rq, out_rq) 226880d22f2SFrederic Weisbecker 227880d22f2SFrederic Weisbecker new_rq = self.prev.rqs[new_cpu] 228880d22f2SFrederic Weisbecker in_rq = new_rq.migrate_in(new) 229880d22f2SFrederic Weisbecker self.rqs[new_cpu] = in_rq 230880d22f2SFrederic Weisbecker self.__update_total_load(new_rq, in_rq) 231880d22f2SFrederic Weisbecker 232880d22f2SFrederic Weisbecker ts_list.append(self) 233749e5074SFrederic Weisbecker 234749e5074SFrederic Weisbecker if old_rq is not out_rq: 235749e5074SFrederic Weisbecker self.event_cpus.append(old_cpu) 236749e5074SFrederic Weisbecker self.event_cpus.append(new_cpu) 237880d22f2SFrederic Weisbecker 238880d22f2SFrederic Weisbecker def wake_up(self, ts_list, pid, cpu, fork): 239880d22f2SFrederic Weisbecker old_rq = self.prev.rqs[cpu] 240880d22f2SFrederic Weisbecker if fork: 241880d22f2SFrederic Weisbecker new_rq = old_rq.wake_up_new(pid) 242880d22f2SFrederic Weisbecker else: 243880d22f2SFrederic Weisbecker new_rq = old_rq.wake_up(pid) 244880d22f2SFrederic Weisbecker 245880d22f2SFrederic Weisbecker if new_rq is old_rq: 246880d22f2SFrederic Weisbecker return 247880d22f2SFrederic Weisbecker self.rqs[cpu] = new_rq 248880d22f2SFrederic Weisbecker self.__update_total_load(old_rq, new_rq) 249880d22f2SFrederic Weisbecker ts_list.append(self) 250880d22f2SFrederic Weisbecker self.event_cpus = [cpu] 251880d22f2SFrederic Weisbecker 252880d22f2SFrederic Weisbecker def next(self, t): 253880d22f2SFrederic Weisbecker self.end = t 254880d22f2SFrederic Weisbecker return TimeSlice(t, self) 255880d22f2SFrederic Weisbecker 256880d22f2SFrederic Weisbeckerclass TimeSliceList(UserList): 257880d22f2SFrederic Weisbecker def __init__(self, arg = []): 258880d22f2SFrederic Weisbecker self.data = arg 259880d22f2SFrederic Weisbecker 260880d22f2SFrederic Weisbecker def get_time_slice(self, ts): 261880d22f2SFrederic Weisbecker if len(self.data) == 0: 262880d22f2SFrederic Weisbecker slice = TimeSlice(ts, TimeSlice(-1, None)) 263880d22f2SFrederic Weisbecker else: 264880d22f2SFrederic Weisbecker slice = self.data[-1].next(ts) 265880d22f2SFrederic Weisbecker return slice 266880d22f2SFrederic Weisbecker 267880d22f2SFrederic Weisbecker def find_time_slice(self, ts): 268880d22f2SFrederic Weisbecker start = 0 269880d22f2SFrederic Weisbecker end = len(self.data) 270880d22f2SFrederic Weisbecker found = -1 271880d22f2SFrederic Weisbecker searching = True 272880d22f2SFrederic Weisbecker while searching: 273880d22f2SFrederic Weisbecker if start == end or start == end - 1: 274880d22f2SFrederic Weisbecker searching = False 275880d22f2SFrederic Weisbecker 276880d22f2SFrederic Weisbecker i = (end + start) / 2 277880d22f2SFrederic Weisbecker if self.data[i].start <= ts and self.data[i].end >= ts: 278880d22f2SFrederic Weisbecker found = i 279880d22f2SFrederic Weisbecker end = i 280880d22f2SFrederic Weisbecker continue 281880d22f2SFrederic Weisbecker 282880d22f2SFrederic Weisbecker if self.data[i].end < ts: 283880d22f2SFrederic Weisbecker start = i 284880d22f2SFrederic Weisbecker 285880d22f2SFrederic Weisbecker elif self.data[i].start > ts: 286880d22f2SFrederic Weisbecker end = i 287880d22f2SFrederic Weisbecker 288880d22f2SFrederic Weisbecker return found 289880d22f2SFrederic Weisbecker 290699b6d92SFrederic Weisbecker def set_root_win(self, win): 291699b6d92SFrederic Weisbecker self.root_win = win 292699b6d92SFrederic Weisbecker 293699b6d92SFrederic Weisbecker def mouse_down(self, cpu, t): 294699b6d92SFrederic Weisbecker idx = self.find_time_slice(t) 295699b6d92SFrederic Weisbecker if idx == -1: 296699b6d92SFrederic Weisbecker return 297699b6d92SFrederic Weisbecker 298699b6d92SFrederic Weisbecker ts = self[idx] 299699b6d92SFrederic Weisbecker rq = ts.rqs[cpu] 300699b6d92SFrederic Weisbecker raw = "CPU: %d\n" % cpu 301699b6d92SFrederic Weisbecker raw += "Last event : %s\n" % rq.event.__repr__() 302699b6d92SFrederic Weisbecker raw += "Timestamp : %d.%06d\n" % (ts.start / (10 ** 9), (ts.start % (10 ** 9)) / 1000) 303699b6d92SFrederic Weisbecker raw += "Duration : %6d us\n" % ((ts.end - ts.start) / (10 ** 6)) 304699b6d92SFrederic Weisbecker raw += "Load = %d\n" % rq.load() 305699b6d92SFrederic Weisbecker for t in rq.tasks: 306699b6d92SFrederic Weisbecker raw += "%s \n" % thread_name(t) 307699b6d92SFrederic Weisbecker 308699b6d92SFrederic Weisbecker self.root_win.update_summary(raw) 309699b6d92SFrederic Weisbecker 310699b6d92SFrederic Weisbecker def update_rectangle_cpu(self, slice, cpu): 311699b6d92SFrederic Weisbecker rq = slice.rqs[cpu] 312699b6d92SFrederic Weisbecker 313699b6d92SFrederic Weisbecker if slice.total_load != 0: 314699b6d92SFrederic Weisbecker load_rate = rq.load() / float(slice.total_load) 315699b6d92SFrederic Weisbecker else: 316699b6d92SFrederic Weisbecker load_rate = 0 317699b6d92SFrederic Weisbecker 318699b6d92SFrederic Weisbecker red_power = int(0xff - (0xff * load_rate)) 319699b6d92SFrederic Weisbecker color = (0xff, red_power, red_power) 320699b6d92SFrederic Weisbecker 321699b6d92SFrederic Weisbecker top_color = None 322699b6d92SFrederic Weisbecker 323699b6d92SFrederic Weisbecker if cpu in slice.event_cpus: 324699b6d92SFrederic Weisbecker top_color = rq.event.color() 325699b6d92SFrederic Weisbecker 326699b6d92SFrederic Weisbecker self.root_win.paint_rectangle_zone(cpu, color, top_color, slice.start, slice.end) 327699b6d92SFrederic Weisbecker 328699b6d92SFrederic Weisbecker def fill_zone(self, start, end): 329699b6d92SFrederic Weisbecker i = self.find_time_slice(start) 330699b6d92SFrederic Weisbecker if i == -1: 331699b6d92SFrederic Weisbecker return 332699b6d92SFrederic Weisbecker 333699b6d92SFrederic Weisbecker for i in xrange(i, len(self.data)): 334699b6d92SFrederic Weisbecker timeslice = self.data[i] 335699b6d92SFrederic Weisbecker if timeslice.start > end: 336699b6d92SFrederic Weisbecker return 337699b6d92SFrederic Weisbecker 338699b6d92SFrederic Weisbecker for cpu in timeslice.rqs: 339699b6d92SFrederic Weisbecker self.update_rectangle_cpu(timeslice, cpu) 340699b6d92SFrederic Weisbecker 341880d22f2SFrederic Weisbecker def interval(self): 342880d22f2SFrederic Weisbecker if len(self.data) == 0: 343880d22f2SFrederic Weisbecker return (0, 0) 344880d22f2SFrederic Weisbecker 345880d22f2SFrederic Weisbecker return (self.data[0].start, self.data[-1].end) 346880d22f2SFrederic Weisbecker 347699b6d92SFrederic Weisbecker def nr_rectangles(self): 34870d815a3SFrederic Weisbecker last_ts = self.data[-1] 34970d815a3SFrederic Weisbecker max_cpu = 0 35070d815a3SFrederic Weisbecker for cpu in last_ts.rqs: 35170d815a3SFrederic Weisbecker if cpu > max_cpu: 35270d815a3SFrederic Weisbecker max_cpu = cpu 35370d815a3SFrederic Weisbecker return max_cpu 35470d815a3SFrederic Weisbecker 355880d22f2SFrederic Weisbecker 356880d22f2SFrederic Weisbeckerclass SchedEventProxy: 357880d22f2SFrederic Weisbecker def __init__(self): 358880d22f2SFrederic Weisbecker self.current_tsk = defaultdict(lambda : -1) 359880d22f2SFrederic Weisbecker self.timeslices = TimeSliceList() 360880d22f2SFrederic Weisbecker 361880d22f2SFrederic Weisbecker def sched_switch(self, headers, prev_comm, prev_pid, prev_prio, prev_state, 362880d22f2SFrederic Weisbecker next_comm, next_pid, next_prio): 363880d22f2SFrederic Weisbecker """ Ensure the task we sched out this cpu is really the one 364880d22f2SFrederic Weisbecker we logged. Otherwise we may have missed traces """ 365880d22f2SFrederic Weisbecker 366880d22f2SFrederic Weisbecker on_cpu_task = self.current_tsk[headers.cpu] 367880d22f2SFrederic Weisbecker 368880d22f2SFrederic Weisbecker if on_cpu_task != -1 and on_cpu_task != prev_pid: 369880d22f2SFrederic Weisbecker print "Sched switch event rejected ts: %s cpu: %d prev: %s(%d) next: %s(%d)" % \ 370880d22f2SFrederic Weisbecker (headers.ts_format(), headers.cpu, prev_comm, prev_pid, next_comm, next_pid) 371880d22f2SFrederic Weisbecker 372880d22f2SFrederic Weisbecker threads[prev_pid] = prev_comm 373880d22f2SFrederic Weisbecker threads[next_pid] = next_comm 374880d22f2SFrederic Weisbecker self.current_tsk[headers.cpu] = next_pid 375880d22f2SFrederic Weisbecker 376880d22f2SFrederic Weisbecker ts = self.timeslices.get_time_slice(headers.ts()) 377880d22f2SFrederic Weisbecker ts.sched_switch(self.timeslices, prev_pid, prev_state, next_pid, headers.cpu) 378880d22f2SFrederic Weisbecker 379880d22f2SFrederic Weisbecker def migrate(self, headers, pid, prio, orig_cpu, dest_cpu): 380880d22f2SFrederic Weisbecker ts = self.timeslices.get_time_slice(headers.ts()) 381880d22f2SFrederic Weisbecker ts.migrate(self.timeslices, pid, orig_cpu, dest_cpu) 382880d22f2SFrederic Weisbecker 383880d22f2SFrederic Weisbecker def wake_up(self, headers, comm, pid, success, target_cpu, fork): 384880d22f2SFrederic Weisbecker if success == 0: 385880d22f2SFrederic Weisbecker return 386880d22f2SFrederic Weisbecker ts = self.timeslices.get_time_slice(headers.ts()) 387880d22f2SFrederic Weisbecker ts.wake_up(self.timeslices, pid, target_cpu, fork) 388880d22f2SFrederic Weisbecker 389880d22f2SFrederic Weisbecker 390880d22f2SFrederic Weisbeckerdef trace_begin(): 391880d22f2SFrederic Weisbecker global parser 392880d22f2SFrederic Weisbecker parser = SchedEventProxy() 393880d22f2SFrederic Weisbecker 394880d22f2SFrederic Weisbeckerdef trace_end(): 395880d22f2SFrederic Weisbecker app = wx.App(False) 396880d22f2SFrederic Weisbecker timeslices = parser.timeslices 397699b6d92SFrederic Weisbecker frame = RootFrame(timeslices, "Migration") 398880d22f2SFrederic Weisbecker app.MainLoop() 399880d22f2SFrederic Weisbecker 400880d22f2SFrederic Weisbeckerdef sched__sched_stat_runtime(event_name, context, common_cpu, 401880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 402880d22f2SFrederic Weisbecker comm, pid, runtime, vruntime): 403880d22f2SFrederic Weisbecker pass 404880d22f2SFrederic Weisbecker 405880d22f2SFrederic Weisbeckerdef sched__sched_stat_iowait(event_name, context, common_cpu, 406880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 407880d22f2SFrederic Weisbecker comm, pid, delay): 408880d22f2SFrederic Weisbecker pass 409880d22f2SFrederic Weisbecker 410880d22f2SFrederic Weisbeckerdef sched__sched_stat_sleep(event_name, context, common_cpu, 411880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 412880d22f2SFrederic Weisbecker comm, pid, delay): 413880d22f2SFrederic Weisbecker pass 414880d22f2SFrederic Weisbecker 415880d22f2SFrederic Weisbeckerdef sched__sched_stat_wait(event_name, context, common_cpu, 416880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 417880d22f2SFrederic Weisbecker comm, pid, delay): 418880d22f2SFrederic Weisbecker pass 419880d22f2SFrederic Weisbecker 420880d22f2SFrederic Weisbeckerdef sched__sched_process_fork(event_name, context, common_cpu, 421880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 422880d22f2SFrederic Weisbecker parent_comm, parent_pid, child_comm, child_pid): 423880d22f2SFrederic Weisbecker pass 424880d22f2SFrederic Weisbecker 425880d22f2SFrederic Weisbeckerdef sched__sched_process_wait(event_name, context, common_cpu, 426880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 427880d22f2SFrederic Weisbecker comm, pid, prio): 428880d22f2SFrederic Weisbecker pass 429880d22f2SFrederic Weisbecker 430880d22f2SFrederic Weisbeckerdef sched__sched_process_exit(event_name, context, common_cpu, 431880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 432880d22f2SFrederic Weisbecker comm, pid, prio): 433880d22f2SFrederic Weisbecker pass 434880d22f2SFrederic Weisbecker 435880d22f2SFrederic Weisbeckerdef sched__sched_process_free(event_name, context, common_cpu, 436880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 437880d22f2SFrederic Weisbecker comm, pid, prio): 438880d22f2SFrederic Weisbecker pass 439880d22f2SFrederic Weisbecker 440880d22f2SFrederic Weisbeckerdef sched__sched_migrate_task(event_name, context, common_cpu, 441880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 442880d22f2SFrederic Weisbecker comm, pid, prio, orig_cpu, 443880d22f2SFrederic Weisbecker dest_cpu): 444880d22f2SFrederic Weisbecker headers = EventHeaders(common_cpu, common_secs, common_nsecs, 445880d22f2SFrederic Weisbecker common_pid, common_comm) 446880d22f2SFrederic Weisbecker parser.migrate(headers, pid, prio, orig_cpu, dest_cpu) 447880d22f2SFrederic Weisbecker 448880d22f2SFrederic Weisbeckerdef sched__sched_switch(event_name, context, common_cpu, 449880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 450880d22f2SFrederic Weisbecker prev_comm, prev_pid, prev_prio, prev_state, 451880d22f2SFrederic Weisbecker next_comm, next_pid, next_prio): 452880d22f2SFrederic Weisbecker 453880d22f2SFrederic Weisbecker headers = EventHeaders(common_cpu, common_secs, common_nsecs, 454880d22f2SFrederic Weisbecker common_pid, common_comm) 455880d22f2SFrederic Weisbecker parser.sched_switch(headers, prev_comm, prev_pid, prev_prio, prev_state, 456880d22f2SFrederic Weisbecker next_comm, next_pid, next_prio) 457880d22f2SFrederic Weisbecker 458880d22f2SFrederic Weisbeckerdef sched__sched_wakeup_new(event_name, context, common_cpu, 459880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 460880d22f2SFrederic Weisbecker comm, pid, prio, success, 461880d22f2SFrederic Weisbecker target_cpu): 462880d22f2SFrederic Weisbecker headers = EventHeaders(common_cpu, common_secs, common_nsecs, 463880d22f2SFrederic Weisbecker common_pid, common_comm) 464880d22f2SFrederic Weisbecker parser.wake_up(headers, comm, pid, success, target_cpu, 1) 465880d22f2SFrederic Weisbecker 466880d22f2SFrederic Weisbeckerdef sched__sched_wakeup(event_name, context, common_cpu, 467880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 468880d22f2SFrederic Weisbecker comm, pid, prio, success, 469880d22f2SFrederic Weisbecker target_cpu): 470880d22f2SFrederic Weisbecker headers = EventHeaders(common_cpu, common_secs, common_nsecs, 471880d22f2SFrederic Weisbecker common_pid, common_comm) 472880d22f2SFrederic Weisbecker parser.wake_up(headers, comm, pid, success, target_cpu, 0) 473880d22f2SFrederic Weisbecker 474880d22f2SFrederic Weisbeckerdef sched__sched_wait_task(event_name, context, common_cpu, 475880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 476880d22f2SFrederic Weisbecker comm, pid, prio): 477880d22f2SFrederic Weisbecker pass 478880d22f2SFrederic Weisbecker 479880d22f2SFrederic Weisbeckerdef sched__sched_kthread_stop_ret(event_name, context, common_cpu, 480880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 481880d22f2SFrederic Weisbecker ret): 482880d22f2SFrederic Weisbecker pass 483880d22f2SFrederic Weisbecker 484880d22f2SFrederic Weisbeckerdef sched__sched_kthread_stop(event_name, context, common_cpu, 485880d22f2SFrederic Weisbecker common_secs, common_nsecs, common_pid, common_comm, 486880d22f2SFrederic Weisbecker comm, pid): 487880d22f2SFrederic Weisbecker pass 488880d22f2SFrederic Weisbecker 489880d22f2SFrederic Weisbeckerdef trace_unhandled(event_name, context, common_cpu, common_secs, common_nsecs, 490880d22f2SFrederic Weisbecker common_pid, common_comm): 491880d22f2SFrederic Weisbecker pass 492