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