Skip to content
Snippets Groups Projects
Commit 06c8b14a authored by Armin Luntzer's avatar Armin Luntzer
Browse files

ordering in EDF still required some fixups

parent d30f551f
No related branches found
No related tags found
No related merge requests found
...@@ -930,18 +930,11 @@ static struct task_struct *edf_pick_next(struct task_queue *tq) ...@@ -930,18 +930,11 @@ static struct task_struct *edf_pick_next(struct task_queue *tq)
/* nope, just update minimum runtime for this slot */ /* nope, just update minimum runtime for this slot */
if (delta < slot) { if (delta < slot)
slot = delta; slot = delta;
// printk("d %lld now: %lld \n", ktime_to_us(delta), now);
}
// printk("delta %llu %llu\n", delta, tsk->wakeup);
continue;
}
if (delta < 0) {
// printk("\n%lld %d\n", ktime_to_us(delta), tsk->state); continue;
// printk("%s: %lld (%lld) deadline: %lld now: %lld state %d\n", tsk->name, ktime_to_ms(delta), tsk->wakeup, tsk->deadline, now, tsk->state);
} }
/* if it's already running, see if there is time remaining */ /* if it's already running, see if there is time remaining */
...@@ -949,20 +942,16 @@ static struct task_struct *edf_pick_next(struct task_queue *tq) ...@@ -949,20 +942,16 @@ static struct task_struct *edf_pick_next(struct task_queue *tq)
if (!schedule_edf_can_execute(tsk, now)) { if (!schedule_edf_can_execute(tsk, now)) {
schedule_edf_reinit_task(tsk, now); schedule_edf_reinit_task(tsk, now);
// printk("reinit %s\n", tsk->name);
/* nope, update minimum runtime for this slot */ /* nope, update minimum runtime for this slot */
delta = ktime_delta(tsk->wakeup, now); delta = ktime_delta(tsk->wakeup, now);
/* if wakeup must happen earlier than the next /* if wakeup must happen earlier than the next
* scheduling event, adjust the slot timeout * scheduling event, adjust the slot timeout
*/ */
if (delta < slot) { if (delta < slot)
slot = delta; slot = delta;
// printk("slot %lld\n", ktime_to_us(delta));
}
if (delta < 0)
printk("delta %lld %lld\n", ktime_to_us(delta), ktime_to_us(tick_get_period_min_ns()));
BUG_ON(delta < 0); BUG_ON(delta < 0);
list_move_tail(&tsk->node, &tq->run); list_move_tail(&tsk->node, &tq->run);
...@@ -1024,14 +1013,20 @@ static struct task_struct *edf_pick_next(struct task_queue *tq) ...@@ -1024,14 +1013,20 @@ static struct task_struct *edf_pick_next(struct task_queue *tq)
slot = first->runtime; slot = first->runtime;
} }
#if 0 #if 1
if (!go) {
list_for_each_entry_safe(tsk, tmp, &tq->run, node) { list_for_each_entry_safe(tsk, tmp, &tq->run, node) {
printk("%c %s %lld %lld\n",
(tsk->state == TASK_RUN) ? 'R' : 'I', if (tsk->state != TASK_RUN)
tsk->name, continue;
ktime_to_ms(ktime_delta(tsk->wakeup, now)),
ktime_to_ms(ktime_delta(tsk->deadline, now)) if (ktime_before (tsk->wakeup, now)) {
); go = tsk;
slot = tsk->runtime;
break;
}
}
} }
#endif #endif
// if (!go) // if (!go)
...@@ -1137,6 +1132,7 @@ static ktime edf_timeslice_ns(struct task_struct *task) ...@@ -1137,6 +1132,7 @@ static ktime edf_timeslice_ns(struct task_struct *task)
static int edf_check_sched_attr(struct sched_attr *attr) static int edf_check_sched_attr(struct sched_attr *attr)
{ {
return 0; /* XXX */
if (!attr) if (!attr)
goto error; goto error;
......
...@@ -88,9 +88,9 @@ static void sched_edf_create_tasks_test(void) ...@@ -88,9 +88,9 @@ static void sched_edf_create_tasks_test(void)
t->sched = &sched_edf; t->sched = &sched_edf;
t->attr.policy = SCHED_EDF; t->attr.policy = SCHED_EDF;
t->attr.period = us_to_ktime(800); t->attr.period = us_to_ktime(1500);
t->attr.deadline_rel = us_to_ktime(700); t->attr.deadline_rel = us_to_ktime(400);
t->attr.wcet = us_to_ktime(200); t->attr.wcet = us_to_ktime(300);
edf_enqueue(&t->sched->tq, t); edf_enqueue(&t->sched->tq, t);
...@@ -105,9 +105,9 @@ static void sched_edf_create_tasks_test(void) ...@@ -105,9 +105,9 @@ static void sched_edf_create_tasks_test(void)
t->sched = &sched_edf; t->sched = &sched_edf;
t->attr.policy = SCHED_EDF; t->attr.policy = SCHED_EDF;
t->attr.period = us_to_ktime(300); t->attr.period = us_to_ktime(30);
t->attr.deadline_rel = us_to_ktime(200); t->attr.deadline_rel = us_to_ktime(20);
t->attr.wcet = us_to_ktime(100); t->attr.wcet = us_to_ktime(10);
edf_enqueue(&t->sched->tq, t); edf_enqueue(&t->sched->tq, t);
...@@ -122,7 +122,7 @@ static void sched_edf_create_tasks_test(void) ...@@ -122,7 +122,7 @@ static void sched_edf_create_tasks_test(void)
t->sched = &sched_edf; t->sched = &sched_edf;
t->attr.policy = SCHED_EDF; t->attr.policy = SCHED_EDF;
t->attr.period = us_to_ktime(2000); t->attr.period = us_to_ktime(3000);
t->attr.deadline_rel = us_to_ktime(900); t->attr.deadline_rel = us_to_ktime(900);
t->attr.wcet = us_to_ktime(100); t->attr.wcet = us_to_ktime(100);
edf_enqueue(&t->sched->tq, t); edf_enqueue(&t->sched->tq, t);
...@@ -133,7 +133,7 @@ static void sched_edf_create_tasks_test(void) ...@@ -133,7 +133,7 @@ static void sched_edf_create_tasks_test(void)
* @test sched_edf_create_tasks_test * @test sched_edf_create_tasks_test
*/ */
#define CYCLES 1 #define CYCLES 10000
static void sched_edf_schedule_test(void) static void sched_edf_schedule_test(void)
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment