aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/config.example.py5
-rw-r--r--experiment/litmus_util.py3
-rwxr-xr-xrun_exps.py21
3 files changed, 24 insertions, 5 deletions
diff --git a/config/config.example.py b/config/config.example.py
index 9675f66..785977b 100644
--- a/config/config.example.py
+++ b/config/config.example.py
@@ -36,8 +36,9 @@ FILES = {'ft_data' : 'ft.bin',
36 'sched_data' : 'st-{}.bin', 36 'sched_data' : 'st-{}.bin',
37 'log_data' : 'trace.slog',} 37 'log_data' : 'trace.slog',}
38 38
39PARAMS = {'sched' : 'scheduler', 39PARAMS = {'sched' : 'scheduler',
40 'dur' : 'duration'} 40 'dur' : 'duration',
41 'kernel' : 'uname'}
41 42
42SCHED_EVENTS = range(501, 513) 43SCHED_EVENTS = range(501, 513)
43BASE_EVENTS = ['SCHED', 'RELEASE', 'SCHED2', 'TICK', 'CXS'] 44BASE_EVENTS = ['SCHED', 'RELEASE', 'SCHED2', 'TICK', 'CXS']
diff --git a/experiment/litmus_util.py b/experiment/litmus_util.py
index 114f4c9..cde0bca 100644
--- a/experiment/litmus_util.py
+++ b/experiment/litmus_util.py
@@ -39,6 +39,9 @@ def switch_scheduler(switch_to_in):
39 if switch_to != cur_plugin: 39 if switch_to != cur_plugin:
40 raise Exception("Could not switch to plugin: %s" % switch_to) 40 raise Exception("Could not switch to plugin: %s" % switch_to)
41 41
42def uname_matches(reg):
43 data = subprocess.check_output(["uname", "-r"])
44 return bool( re.match(reg, data) )
42 45
43def is_executable(fname): 46def is_executable(fname):
44 """Return whether the file passed in is executable""" 47 """Return whether the file passed in is executable"""
diff --git a/run_exps.py b/run_exps.py
index d2606f8..bda0e40 100755
--- a/run_exps.py
+++ b/run_exps.py
@@ -13,6 +13,9 @@ from experiment.executable.executable import Executable
13from experiment.experiment import Experiment,ExperimentDone 13from experiment.experiment import Experiment,ExperimentDone
14from experiment.proc_entry import ProcEntry 14from experiment.proc_entry import ProcEntry
15 15
16def InvalidKernel(Exception):
17 def __init__(self, kernel):
18 self.kernel = kernel
16 19
17def parse_args(): 20def parse_args():
18 parser = OptionParser("usage: %prog [options] [sched_file]... [exp_dir]...]") 21 parser = OptionParser("usage: %prog [options] [sched_file]... [exp_dir]...]")
@@ -83,6 +86,7 @@ def load_experiment(sched_file, scheduler, duration, param_file, out_base):
83 dirname = os.path.split(sched_file)[0] 86 dirname = os.path.split(sched_file)[0]
84 87
85 params = {} 88 params = {}
89 kernel = ""
86 90
87 if not scheduler or not duration: 91 if not scheduler or not duration:
88 param_file = param_file or \ 92 param_file = param_file or \
@@ -93,6 +97,10 @@ def load_experiment(sched_file, scheduler, duration, param_file, out_base):
93 scheduler = scheduler or params[conf.PARAMS['sched']] 97 scheduler = scheduler or params[conf.PARAMS['sched']]
94 duration = duration or params[conf.PARAMS['dur']] 98 duration = duration or params[conf.PARAMS['dur']]
95 99
100 # Experiments can specify required kernel name
101 if conf.PARAMS['kernel'] in params:
102 kernel = params[conf.PARAMS['kernel']]
103
96 duration = duration or conf.DEFAULTS['duration'] 104 duration = duration or conf.DEFAULTS['duration']
97 105
98 if not scheduler: 106 if not scheduler:
@@ -102,7 +110,7 @@ def load_experiment(sched_file, scheduler, duration, param_file, out_base):
102 schedule = load_schedule(sched_file) 110 schedule = load_schedule(sched_file)
103 (work_dir, out_dir) = get_dirs(sched_file, out_base) 111 (work_dir, out_dir) = get_dirs(sched_file, out_base)
104 112
105 run_exp(sched_file, schedule, scheduler, duration, work_dir, out_dir) 113 run_exp(sched_file, schedule, scheduler, kernel, duration, work_dir, out_dir)
106 114
107 # Save parameters used to run experiment in out_dir 115 # Save parameters used to run experiment in out_dir
108 out_params = dict(params.items() + 116 out_params = dict(params.items() +
@@ -121,10 +129,13 @@ def load_schedule(fname):
121 return schedule 129 return schedule
122 130
123 131
124def run_exp(name, schedule, scheduler, duration, work_dir, out_dir): 132def run_exp(name, schedule, scheduler, kernel, duration, work_dir, out_dir):
125 proc_entries = [] 133 proc_entries = []
126 executables = [] 134 executables = []
127 135
136 if kernel and not lu.uname_matches(kernel):
137 raise InvalidKernel(kernel)
138
128 # Parse values for proc entries 139 # Parse values for proc entries
129 for entry_conf in schedule['proc']: 140 for entry_conf in schedule['proc']:
130 path = entry_conf[0] 141 path = entry_conf[0]
@@ -178,6 +189,7 @@ def main():
178 done = 0 189 done = 0
179 succ = 0 190 succ = 0
180 failed = 0 191 failed = 0
192 invalid = 0
181 193
182 for exp in args: 194 for exp in args:
183 path = "%s/%s" % (os.getcwd(), exp) 195 path = "%s/%s" % (os.getcwd(), exp)
@@ -194,6 +206,8 @@ def main():
194 except ExperimentDone: 206 except ExperimentDone:
195 done += 1 207 done += 1
196 print("Experiment '%s' already completed at '%s'" % (exp, out_base)) 208 print("Experiment '%s' already completed at '%s'" % (exp, out_base))
209 except InvalidKernel:
210 invalid += 1
197 except: 211 except:
198 print("Failed experiment %s" % exp) 212 print("Failed experiment %s" % exp)
199 traceback.print_exc() 213 traceback.print_exc()
@@ -203,7 +217,8 @@ def main():
203 print("Experiments run:\t%d" % len(args)) 217 print("Experiments run:\t%d" % len(args))
204 print(" Successful:\t\t%d" % succ) 218 print(" Successful:\t\t%d" % succ)
205 print(" Failed:\t\t%d" % failed) 219 print(" Failed:\t\t%d" % failed)
206 print(" Skipped:\t\t%d" % done) 220 print(" Already Done:\t\t%d" % done)
221 print(" Invalid Kernel:\t\t%d" % invalid)
207 222
208 223
209if __name__ == '__main__': 224if __name__ == '__main__':