diff options
author | Manohar Vanga <mvanga@mpi-sws.org> | 2012-10-03 18:30:51 -0400 |
---|---|---|
committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2012-11-27 13:50:17 -0500 |
commit | b7012aa7edba4b88906fc39b9005ff4dae69be59 (patch) | |
tree | 5176a5e920adcb4158d67778b2cdecb1e3cdc4c0 | |
parent | e99428ce6786f76b64cfea5da814a7a5cd939de3 (diff) |
litmus: get rid of RT_F_SLEEP and RT_F_RUNNING
This patch removes the flags RT_F_SLEEP and RT_F_RUNNING
as their name is misleading. This patch replaces them with
a 'completed' field in struct rt_param.
Signed-off-by: Manohar Vanga <mvanga@mpi-sws.org>
-rw-r--r-- | include/litmus/litmus.h | 5 | ||||
-rw-r--r-- | include/litmus/rt_param.h | 5 | ||||
-rw-r--r-- | litmus/jobs.c | 4 | ||||
-rw-r--r-- | litmus/sched_cedf.c | 12 | ||||
-rw-r--r-- | litmus/sched_gsn_edf.c | 14 | ||||
-rw-r--r-- | litmus/sched_pfair.c | 8 | ||||
-rw-r--r-- | litmus/sched_pfp.c | 8 | ||||
-rw-r--r-- | litmus/sched_psn_edf.c | 8 |
8 files changed, 35 insertions, 29 deletions
diff --git a/include/litmus/litmus.h b/include/litmus/litmus.h index 1cb3eaf25740..12770e08990b 100644 --- a/include/litmus/litmus.h +++ b/include/litmus/litmus.h | |||
@@ -232,6 +232,11 @@ static inline int is_present(struct task_struct* t) | |||
232 | return t && tsk_rt(t)->present; | 232 | return t && tsk_rt(t)->present; |
233 | } | 233 | } |
234 | 234 | ||
235 | static inline int is_completed(struct task_struct* t) | ||
236 | { | ||
237 | return t && tsk_rt(t)->completed; | ||
238 | } | ||
239 | |||
235 | 240 | ||
236 | /* make the unit explicit */ | 241 | /* make the unit explicit */ |
237 | typedef unsigned long quanta_t; | 242 | typedef unsigned long quanta_t; |
diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h index 8d9aa07cf324..5539b26588e6 100644 --- a/include/litmus/rt_param.h +++ b/include/litmus/rt_param.h | |||
@@ -160,6 +160,9 @@ struct rt_param { | |||
160 | /* is the task present? (true if it can be scheduled) */ | 160 | /* is the task present? (true if it can be scheduled) */ |
161 | unsigned int present:1; | 161 | unsigned int present:1; |
162 | 162 | ||
163 | /* has the task completed? */ | ||
164 | unsigned int completed:1; | ||
165 | |||
163 | #ifdef CONFIG_LITMUS_LOCKING | 166 | #ifdef CONFIG_LITMUS_LOCKING |
164 | /* Is the task being priority-boosted by a locking protocol? */ | 167 | /* Is the task being priority-boosted by a locking protocol? */ |
165 | unsigned int priority_boosted:1; | 168 | unsigned int priority_boosted:1; |
@@ -246,8 +249,6 @@ struct rt_param { | |||
246 | }; | 249 | }; |
247 | 250 | ||
248 | /* Possible RT flags */ | 251 | /* Possible RT flags */ |
249 | #define RT_F_RUNNING 0x00000000 | ||
250 | #define RT_F_SLEEP 0x00000001 | ||
251 | #define RT_F_EXIT_SEM 0x00000008 | 252 | #define RT_F_EXIT_SEM 0x00000008 |
252 | 253 | ||
253 | #endif | 254 | #endif |
diff --git a/litmus/jobs.c b/litmus/jobs.c index fb093c03d53d..13a4ed4c9e93 100644 --- a/litmus/jobs.c +++ b/litmus/jobs.c | |||
@@ -38,7 +38,7 @@ void release_at(struct task_struct *t, lt_t start) | |||
38 | { | 38 | { |
39 | BUG_ON(!t); | 39 | BUG_ON(!t); |
40 | setup_release(t, start); | 40 | setup_release(t, start); |
41 | set_rt_flags(t, RT_F_RUNNING); | 41 | tsk_rt(t)->completed = 0; |
42 | } | 42 | } |
43 | 43 | ||
44 | 44 | ||
@@ -48,7 +48,7 @@ void release_at(struct task_struct *t, lt_t start) | |||
48 | long complete_job(void) | 48 | long complete_job(void) |
49 | { | 49 | { |
50 | /* Mark that we do not excute anymore */ | 50 | /* Mark that we do not excute anymore */ |
51 | set_rt_flags(current, RT_F_SLEEP); | 51 | tsk_rt(current)->completed = 1; |
52 | /* call schedule, this will return when a new job arrives | 52 | /* call schedule, this will return when a new job arrives |
53 | * it also takes care of preparing for the next release | 53 | * it also takes care of preparing for the next release |
54 | */ | 54 | */ |
diff --git a/litmus/sched_cedf.c b/litmus/sched_cedf.c index b0c16e34d2c5..62d28d2bf1c8 100644 --- a/litmus/sched_cedf.c +++ b/litmus/sched_cedf.c | |||
@@ -171,7 +171,7 @@ static noinline void link_task_to_cpu(struct task_struct* linked, | |||
171 | 171 | ||
172 | /* Link new task to CPU. */ | 172 | /* Link new task to CPU. */ |
173 | if (linked) { | 173 | if (linked) { |
174 | set_rt_flags(linked, RT_F_RUNNING); | 174 | tsk_rt(linked)->completed = 0; |
175 | /* handle task is already scheduled somewhere! */ | 175 | /* handle task is already scheduled somewhere! */ |
176 | on_cpu = linked->rt_param.scheduled_on; | 176 | on_cpu = linked->rt_param.scheduled_on; |
177 | if (on_cpu != NO_CPU) { | 177 | if (on_cpu != NO_CPU) { |
@@ -350,7 +350,7 @@ static noinline void job_completion(struct task_struct *t, int forced) | |||
350 | TRACE_TASK(t, "job_completion().\n"); | 350 | TRACE_TASK(t, "job_completion().\n"); |
351 | 351 | ||
352 | /* set flags */ | 352 | /* set flags */ |
353 | set_rt_flags(t, RT_F_SLEEP); | 353 | tsk_rt(t)->completed = 1; |
354 | /* prepare for next period */ | 354 | /* prepare for next period */ |
355 | prepare_for_next_period(t); | 355 | prepare_for_next_period(t); |
356 | if (is_released(t, litmus_clock())) | 356 | if (is_released(t, litmus_clock())) |
@@ -404,7 +404,7 @@ static void cedf_tick(struct task_struct* t) | |||
404 | * | 404 | * |
405 | * - !is_running(scheduled) // the job blocks | 405 | * - !is_running(scheduled) // the job blocks |
406 | * - scheduled->timeslice == 0 // the job completed (forcefully) | 406 | * - scheduled->timeslice == 0 // the job completed (forcefully) |
407 | * - get_rt_flag() == RT_F_SLEEP // the job completed (by syscall) | 407 | * - is_completed() // the job completed (by syscall) |
408 | * - linked != scheduled // we need to reschedule (for any reason) | 408 | * - linked != scheduled // we need to reschedule (for any reason) |
409 | * - is_np(scheduled) // rescheduling must be delayed, | 409 | * - is_np(scheduled) // rescheduling must be delayed, |
410 | * sys_exit_np must be requested | 410 | * sys_exit_np must be requested |
@@ -443,7 +443,7 @@ static struct task_struct* cedf_schedule(struct task_struct * prev) | |||
443 | budget_enforced(entry->scheduled) && | 443 | budget_enforced(entry->scheduled) && |
444 | budget_exhausted(entry->scheduled); | 444 | budget_exhausted(entry->scheduled); |
445 | np = exists && is_np(entry->scheduled); | 445 | np = exists && is_np(entry->scheduled); |
446 | sleep = exists && get_rt_flags(entry->scheduled) == RT_F_SLEEP; | 446 | sleep = exists && is_completed(entry->scheduled); |
447 | preempt = entry->scheduled != entry->linked; | 447 | preempt = entry->scheduled != entry->linked; |
448 | 448 | ||
449 | #ifdef WANT_ALL_SCHED_EVENTS | 449 | #ifdef WANT_ALL_SCHED_EVENTS |
@@ -600,7 +600,7 @@ static void cedf_task_wake_up(struct task_struct *task) | |||
600 | * a semaphore, it should never be treated as a new job release. | 600 | * a semaphore, it should never be treated as a new job release. |
601 | */ | 601 | */ |
602 | if (get_rt_flags(task) == RT_F_EXIT_SEM) { | 602 | if (get_rt_flags(task) == RT_F_EXIT_SEM) { |
603 | set_rt_flags(task, RT_F_RUNNING); | 603 | tsk_rt(task)->completed = 0; |
604 | } else { | 604 | } else { |
605 | now = litmus_clock(); | 605 | now = litmus_clock(); |
606 | if (is_tardy(task, now)) { | 606 | if (is_tardy(task, now)) { |
@@ -612,7 +612,7 @@ static void cedf_task_wake_up(struct task_struct *task) | |||
612 | if (task->rt.time_slice) { | 612 | if (task->rt.time_slice) { |
613 | /* came back in time before deadline | 613 | /* came back in time before deadline |
614 | */ | 614 | */ |
615 | set_rt_flags(task, RT_F_RUNNING); | 615 | tsk_rt(task)->completed = 0; |
616 | } | 616 | } |
617 | } | 617 | } |
618 | } | 618 | } |
diff --git a/litmus/sched_gsn_edf.c b/litmus/sched_gsn_edf.c index c3344b9d288f..990e4e1f86a9 100644 --- a/litmus/sched_gsn_edf.c +++ b/litmus/sched_gsn_edf.c | |||
@@ -44,7 +44,7 @@ | |||
44 | * (thereby removing its association with this | 44 | * (thereby removing its association with this |
45 | * CPU). However, it will not requeue the | 45 | * CPU). However, it will not requeue the |
46 | * previously linked task (if any). It will set | 46 | * previously linked task (if any). It will set |
47 | * T's state to RT_F_RUNNING and check whether | 47 | * T's state to not completed and check whether |
48 | * it is already running somewhere else. If T | 48 | * it is already running somewhere else. If T |
49 | * is scheduled somewhere else it will link | 49 | * is scheduled somewhere else it will link |
50 | * it to that CPU instead (and pull the linked | 50 | * it to that CPU instead (and pull the linked |
@@ -173,7 +173,7 @@ static noinline void link_task_to_cpu(struct task_struct* linked, | |||
173 | 173 | ||
174 | /* Link new task to CPU. */ | 174 | /* Link new task to CPU. */ |
175 | if (linked) { | 175 | if (linked) { |
176 | set_rt_flags(linked, RT_F_RUNNING); | 176 | tsk_rt(linked)->completed = 0; |
177 | /* handle task is already scheduled somewhere! */ | 177 | /* handle task is already scheduled somewhere! */ |
178 | on_cpu = linked->rt_param.scheduled_on; | 178 | on_cpu = linked->rt_param.scheduled_on; |
179 | if (on_cpu != NO_CPU) { | 179 | if (on_cpu != NO_CPU) { |
@@ -341,7 +341,7 @@ static noinline void job_completion(struct task_struct *t, int forced) | |||
341 | TRACE_TASK(t, "job_completion().\n"); | 341 | TRACE_TASK(t, "job_completion().\n"); |
342 | 342 | ||
343 | /* set flags */ | 343 | /* set flags */ |
344 | set_rt_flags(t, RT_F_SLEEP); | 344 | tsk_rt(t)->completed = 1; |
345 | /* prepare for next period */ | 345 | /* prepare for next period */ |
346 | prepare_for_next_period(t); | 346 | prepare_for_next_period(t); |
347 | if (is_released(t, litmus_clock())) | 347 | if (is_released(t, litmus_clock())) |
@@ -394,7 +394,7 @@ static void gsnedf_tick(struct task_struct* t) | |||
394 | * | 394 | * |
395 | * - !is_running(scheduled) // the job blocks | 395 | * - !is_running(scheduled) // the job blocks |
396 | * - scheduled->timeslice == 0 // the job completed (forcefully) | 396 | * - scheduled->timeslice == 0 // the job completed (forcefully) |
397 | * - get_rt_flag() == RT_F_SLEEP // the job completed (by syscall) | 397 | * - is_completed() // the job completed (by syscall) |
398 | * - linked != scheduled // we need to reschedule (for any reason) | 398 | * - linked != scheduled // we need to reschedule (for any reason) |
399 | * - is_np(scheduled) // rescheduling must be delayed, | 399 | * - is_np(scheduled) // rescheduling must be delayed, |
400 | * sys_exit_np must be requested | 400 | * sys_exit_np must be requested |
@@ -430,7 +430,7 @@ static struct task_struct* gsnedf_schedule(struct task_struct * prev) | |||
430 | out_of_time = exists && budget_enforced(entry->scheduled) | 430 | out_of_time = exists && budget_enforced(entry->scheduled) |
431 | && budget_exhausted(entry->scheduled); | 431 | && budget_exhausted(entry->scheduled); |
432 | np = exists && is_np(entry->scheduled); | 432 | np = exists && is_np(entry->scheduled); |
433 | sleep = exists && get_rt_flags(entry->scheduled) == RT_F_SLEEP; | 433 | sleep = exists && is_completed(entry->scheduled); |
434 | preempt = entry->scheduled != entry->linked; | 434 | preempt = entry->scheduled != entry->linked; |
435 | 435 | ||
436 | #ifdef WANT_ALL_SCHED_EVENTS | 436 | #ifdef WANT_ALL_SCHED_EVENTS |
@@ -582,7 +582,7 @@ static void gsnedf_task_wake_up(struct task_struct *task) | |||
582 | * a semaphore, it should never be treated as a new job release. | 582 | * a semaphore, it should never be treated as a new job release. |
583 | */ | 583 | */ |
584 | if (get_rt_flags(task) == RT_F_EXIT_SEM) { | 584 | if (get_rt_flags(task) == RT_F_EXIT_SEM) { |
585 | set_rt_flags(task, RT_F_RUNNING); | 585 | tsk_rt(task)->completed = 0; |
586 | } else { | 586 | } else { |
587 | now = litmus_clock(); | 587 | now = litmus_clock(); |
588 | if (is_tardy(task, now)) { | 588 | if (is_tardy(task, now)) { |
@@ -594,7 +594,7 @@ static void gsnedf_task_wake_up(struct task_struct *task) | |||
594 | if (task->rt.time_slice) { | 594 | if (task->rt.time_slice) { |
595 | /* came back in time before deadline | 595 | /* came back in time before deadline |
596 | */ | 596 | */ |
597 | set_rt_flags(task, RT_F_RUNNING); | 597 | tsk_rt(task)->completed = 0; |
598 | } | 598 | } |
599 | } | 599 | } |
600 | } | 600 | } |
diff --git a/litmus/sched_pfair.c b/litmus/sched_pfair.c index 72c06a492ef9..58f7fc9e8363 100644 --- a/litmus/sched_pfair.c +++ b/litmus/sched_pfair.c | |||
@@ -299,7 +299,7 @@ static void pfair_prepare_next_period(struct task_struct* t) | |||
299 | struct pfair_param* p = tsk_pfair(t); | 299 | struct pfair_param* p = tsk_pfair(t); |
300 | 300 | ||
301 | prepare_for_next_period(t); | 301 | prepare_for_next_period(t); |
302 | get_rt_flags(t) = RT_F_RUNNING; | 302 | tsk_rt(t)->completed = 0; |
303 | p->release += p->period; | 303 | p->release += p->period; |
304 | } | 304 | } |
305 | 305 | ||
@@ -598,7 +598,7 @@ static int safe_to_schedule(struct task_struct* t, int cpu) | |||
598 | "scheduled already on %d.\n", cpu, where); | 598 | "scheduled already on %d.\n", cpu, where); |
599 | return 0; | 599 | return 0; |
600 | } else | 600 | } else |
601 | return tsk_rt(t)->present && get_rt_flags(t) == RT_F_RUNNING; | 601 | return tsk_rt(t)->present && !is_completed(t); |
602 | } | 602 | } |
603 | 603 | ||
604 | static struct task_struct* pfair_schedule(struct task_struct * prev) | 604 | static struct task_struct* pfair_schedule(struct task_struct * prev) |
@@ -621,7 +621,7 @@ static struct task_struct* pfair_schedule(struct task_struct * prev) | |||
621 | raw_spin_lock(cpu_lock(state)); | 621 | raw_spin_lock(cpu_lock(state)); |
622 | 622 | ||
623 | blocks = is_realtime(prev) && !is_running(prev); | 623 | blocks = is_realtime(prev) && !is_running(prev); |
624 | completion = is_realtime(prev) && get_rt_flags(prev) == RT_F_SLEEP; | 624 | completion = is_realtime(prev) && is_completed(prev); |
625 | out_of_time = is_realtime(prev) && time_after(cur_release(prev), | 625 | out_of_time = is_realtime(prev) && time_after(cur_release(prev), |
626 | state->local_tick); | 626 | state->local_tick); |
627 | 627 | ||
@@ -720,7 +720,7 @@ static void pfair_task_wake_up(struct task_struct *t) | |||
720 | /* only add to ready queue if the task isn't still linked somewhere */ | 720 | /* only add to ready queue if the task isn't still linked somewhere */ |
721 | if (requeue) { | 721 | if (requeue) { |
722 | TRACE_TASK(t, "requeueing required\n"); | 722 | TRACE_TASK(t, "requeueing required\n"); |
723 | tsk_rt(t)->flags = RT_F_RUNNING; | 723 | tsk_rt(t)->completed = 0; |
724 | __add_ready(&cluster->pfair, t); | 724 | __add_ready(&cluster->pfair, t); |
725 | } | 725 | } |
726 | 726 | ||
diff --git a/litmus/sched_pfp.c b/litmus/sched_pfp.c index c1ae4bbd2529..91e52391a173 100644 --- a/litmus/sched_pfp.c +++ b/litmus/sched_pfp.c | |||
@@ -114,7 +114,7 @@ static void requeue(struct task_struct* t, pfp_domain_t *pfp) | |||
114 | { | 114 | { |
115 | BUG_ON(!is_running(t)); | 115 | BUG_ON(!is_running(t)); |
116 | 116 | ||
117 | set_rt_flags(t, RT_F_RUNNING); | 117 | tsk_rt(t)->completed = 0; |
118 | if (is_released(t, litmus_clock())) | 118 | if (is_released(t, litmus_clock())) |
119 | fp_prio_add(&pfp->ready_queue, t, priority_index(t)); | 119 | fp_prio_add(&pfp->ready_queue, t, priority_index(t)); |
120 | else | 120 | else |
@@ -126,7 +126,7 @@ static void job_completion(struct task_struct* t, int forced) | |||
126 | sched_trace_task_completion(t,forced); | 126 | sched_trace_task_completion(t,forced); |
127 | TRACE_TASK(t, "job_completion().\n"); | 127 | TRACE_TASK(t, "job_completion().\n"); |
128 | 128 | ||
129 | set_rt_flags(t, RT_F_SLEEP); | 129 | tsk_rt(t)->completed = 1; |
130 | prepare_for_next_period(t); | 130 | prepare_for_next_period(t); |
131 | if (is_released(t, litmus_clock())) | 131 | if (is_released(t, litmus_clock())) |
132 | sched_trace_task_release(t); | 132 | sched_trace_task_release(t); |
@@ -180,7 +180,7 @@ static struct task_struct* pfp_schedule(struct task_struct * prev) | |||
180 | budget_enforced(pfp->scheduled) && | 180 | budget_enforced(pfp->scheduled) && |
181 | budget_exhausted(pfp->scheduled); | 181 | budget_exhausted(pfp->scheduled); |
182 | np = exists && is_np(pfp->scheduled); | 182 | np = exists && is_np(pfp->scheduled); |
183 | sleep = exists && get_rt_flags(pfp->scheduled) == RT_F_SLEEP; | 183 | sleep = exists && is_completed(pfp->scheduled); |
184 | migrate = exists && get_partition(pfp->scheduled) != pfp->cpu; | 184 | migrate = exists && get_partition(pfp->scheduled) != pfp->cpu; |
185 | preempt = migrate || fp_preemption_needed(&pfp->ready_queue, prev); | 185 | preempt = migrate || fp_preemption_needed(&pfp->ready_queue, prev); |
186 | 186 | ||
@@ -253,7 +253,7 @@ static struct task_struct* pfp_schedule(struct task_struct * prev) | |||
253 | 253 | ||
254 | if (next) { | 254 | if (next) { |
255 | TRACE_TASK(next, "scheduled at %llu\n", litmus_clock()); | 255 | TRACE_TASK(next, "scheduled at %llu\n", litmus_clock()); |
256 | set_rt_flags(next, RT_F_RUNNING); | 256 | tsk_rt(next)->completed = 0; |
257 | } else { | 257 | } else { |
258 | TRACE("becoming idle at %llu\n", litmus_clock()); | 258 | TRACE("becoming idle at %llu\n", litmus_clock()); |
259 | } | 259 | } |
diff --git a/litmus/sched_psn_edf.c b/litmus/sched_psn_edf.c index 8933e15605ae..0e1675d2e572 100644 --- a/litmus/sched_psn_edf.c +++ b/litmus/sched_psn_edf.c | |||
@@ -60,7 +60,7 @@ static void requeue(struct task_struct* t, rt_domain_t *edf) | |||
60 | if (t->state != TASK_RUNNING) | 60 | if (t->state != TASK_RUNNING) |
61 | TRACE_TASK(t, "requeue: !TASK_RUNNING\n"); | 61 | TRACE_TASK(t, "requeue: !TASK_RUNNING\n"); |
62 | 62 | ||
63 | set_rt_flags(t, RT_F_RUNNING); | 63 | tsk_rt(t)->completed = 0; |
64 | if (is_released(t, litmus_clock())) | 64 | if (is_released(t, litmus_clock())) |
65 | __add_ready(edf, t); | 65 | __add_ready(edf, t); |
66 | else | 66 | else |
@@ -160,7 +160,7 @@ static void job_completion(struct task_struct* t, int forced) | |||
160 | sched_trace_task_completion(t,forced); | 160 | sched_trace_task_completion(t,forced); |
161 | TRACE_TASK(t, "job_completion().\n"); | 161 | TRACE_TASK(t, "job_completion().\n"); |
162 | 162 | ||
163 | set_rt_flags(t, RT_F_SLEEP); | 163 | tsk_rt(t)->completed = 1; |
164 | prepare_for_next_period(t); | 164 | prepare_for_next_period(t); |
165 | } | 165 | } |
166 | 166 | ||
@@ -214,7 +214,7 @@ static struct task_struct* psnedf_schedule(struct task_struct * prev) | |||
214 | budget_enforced(pedf->scheduled) && | 214 | budget_enforced(pedf->scheduled) && |
215 | budget_exhausted(pedf->scheduled); | 215 | budget_exhausted(pedf->scheduled); |
216 | np = exists && is_np(pedf->scheduled); | 216 | np = exists && is_np(pedf->scheduled); |
217 | sleep = exists && get_rt_flags(pedf->scheduled) == RT_F_SLEEP; | 217 | sleep = exists && is_completed(pedf->scheduled); |
218 | preempt = edf_preemption_needed(edf, prev); | 218 | preempt = edf_preemption_needed(edf, prev); |
219 | 219 | ||
220 | /* If we need to preempt do so. | 220 | /* If we need to preempt do so. |
@@ -266,7 +266,7 @@ static struct task_struct* psnedf_schedule(struct task_struct * prev) | |||
266 | 266 | ||
267 | if (next) { | 267 | if (next) { |
268 | TRACE_TASK(next, "scheduled at %llu\n", litmus_clock()); | 268 | TRACE_TASK(next, "scheduled at %llu\n", litmus_clock()); |
269 | set_rt_flags(next, RT_F_RUNNING); | 269 | tsk_rt(next)->completed = 0; |
270 | } else { | 270 | } else { |
271 | TRACE("becoming idle at %llu\n", litmus_clock()); | 271 | TRACE("becoming idle at %llu\n", litmus_clock()); |
272 | } | 272 | } |