aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2013-01-09 17:00:54 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2013-01-09 17:00:54 -0500
commit1235a665a5e00dc762e6646c01381b3ed5019d86 (patch)
tree3947c065b1407e3ee60a10926047b4db8a353314
parent642eadd6b82daaeeb3247c2417bf58d113639a1c (diff)
Enable sched_trace log injection from userspacewip-gpu-cleanup
-rw-r--r--include/litmus/rt_param.h22
-rw-r--r--include/litmus/unistd_32.h6
-rw-r--r--include/litmus/unistd_64.h5
-rw-r--r--litmus/litmus.c73
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. */
52typedef 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
66struct 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
314asmlinkage 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
381out:
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)
314void init_gpu_affinity_state(struct task_struct* p) 387void init_gpu_affinity_state(struct task_struct* p)
315{ 388{