diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2013-01-09 17:00:54 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2013-01-09 17:00:54 -0500 |
commit | 1235a665a5e00dc762e6646c01381b3ed5019d86 (patch) | |
tree | 3947c065b1407e3ee60a10926047b4db8a353314 | |
parent | 642eadd6b82daaeeb3247c2417bf58d113639a1c (diff) |
Enable sched_trace log injection from userspacewip-gpu-cleanup
-rw-r--r-- | include/litmus/rt_param.h | 22 | ||||
-rw-r--r-- | include/litmus/unistd_32.h | 6 | ||||
-rw-r--r-- | include/litmus/unistd_64.h | 5 | ||||
-rw-r--r-- | litmus/litmus.c | 73 |
4 files changed, 103 insertions, 3 deletions
diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h index c8ee64569dbb..43daaf84101d 100644 --- a/include/litmus/rt_param.h +++ b/include/litmus/rt_param.h | |||
@@ -47,6 +47,28 @@ typedef enum { | |||
47 | AUX_FUTURE = (AUX_CURRENT<<2) | 47 | AUX_FUTURE = (AUX_CURRENT<<2) |
48 | } aux_flags_t; | 48 | } aux_flags_t; |
49 | 49 | ||
50 | /* mirror of st_event_record_type_t | ||
51 | * Assume all are UNsupported, unless otherwise stated. */ | ||
52 | typedef enum { | ||
53 | ST_INJECT_NAME = 1, /* supported */ | ||
54 | ST_INJECT_PARAM, /* supported */ | ||
55 | ST_INJECT_RELEASE, /* supported */ | ||
56 | ST_INJECT_ASSIGNED, | ||
57 | ST_INJECT_SWITCH_TO, | ||
58 | ST_INJECT_SWITCH_AWAY, | ||
59 | ST_INJECT_COMPLETION, /* supported */ | ||
60 | ST_INJECT_BLOCK, | ||
61 | ST_INJECT_RESUME, | ||
62 | ST_INJECT_ACTION, | ||
63 | ST_INJECT_SYS_RELEASE, /* supported */ | ||
64 | } sched_trace_injection_events_t; | ||
65 | |||
66 | struct st_inject_args { | ||
67 | lt_t release; | ||
68 | lt_t deadline; | ||
69 | unsigned int job_no; | ||
70 | }; | ||
71 | |||
50 | /* We use the common priority interpretation "lower index == higher priority", | 72 | /* We use the common priority interpretation "lower index == higher priority", |
51 | * which is commonly used in fixed-priority schedulability analysis papers. | 73 | * which is commonly used in fixed-priority schedulability analysis papers. |
52 | * So, a numerically lower priority value implies higher scheduling priority, | 74 | * So, a numerically lower priority value implies higher scheduling priority, |
diff --git a/include/litmus/unistd_32.h b/include/litmus/unistd_32.h index 7265ffadf555..d1fe84a5d574 100644 --- a/include/litmus/unistd_32.h +++ b/include/litmus/unistd_32.h | |||
@@ -20,6 +20,8 @@ | |||
20 | #define __NR_litmus_dgl_lock __LSC(12) | 20 | #define __NR_litmus_dgl_lock __LSC(12) |
21 | #define __NR_litmus_dgl_unlock __LSC(13) | 21 | #define __NR_litmus_dgl_unlock __LSC(13) |
22 | 22 | ||
23 | #define __NR_set_aux_tasks _LSC(14) | 23 | #define __NR_set_aux_tasks __LSC(14) |
24 | 24 | ||
25 | #define NR_litmus_syscalls 15 | 25 | #define __NR_sched_trace_event __LSC(15) |
26 | |||
27 | #define NR_litmus_syscalls 16 | ||
diff --git a/include/litmus/unistd_64.h b/include/litmus/unistd_64.h index 51e730124dde..75f9fcb897f5 100644 --- a/include/litmus/unistd_64.h +++ b/include/litmus/unistd_64.h | |||
@@ -37,4 +37,7 @@ __SYSCALL(__NR_litmus_dgl_unlock, sys_litmus_dgl_unlock) | |||
37 | #define __NR_set_aux_tasks __LSC(14) | 37 | #define __NR_set_aux_tasks __LSC(14) |
38 | __SYSCALL(__NR_set_aux_tasks, sys_set_aux_tasks) | 38 | __SYSCALL(__NR_set_aux_tasks, sys_set_aux_tasks) |
39 | 39 | ||
40 | #define NR_litmus_syscalls 15 | 40 | #define __NR_sched_trace_event __LSC(15) |
41 | __SYSCALL(__NR_sched_trace_event, sys_sched_trace_event) | ||
42 | |||
43 | #define NR_litmus_syscalls 16 | ||
diff --git a/litmus/litmus.c b/litmus/litmus.c index 1b4b9d25dbdc..6a1095aa7725 100644 --- a/litmus/litmus.c +++ b/litmus/litmus.c | |||
@@ -310,6 +310,79 @@ asmlinkage long sys_null_call(cycles_t __user *ts) | |||
310 | return ret; | 310 | return ret; |
311 | } | 311 | } |
312 | 312 | ||
313 | |||
314 | asmlinkage long sys_sched_trace_event(int event, struct st_inject_args __user *__args) | ||
315 | { | ||
316 | long retval = 0; | ||
317 | struct task_struct* t = current; | ||
318 | |||
319 | struct st_inject_args args; | ||
320 | |||
321 | if (is_realtime(t)) { | ||
322 | printk(KERN_WARNING "Only non-real-time tasks may inject sched_trace events.\n"); | ||
323 | retval = -EINVAL; | ||
324 | goto out; | ||
325 | } | ||
326 | |||
327 | if (__args && copy_from_user(&args, __args, sizeof(args))) { | ||
328 | retval = -EFAULT; | ||
329 | goto out; | ||
330 | } | ||
331 | |||
332 | switch(event) { | ||
333 | /*************************************/ | ||
334 | /* events that don't need parameters */ | ||
335 | /*************************************/ | ||
336 | case ST_INJECT_NAME: | ||
337 | sched_trace_task_name(t); | ||
338 | break; | ||
339 | case ST_INJECT_PARAM: | ||
340 | /* presumes sporadic_task_ns() has already been called | ||
341 | * and valid data has been initialized even if the calling | ||
342 | * task is SCHED_NORMAL. */ | ||
343 | sched_trace_task_param(t); | ||
344 | break; | ||
345 | |||
346 | /*******************************/ | ||
347 | /* events that need parameters */ | ||
348 | /*******************************/ | ||
349 | case ST_INJECT_COMPLETION: | ||
350 | if (!__args) { | ||
351 | retval = -EINVAL; | ||
352 | goto out; | ||
353 | } | ||
354 | |||
355 | /* slam in the data */ | ||
356 | t->rt_param.job_params.job_no = args.job_no; | ||
357 | |||
358 | sched_trace_task_completion(t, 0); | ||
359 | break; | ||
360 | case ST_INJECT_RELEASE: | ||
361 | if (!__args) { | ||
362 | retval = -EINVAL; | ||
363 | goto out; | ||
364 | } | ||
365 | |||
366 | /* slam in the data */ | ||
367 | tsk_rt(t)->job_params.release = args.release; | ||
368 | tsk_rt(t)->job_params.deadline = args.deadline; | ||
369 | |||
370 | sched_trace_task_release(t); | ||
371 | break; | ||
372 | |||
373 | /**********************/ | ||
374 | /* unsupported events */ | ||
375 | /**********************/ | ||
376 | default: | ||
377 | retval = -EINVAL; | ||
378 | break; | ||
379 | } | ||
380 | |||
381 | out: | ||
382 | return retval; | ||
383 | } | ||
384 | |||
385 | |||
313 | #if defined(CONFIG_LITMUS_NVIDIA) && defined(CONFIG_LITMUS_AFFINITY_LOCKING) | 386 | #if defined(CONFIG_LITMUS_NVIDIA) && defined(CONFIG_LITMUS_AFFINITY_LOCKING) |
314 | void init_gpu_affinity_state(struct task_struct* p) | 387 | void init_gpu_affinity_state(struct task_struct* p) |
315 | { | 388 | { |