diff options
-rw-r--r-- | include/litmus/budget.h | 2 | ||||
-rw-r--r-- | litmus/jobs.c | 2 | ||||
-rw-r--r-- | litmus/sched_cedf.c | 3 | ||||
-rw-r--r-- | litmus/sched_gsn_edf.c | 3 | ||||
-rw-r--r-- | litmus/sync.c | 12 |
5 files changed, 14 insertions, 8 deletions
diff --git a/include/litmus/budget.h b/include/litmus/budget.h index 33344ee8d5f9..c4e9e40a828e 100644 --- a/include/litmus/budget.h +++ b/include/litmus/budget.h | |||
@@ -29,7 +29,7 @@ static inline int requeue_preempted_job(struct task_struct* t) | |||
29 | /* Add task to ready queue only if not subject to budget enforcement or | 29 | /* Add task to ready queue only if not subject to budget enforcement or |
30 | * if the job has budget remaining. t may be NULL. | 30 | * if the job has budget remaining. t may be NULL. |
31 | */ | 31 | */ |
32 | return t && (!budget_exhausted(t) || !budget_enforced(t)); | 32 | return t && !is_completed(t) && (!budget_exhausted(t) || !budget_enforced(t)); |
33 | } | 33 | } |
34 | 34 | ||
35 | #endif | 35 | #endif |
diff --git a/litmus/jobs.c b/litmus/jobs.c index 13a4ed4c9e93..3edb7ab4af60 100644 --- a/litmus/jobs.c +++ b/litmus/jobs.c | |||
@@ -28,7 +28,7 @@ void prepare_for_next_period(struct task_struct *t) | |||
28 | * release and deadline. Lateness may be negative. | 28 | * release and deadline. Lateness may be negative. |
29 | */ | 29 | */ |
30 | t->rt_param.job_params.lateness = | 30 | t->rt_param.job_params.lateness = |
31 | (long long)litmus_clock() - | 31 | (long long)litmus_clock() - |
32 | (long long)t->rt_param.job_params.deadline; | 32 | (long long)t->rt_param.job_params.deadline; |
33 | 33 | ||
34 | setup_release(t, get_release(t) + get_rt_period(t)); | 34 | setup_release(t, get_release(t) + get_rt_period(t)); |
diff --git a/litmus/sched_cedf.c b/litmus/sched_cedf.c index 6e1327bbf504..91f7c6f91dc4 100644 --- a/litmus/sched_cedf.c +++ b/litmus/sched_cedf.c | |||
@@ -171,7 +171,6 @@ 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 | tsk_rt(linked)->completed = 0; | ||
175 | /* handle task is already scheduled somewhere! */ | 174 | /* handle task is already scheduled somewhere! */ |
176 | on_cpu = linked->rt_param.scheduled_on; | 175 | on_cpu = linked->rt_param.scheduled_on; |
177 | if (on_cpu != NO_CPU) { | 176 | if (on_cpu != NO_CPU) { |
@@ -350,7 +349,7 @@ static noinline void job_completion(struct task_struct *t, int forced) | |||
350 | TRACE_TASK(t, "job_completion().\n"); | 349 | TRACE_TASK(t, "job_completion().\n"); |
351 | 350 | ||
352 | /* set flags */ | 351 | /* set flags */ |
353 | tsk_rt(t)->completed = 1; | 352 | tsk_rt(t)->completed = 0; |
354 | /* prepare for next period */ | 353 | /* prepare for next period */ |
355 | prepare_for_next_period(t); | 354 | prepare_for_next_period(t); |
356 | if (is_early_releasing(t) || is_released(t, litmus_clock())) | 355 | if (is_early_releasing(t) || is_released(t, litmus_clock())) |
diff --git a/litmus/sched_gsn_edf.c b/litmus/sched_gsn_edf.c index 5956978ccdbe..04454e8ce51e 100644 --- a/litmus/sched_gsn_edf.c +++ b/litmus/sched_gsn_edf.c | |||
@@ -173,7 +173,6 @@ 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 | tsk_rt(linked)->completed = 0; | ||
177 | /* handle task is already scheduled somewhere! */ | 176 | /* handle task is already scheduled somewhere! */ |
178 | on_cpu = linked->rt_param.scheduled_on; | 177 | on_cpu = linked->rt_param.scheduled_on; |
179 | if (on_cpu != NO_CPU) { | 178 | if (on_cpu != NO_CPU) { |
@@ -341,7 +340,7 @@ static noinline void job_completion(struct task_struct *t, int forced) | |||
341 | TRACE_TASK(t, "job_completion().\n"); | 340 | TRACE_TASK(t, "job_completion().\n"); |
342 | 341 | ||
343 | /* set flags */ | 342 | /* set flags */ |
344 | tsk_rt(t)->completed = 1; | 343 | tsk_rt(t)->completed = 0; |
345 | /* prepare for next period */ | 344 | /* prepare for next period */ |
346 | prepare_for_next_period(t); | 345 | prepare_for_next_period(t); |
347 | if (is_early_releasing(t) || is_released(t, litmus_clock())) | 346 | if (is_early_releasing(t) || is_released(t, litmus_clock())) |
diff --git a/litmus/sync.c b/litmus/sync.c index 3e79e0a12a5a..88a050e10ee7 100644 --- a/litmus/sync.c +++ b/litmus/sync.c | |||
@@ -50,12 +50,20 @@ static long do_wait_for_ts_release(void) | |||
50 | ret = wait_for_completion_interruptible(&wait.completion); | 50 | ret = wait_for_completion_interruptible(&wait.completion); |
51 | 51 | ||
52 | if (!ret) { | 52 | if (!ret) { |
53 | /* Setting this flag before releasing ensures that this CPU | ||
54 | * will be the next CPU to requeue the task on a ready or | ||
55 | * release queue. | ||
56 | */ | ||
57 | tsk_rt(current)->completed = 1; | ||
58 | mb(); | ||
59 | |||
53 | /* Completion succeeded, setup release. */ | 60 | /* Completion succeeded, setup release. */ |
54 | litmus->release_at(current, wait.ts_release_time | 61 | litmus->release_at(current, wait.ts_release_time |
55 | + current->rt_param.task_params.phase | 62 | + current->rt_param.task_params.phase |
56 | - current->rt_param.task_params.period); | 63 | - current->rt_param.task_params.period); |
57 | /* trigger advance to next job release at the programmed time */ | 64 | |
58 | ret = complete_job(); | 65 | schedule(); |
66 | ret = 0; | ||
59 | } else { | 67 | } else { |
60 | /* We were interrupted, must cleanup list. */ | 68 | /* We were interrupted, must cleanup list. */ |
61 | mutex_lock(&task_release_lock); | 69 | mutex_lock(&task_release_lock); |