diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-10-03 11:01:30 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-10-03 11:01:30 -0400 |
commit | 7e7bb31d1215300b6e60661a7ead02236ea1adda (patch) | |
tree | 403522bbea6a3ed758ca435f952cabd30c4ae771 /litmus/jobs.c | |
parent | 6e515de45f1ad108a8ae08d0be1b6f7bf2a707b6 (diff) |
Moved user-space state of tasks into new rt_param.user_job.
Both sched_color and sched_mc assumed seperate kernel and userspace views of job
states, where the kernel view is used for scheduling while the userspace view
is used for statistics (tardiness etc). This commit merges both approaches.
Diffstat (limited to 'litmus/jobs.c')
-rw-r--r-- | litmus/jobs.c | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/litmus/jobs.c b/litmus/jobs.c index bd3175baefae..983b084cf32b 100644 --- a/litmus/jobs.c +++ b/litmus/jobs.c | |||
@@ -1,4 +1,5 @@ | |||
1 | /* litmus/jobs.c - common job control code | 1 | /* litmus/jobs.c - common job control code |
2 | * TODO: modified heavily for sched_mc | ||
2 | */ | 3 | */ |
3 | 4 | ||
4 | #include <linux/sched.h> | 5 | #include <linux/sched.h> |
@@ -6,25 +7,23 @@ | |||
6 | #include <litmus/litmus.h> | 7 | #include <litmus/litmus.h> |
7 | #include <litmus/jobs.h> | 8 | #include <litmus/jobs.h> |
8 | #include <litmus/trace.h> | 9 | #include <litmus/trace.h> |
10 | #include <litmus/sched_trace.h> | ||
11 | #include <litmus/domain.h> | ||
12 | #include <litmus/sched_mc.h> | ||
9 | 13 | ||
10 | static inline void setup_release(struct task_struct *t, lt_t release) | 14 | static inline void setup_release(struct task_struct *t, struct rt_job *job, |
15 | lt_t release) | ||
11 | { | 16 | { |
12 | /* prepare next release */ | 17 | /* prepare next release */ |
13 | tsk_rt(t)->job_params.release = release; | 18 | job->release = release; |
14 | tsk_rt(t)->job_params.deadline = release + get_rt_relative_deadline(t); | 19 | job->deadline = release + get_rt_relative_deadline(t); |
15 | tsk_rt(t)->job_params.exec_time = 0; | 20 | job->exec_time = 0; |
16 | 21 | ||
17 | /* update job sequence number */ | 22 | /* update job sequence number */ |
18 | tsk_rt(t)->job_params.job_no++; | 23 | ++job->job_no; |
19 | |||
20 | /* don't confuse Linux */ | ||
21 | t->rt.time_slice = 1; | ||
22 | |||
23 | TRACE_TASK(t, "Releasing at %llu, deadline: %llu, period: %llu, now: %llu\n", | ||
24 | release, get_deadline(t), get_rt_period(t), litmus_clock()); | ||
25 | } | 24 | } |
26 | 25 | ||
27 | void prepare_for_next_period(struct task_struct *t) | 26 | static inline void setup_kernel_release(struct task_struct *t, lt_t release) |
28 | { | 27 | { |
29 | BUG_ON(!t); | 28 | BUG_ON(!t); |
30 | 29 | ||
@@ -32,21 +31,49 @@ void prepare_for_next_period(struct task_struct *t) | |||
32 | * release and deadline. Lateness may be negative. | 31 | * release and deadline. Lateness may be negative. |
33 | */ | 32 | */ |
34 | t->rt_param.job_params.lateness = | 33 | t->rt_param.job_params.lateness = |
35 | (long long)litmus_clock() - | 34 | (long long)litmus_clock() - |
36 | (long long)t->rt_param.job_params.deadline; | 35 | (long long)t->rt_param.job_params.deadline; |
37 | 36 | ||
38 | setup_release(t, get_release(t) + get_rt_period(t)); | 37 | t->rt.time_slice = 1; |
38 | |||
39 | setup_release(t, &tsk_rt(t)->job_params, release); | ||
40 | |||
41 | TRACE_MC_TASK(t, "kernel rel=%llu, dead=%llu\n", get_release(t), get_deadline(t)); | ||
42 | |||
43 | sched_trace_server_release(-t->pid, get_rt_job(t), | ||
44 | tsk_rt(t)->job_params); | ||
45 | } | ||
46 | |||
47 | void setup_user_release(struct task_struct *t, lt_t release) | ||
48 | { | ||
49 | setup_release(t, &tsk_rt(t)->user_job, release); | ||
50 | TRACE_MC_TASK(t, "user rel=%llu, dead=%llu\n", get_user_release(t), get_user_deadline(t)); | ||
51 | if (CRIT_LEVEL_A != tsk_mc_crit(t)) | ||
52 | sched_trace_task_release(t); | ||
53 | |||
54 | } | ||
55 | |||
56 | void prepare_for_next_period(struct task_struct *t) | ||
57 | { | ||
58 | setup_kernel_release(t, get_release(t) + get_rt_period(t)); | ||
39 | } | 59 | } |
40 | 60 | ||
41 | void release_at(struct task_struct *t, lt_t start) | 61 | void release_at(struct task_struct *t, lt_t start) |
42 | { | 62 | { |
43 | BUG_ON(!t); | 63 | BUG_ON(!t); |
44 | setup_release(t, start); | 64 | |
65 | TRACE_MC_TASK(t, "Releasing at %llu\n", start); | ||
66 | |||
67 | setup_kernel_release(t, start); | ||
68 | setup_user_release(t, start); | ||
69 | |||
70 | BUG_ON(!is_released(t, start)); | ||
71 | |||
45 | set_rt_flags(t, RT_F_RUNNING); | 72 | set_rt_flags(t, RT_F_RUNNING); |
46 | } | 73 | } |
47 | 74 | ||
48 | /* | 75 | /* |
49 | * Deactivate current task until the beginning of the next period. | 76 | * User-space job has completed execution |
50 | */ | 77 | */ |
51 | long complete_job(void) | 78 | long complete_job(void) |
52 | { | 79 | { |