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