aboutsummaryrefslogtreecommitdiffstats
path: root/experiment/tracer.py
blob: 4949927b2f97018878970b90a731aa2658183a7d (plain) (blame)
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