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 | { |
