aboutsummaryrefslogtreecommitdiffstats
path: root/litmus/sched_edf_hsb.c
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2010-12-02 05:39:10 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2010-12-02 05:39:10 -0500
commita38bd0fe34e501db693ed34046f028ee8c92ea23 (patch)
treed62b9a4b1220fbb6da7e58d15e8146f71421446c /litmus/sched_edf_hsb.c
parentdbb40a2f0a3a225b45a82ca05c2a9754949eadfb (diff)
Changed the way slack timers are armed.
A different hrtimer_start_on_info struct must be used for each timer. This is used to migrate the slack timers to the proper cpus when the plugin is activated. Repeatedly using this struct to arm the slack timer wasn't working, so now the slack timer arm method arms on the local CPU.
Diffstat (limited to 'litmus/sched_edf_hsb.c')
-rwxr-xr-xlitmus/sched_edf_hsb.c40
1 files changed, 22 insertions, 18 deletions
diff --git a/litmus/sched_edf_hsb.c b/litmus/sched_edf_hsb.c
index 751f276da595..73d7c6b2fc31 100755
--- a/litmus/sched_edf_hsb.c
+++ b/litmus/sched_edf_hsb.c
@@ -54,7 +54,11 @@ struct cpu_entry {
54 int cpu; 54 int cpu;
55 struct task_struct* scheduled; 55 struct task_struct* scheduled;
56 struct task_struct* linked; 56 struct task_struct* linked;
57 struct hrtimer_start_on_info hrtimer_info; 57
58 /* Used to execute timers on remote CPUs */
59 struct hrtimer_start_on_info budget_timer_info;
60 struct hrtimer_start_on_info slack_timer_info;
61
58 struct hrt_server hrt_server; 62 struct hrt_server hrt_server;
59}; 63};
60 64
@@ -260,7 +264,8 @@ void initialize_cpu_variables(void)
260 264
261 /* CPU entries */ 265 /* CPU entries */
262 cpu_entry->cpu = cpu; 266 cpu_entry->cpu = cpu;
263 hrtimer_start_on_info_init(&cpu_entry->hrtimer_info); 267 hrtimer_start_on_info_init(&cpu_entry->budget_timer_info);
268 hrtimer_start_on_info_init(&cpu_entry->slack_timer_info);
264 269
265 /* HRT servers */ 270 /* HRT servers */
266 rwlock_init(&hrt_server->param_lock); 271 rwlock_init(&hrt_server->param_lock);
@@ -549,31 +554,26 @@ static enum hrtimer_restart refill_timer_fire(struct hrtimer *timer)
549static void slack_timer_arm(struct hrt_server *server) 554static void slack_timer_arm(struct hrt_server *server)
550{ 555{
551 struct hrtimer *timer = &server->slack_timer; 556 struct hrtimer *timer = &server->slack_timer;
552 struct cpu_entry *entry = container_of(server,
553 struct cpu_entry,
554 hrt_server);
555 lt_t when_to_fire = server->deadline - server->budget; 557 lt_t when_to_fire = server->deadline - server->budget;
556 558
557 if (server->no_slack || server->budget <= 0) { 559 if (server->no_slack || server->budget <= 0) {
558 TRACE("cancel slack timer arm"); 560 TRACE("not arming slack timer");
559 return; 561 return;
560 } 562 }
561 563
562
563 BUG_ON(hrtimer_active(timer)); 564 BUG_ON(hrtimer_active(timer));
564 BUG_ON(hrtimer_active(&server->budget_timer)); 565 BUG_ON(hrtimer_active(&server->budget_timer));
565 566
566 /* kind of ridiculous to check this, but whatever... */
567 BUG_ON(server->budget >= server->deadline); 567 BUG_ON(server->budget >= server->deadline);
568 /* Can this happen? */
569 BUG_ON(lt_after_eq(litmus_clock(), when_to_fire)); 568 BUG_ON(lt_after_eq(litmus_clock(), when_to_fire));
570 569
571 TRACE("slack armed to fire at %llu", when_to_fire); 570 TRACE("slack armed to fire at %llu", when_to_fire);
572 571
573 hrtimer_start_on(entry->cpu, &entry->hrtimer_info, 572 __hrtimer_start_range_ns(timer,
574 timer, 573 ns_to_ktime(when_to_fire),
575 ns_to_ktime(when_to_fire), 574 0 /* delta */,
576 HRTIMER_MODE_ABS_PINNED); 575 HRTIMER_MODE_ABS_PINNED,
576 0 /* no wakeup */);
577} 577}
578 578
579static enum hrtimer_restart slack_timer_fire(struct hrtimer *timer) 579static enum hrtimer_restart slack_timer_fire(struct hrtimer *timer)
@@ -585,8 +585,7 @@ static enum hrtimer_restart slack_timer_fire(struct hrtimer *timer)
585 local_irq_save(flags); 585 local_irq_save(flags);
586 server->no_slack = 1; 586 server->no_slack = 1;
587 587
588 TRACE("slack timer fired on cpu %d at litmus time: %llu\n", 588 TRACE("slack timer fired at litmus time: %llu\n", litmus_clock());
589 entry->cpu, litmus_clock());
590 589
591 /* activate scheduler */ 590 /* activate scheduler */
592 litmus_reschedule_local(); 591 litmus_reschedule_local();
@@ -607,7 +606,7 @@ static enum hrtimer_restart slack_timer_fire(struct hrtimer *timer)
607 */ 606 */
608static long edf_hsb_activate_plugin(void) 607static long edf_hsb_activate_plugin(void)
609{ 608{
610 lt_t common_server_start = litmus_clock(); 609 lt_t slack_fire, common_server_start = litmus_clock();
611 struct cpu_entry *cpu_entry; 610 struct cpu_entry *cpu_entry;
612 struct hrt_server* server; 611 struct hrt_server* server;
613 long rv = 0; 612 long rv = 0;
@@ -628,15 +627,20 @@ static long edf_hsb_activate_plugin(void)
628 server->deadline = common_server_start + server->period; 627 server->deadline = common_server_start + server->period;
629 server->budget = server->wcet; 628 server->budget = server->wcet;
630 server->start_exec_time = 0; 629 server->start_exec_time = 0;
630 slack_fire = server->deadline - server->budget;
631 631
632 TRACE("setting up cpu %d to have timer deadline %llu\n", 632 TRACE("setting up cpu %d to have timer deadline %llu\n",
633 cpu, server->deadline); 633 cpu, server->deadline);
634 hrtimer_start_on(cpu, &cpu_entry->hrtimer_info, 634 hrtimer_start_on(cpu, &cpu_entry->budget_timer_info,
635 &server->refill_timer, 635 &server->refill_timer,
636 ns_to_ktime(server->deadline), 636 ns_to_ktime(server->deadline),
637 HRTIMER_MODE_ABS_PINNED); 637 HRTIMER_MODE_ABS_PINNED);
638 638
639 slack_timer_arm(server); 639 hrtimer_start_on(cpu, &cpu_entry->slack_timer_info,
640 &server->slack_timer,
641 ns_to_ktime(slack_fire),
642 HRTIMER_MODE_ABS_PINNED);
643
640 } 644 }
641out: 645out:
642 return rv; 646 return rv;