diff options
Diffstat (limited to 'run/tracer.py')
-rw-r--r-- | run/tracer.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/run/tracer.py b/run/tracer.py new file mode 100644 index 0000000..5d00e86 --- /dev/null +++ b/run/tracer.py | |||
@@ -0,0 +1,112 @@ | |||
1 | import litmus_util | ||
2 | import os | ||
3 | import config.config as conf | ||
4 | |||
5 | from operator import methodcaller | ||
6 | from executable.ftcat import FTcat,Executable | ||
7 | |||
8 | |||
9 | class Tracer(object): | ||
10 | def __init__(self, name, output_dir): | ||
11 | self.name = name | ||
12 | self.output_dir = output_dir | ||
13 | self.bins = [] | ||
14 | |||
15 | def start_tracing(self): | ||
16 | map(methodcaller("execute"), self.bins) | ||
17 | |||
18 | def stop_tracing(self): | ||
19 | map(methodcaller('terminate'), self.bins) | ||
20 | map(methodcaller('wait'), self.bins) | ||
21 | |||
22 | |||
23 | class LinuxTracer(Tracer): | ||
24 | EVENT_ROOT = "/sys/kernel/debug/tracing" | ||
25 | LITMUS_EVENTS = "%s/events/litmus" % EVENT_ROOT | ||
26 | |||
27 | def __init__(self, output_dir): | ||
28 | super(LinuxTracer, self).__init__("trace-cmd", output_dir) | ||
29 | |||
30 | extra_args = ["record", # "-e", "sched:sched_switch", | ||
31 | "-e", "litmus:*", | ||
32 | "-o", "%s/%s" % (output_dir, conf.FILES['linux_data'])] | ||
33 | stdout = open('%s/trace-cmd-stdout.txt' % self.output_dir, 'w') | ||
34 | stderr = open('%s/trace-cmd-stderr.txt' % self.output_dir, 'w') | ||
35 | |||
36 | execute = Executable(conf.BINS['trace-cmd'], extra_args, stdout, stderr) | ||
37 | execute.cwd = output_dir | ||
38 | self.bins.append(execute) | ||
39 | |||
40 | @staticmethod | ||
41 | def enabled(): | ||
42 | return os.path.exists(LinuxTracer.LITMUS_EVENTS) | ||
43 | |||
44 | def stop_tracing(self): | ||
45 | map(methodcaller('interrupt'), self.bins) | ||
46 | map(methodcaller('wait'), self.bins) | ||
47 | |||
48 | |||
49 | class LogTracer(Tracer): | ||
50 | DEVICE_STR = '/dev/litmus/log' | ||
51 | |||
52 | def __init__(self, output_dir): | ||
53 | super(LogTracer, self).__init__("Logger", output_dir) | ||
54 | |||
55 | out_file = open("%s/%s" % (self.output_dir, conf.FILES['log_data']), 'w') | ||
56 | |||
57 | cat = (Executable("/bin/cat", [LogTracer.DEVICE_STR])) | ||
58 | cat.stdout_file = out_file | ||
59 | |||
60 | self.bins.append(cat) | ||
61 | |||
62 | @staticmethod | ||
63 | def enabled(): | ||
64 | return litmus_util.is_device(LogTracer.DEVICE_STR) | ||
65 | |||
66 | |||
67 | class SchedTracer(Tracer): | ||
68 | DEVICE_STR = '/dev/litmus/sched_trace' | ||
69 | |||
70 | def __init__(self, output_dir): | ||
71 | super(SchedTracer, self).__init__("Sched Trace", output_dir) | ||
72 | |||
73 | if SchedTracer.enabled(): | ||
74 | for cpu in range(litmus_util.num_cpus()): | ||
75 | # Executable will close the stdout/stderr files | ||
76 | stdout_f = open('%s/st-%d.bin' % (self.output_dir, cpu), 'w') | ||
77 | stderr_f = open('%s/st-%d-stderr.txt' % (self.output_dir, cpu), 'w') | ||
78 | dev = '{0}{1}'.format(SchedTracer.DEVICE_STR, cpu) | ||
79 | ftc = FTcat(conf.BINS['ftcat'], stdout_f, stderr_f, dev, conf.SCHED_EVENTS, cpu=cpu) | ||
80 | |||
81 | self.bins.append(ftc) | ||
82 | |||
83 | @staticmethod | ||
84 | def enabled(): | ||
85 | return litmus_util.is_device("%s%d" % (SchedTracer.DEVICE_STR, 0)) | ||
86 | |||
87 | |||
88 | class OverheadTracer(Tracer): | ||
89 | DEVICE_STR = '/dev/litmus/ft_trace0' | ||
90 | |||
91 | def __init__(self, output_dir): | ||
92 | super(OverheadTracer, self).__init__("Overhead Trace", output_dir) | ||
93 | |||
94 | stdout_f = open('{0}/{1}'.format(self.output_dir, conf.FILES['ft_data']), 'w') | ||
95 | stderr_f = open('{0}/{1}.stderr.txt'.format(self.output_dir, conf.FILES['ft_data']), 'w') | ||
96 | ftc = FTcat(conf.BINS['ftcat'], stdout_f, stderr_f, | ||
97 | OverheadTracer.DEVICE_STR, conf.OVH_ALL_EVENTS) | ||
98 | |||
99 | self.bins.append(ftc) | ||
100 | |||
101 | @staticmethod | ||
102 | def enabled(): | ||
103 | return litmus_util.is_device(OverheadTracer.DEVICE_STR) | ||
104 | |||
105 | |||
106 | class PerfTracer(Tracer): | ||
107 | def __init__(self, output_dir): | ||
108 | super(PerfTracer, self).__init__("CPU perf counters", output_dir) | ||
109 | |||
110 | @staticmethod | ||
111 | def enabled(): | ||
112 | return False | ||