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