diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2010-12-02 05:39:10 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2010-12-02 05:39:10 -0500 |
commit | a38bd0fe34e501db693ed34046f028ee8c92ea23 (patch) | |
tree | d62b9a4b1220fbb6da7e58d15e8146f71421446c /litmus/sched_edf_hsb.c | |
parent | dbb40a2f0a3a225b45a82ca05c2a9754949eadfb (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-x | litmus/sched_edf_hsb.c | 40 |
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) | |||
549 | static void slack_timer_arm(struct hrt_server *server) | 554 | static 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 | ||
579 | static enum hrtimer_restart slack_timer_fire(struct hrtimer *timer) | 579 | static 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 | */ |
608 | static long edf_hsb_activate_plugin(void) | 607 | static 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 | } |
641 | out: | 645 | out: |
642 | return rv; | 646 | return rv; |