aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2010-07-25 17:11:51 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2010-08-01 19:31:57 -0400
commit70d815a3decc57c482e5384a623a859e3371e680 (patch)
tree323f5afac77b7f101ac03deffb4e7b96616489e4 /tools/perf
parent0cddf56aa841713b37c10c5ab673d6164fce9833 (diff)
perf, sched migration: Make it vertically scrollable
With scheduler traces covering more than two cpus, rectangles of the CPUs 3 and more are not visibles. This makes the vertical navigation scrollable so that all of the CPUs rectangles are available. We also want to be able to zoom vertically, so that we can fit at best the screen with CPU rectangles, but that's for later. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Nikhil Rao <ncrao@google.com> Cc: Tom Zanussi <tzanussi@gmail.com>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/scripts/python/sched-migration.py29
1 files changed, 20 insertions, 9 deletions
diff --git a/tools/perf/scripts/python/sched-migration.py b/tools/perf/scripts/python/sched-migration.py
index d9026683027c..9d46377f793b 100644
--- a/tools/perf/scripts/python/sched-migration.py
+++ b/tools/perf/scripts/python/sched-migration.py
@@ -43,18 +43,20 @@ class RootFrame(wx.Frame):
43 self.timeslices = timeslices 43 self.timeslices = timeslices
44 (self.ts_start, self.ts_end) = timeslices.interval() 44 (self.ts_start, self.ts_end) = timeslices.interval()
45 self.update_width_virtual() 45 self.update_width_virtual()
46 self.nr_cpus = timeslices.max_cpu() + 1
47 self.height_virtual = RootFrame.Y_OFFSET + (self.nr_cpus * (RootFrame.CPU_HEIGHT + RootFrame.CPU_SPACE))
46 48
47 # whole window panel 49 # whole window panel
48 self.panel = wx.Panel(self, size=(self.screen_width, self.screen_height)) 50 self.panel = wx.Panel(self, size=(self.screen_width, self.screen_height))
49 51
50 # scrollable container 52 # scrollable container
51 self.scroll = wx.ScrolledWindow(self.panel) 53 self.scroll = wx.ScrolledWindow(self.panel)
52 self.scroll.SetScrollbars(self.scroll_scale, self.scroll_scale, self.width_virtual / self.scroll_scale, 100 / 10) 54 self.scroll.SetScrollbars(self.scroll_scale, self.scroll_scale, self.width_virtual / self.scroll_scale, self.height_virtual / self.scroll_scale)
53 self.scroll.EnableScrolling(True, True) 55 self.scroll.EnableScrolling(True, True)
54 self.scroll.SetFocus() 56 self.scroll.SetFocus()
55 57
56 # scrollable drawing area 58 # scrollable drawing area
57 self.scroll_panel = wx.Panel(self.scroll, size=(self.screen_width, self.screen_height / 2)) 59 self.scroll_panel = wx.Panel(self.scroll, size=(self.screen_width - 15, self.screen_height / 2))
58 self.scroll_panel.Bind(wx.EVT_PAINT, self.on_paint) 60 self.scroll_panel.Bind(wx.EVT_PAINT, self.on_paint)
59 self.scroll_panel.Bind(wx.EVT_KEY_DOWN, self.on_key_press) 61 self.scroll_panel.Bind(wx.EVT_KEY_DOWN, self.on_key_press)
60 self.scroll_panel.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down) 62 self.scroll_panel.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down)
@@ -65,9 +67,8 @@ class RootFrame(wx.Frame):
65 self.scroll.Fit() 67 self.scroll.Fit()
66 self.Fit() 68 self.Fit()
67 69
68 self.scroll_panel.SetDimensions(-1, -1, self.width_virtual, -1, wx.SIZE_USE_EXISTING) 70 self.scroll_panel.SetDimensions(-1, -1, self.width_virtual, self.height_virtual, wx.SIZE_USE_EXISTING)
69 71
70 self.max_cpu = -1
71 self.txt = None 72 self.txt = None
72 73
73 self.Show(True) 74 self.Show(True)
@@ -143,8 +144,6 @@ class RootFrame(wx.Frame):
143 144
144 for cpu in timeslice.rqs: 145 for cpu in timeslice.rqs:
145 self.update_rectangle_cpu(dc, timeslice, cpu, self.timeslices[0].start) 146 self.update_rectangle_cpu(dc, timeslice, cpu, self.timeslices[0].start)
146 if cpu > self.max_cpu:
147 self.max_cpu = cpu
148 147
149 def on_paint(self, event): 148 def on_paint(self, event):
150 color = wx.Colour(0xff, 0xff, 0xff) 149 color = wx.Colour(0xff, 0xff, 0xff)
@@ -163,7 +162,7 @@ class RootFrame(wx.Frame):
163 cpu = y / (RootFrame.CPU_HEIGHT + RootFrame.CPU_SPACE) 162 cpu = y / (RootFrame.CPU_HEIGHT + RootFrame.CPU_SPACE)
164 height = y % (RootFrame.CPU_HEIGHT + RootFrame.CPU_SPACE) 163 height = y % (RootFrame.CPU_HEIGHT + RootFrame.CPU_SPACE)
165 164
166 if cpu < 0 or cpu > self.max_cpu or height > RootFrame.CPU_HEIGHT: 165 if cpu < 0 or cpu > self.nr_cpus - 1 or height > RootFrame.CPU_HEIGHT:
167 return -1 166 return -1
168 167
169 return cpu 168 return cpu
@@ -206,7 +205,7 @@ class RootFrame(wx.Frame):
206 self.update_width_virtual() 205 self.update_width_virtual()
207 (xpos, ypos) = self.scroll.GetViewStart() 206 (xpos, ypos) = self.scroll.GetViewStart()
208 xpos = self.us_to_px(x) / self.scroll_scale 207 xpos = self.us_to_px(x) / self.scroll_scale
209 self.scroll.SetScrollbars(self.scroll_scale, self.scroll_scale, self.width_virtual / self.scroll_scale, 100 / 10, xpos, ypos) 208 self.scroll.SetScrollbars(self.scroll_scale, self.scroll_scale, self.width_virtual / self.scroll_scale, self.height_virtual / self.scroll_scale, xpos, ypos)
210 self.Refresh() 209 self.Refresh()
211 210
212 def zoom_in(self): 211 def zoom_in(self):
@@ -234,7 +233,11 @@ class RootFrame(wx.Frame):
234 if key == wx.WXK_RIGHT: 233 if key == wx.WXK_RIGHT:
235 self.scroll.Scroll(x + 1, y) 234 self.scroll.Scroll(x + 1, y)
236 elif key == wx.WXK_LEFT: 235 elif key == wx.WXK_LEFT:
237 self.scroll.Scroll(x -1, y) 236 self.scroll.Scroll(x - 1, y)
237 elif key == wx.WXK_DOWN:
238 self.scroll.Scroll(x, y + 1)
239 elif key == wx.WXK_UP:
240 self.scroll.Scroll(x, y - 1)
238 241
239 242
240threads = { 0 : "idle"} 243threads = { 0 : "idle"}
@@ -504,6 +507,14 @@ class TimeSliceList(UserList):
504 507
505 return (self.data[0].start, self.data[-1].end) 508 return (self.data[0].start, self.data[-1].end)
506 509
510 def max_cpu(self):
511 last_ts = self.data[-1]
512 max_cpu = 0
513 for cpu in last_ts.rqs:
514 if cpu > max_cpu:
515 max_cpu = cpu
516 return max_cpu
517
507 518
508class SchedEventProxy: 519class SchedEventProxy:
509 def __init__(self): 520 def __init__(self):