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