diff options
Diffstat (limited to 'litmus')
-rw-r--r-- | litmus/budget.c | 16 | ||||
-rw-r--r-- | litmus/jobs.c | 2 | ||||
-rw-r--r-- | litmus/litmus.c | 10 | ||||
-rw-r--r-- | litmus/sched_cedf.c | 47 | ||||
-rw-r--r-- | litmus/sched_gsn_edf.c | 55 | ||||
-rw-r--r-- | litmus/sched_pfp.c | 40 | ||||
-rw-r--r-- | litmus/sched_psn_edf.c | 41 |
7 files changed, 149 insertions, 62 deletions
diff --git a/litmus/budget.c b/litmus/budget.c index f7712be29adb..518174a37a3b 100644 --- a/litmus/budget.c +++ b/litmus/budget.c | |||
@@ -1,11 +1,13 @@ | |||
1 | #include <linux/sched.h> | 1 | #include <linux/sched.h> |
2 | #include <linux/percpu.h> | 2 | #include <linux/percpu.h> |
3 | #include <linux/hrtimer.h> | 3 | #include <linux/hrtimer.h> |
4 | #include <linux/signal.h> | ||
4 | 5 | ||
5 | #include <litmus/litmus.h> | 6 | #include <litmus/litmus.h> |
6 | #include <litmus/preempt.h> | 7 | #include <litmus/preempt.h> |
7 | 8 | ||
8 | #include <litmus/budget.h> | 9 | #include <litmus/budget.h> |
10 | #include <litmus/signal.h> | ||
9 | 11 | ||
10 | struct enforcement_timer { | 12 | struct enforcement_timer { |
11 | /* The enforcement timer is used to accurately police | 13 | /* The enforcement timer is used to accurately police |
@@ -64,7 +66,7 @@ static void arm_enforcement_timer(struct enforcement_timer* et, | |||
64 | 66 | ||
65 | /* Calling this when there is no budget left for the task | 67 | /* Calling this when there is no budget left for the task |
66 | * makes no sense, unless the task is non-preemptive. */ | 68 | * makes no sense, unless the task is non-preemptive. */ |
67 | BUG_ON(budget_exhausted(t) && (!is_np(t))); | 69 | BUG_ON(budget_exhausted(t) && !is_np(t)); |
68 | 70 | ||
69 | /* __hrtimer_start_range_ns() cancels the timer | 71 | /* __hrtimer_start_range_ns() cancels the timer |
70 | * anyway, so we don't have to check whether it is still armed */ | 72 | * anyway, so we don't have to check whether it is still armed */ |
@@ -86,7 +88,7 @@ void update_enforcement_timer(struct task_struct* t) | |||
86 | { | 88 | { |
87 | struct enforcement_timer* et = &__get_cpu_var(budget_timer); | 89 | struct enforcement_timer* et = &__get_cpu_var(budget_timer); |
88 | 90 | ||
89 | if (t && budget_precisely_enforced(t)) { | 91 | if (t && budget_precisely_tracked(t) && !sigbudget_sent(t)) { |
90 | /* Make sure we call into the scheduler when this budget | 92 | /* Make sure we call into the scheduler when this budget |
91 | * expires. */ | 93 | * expires. */ |
92 | arm_enforcement_timer(et, t); | 94 | arm_enforcement_timer(et, t); |
@@ -96,6 +98,16 @@ void update_enforcement_timer(struct task_struct* t) | |||
96 | } | 98 | } |
97 | } | 99 | } |
98 | 100 | ||
101 | void send_sigbudget(struct task_struct* t) | ||
102 | { | ||
103 | if (!test_and_set_bit(RT_JOB_SIG_BUDGET_SENT, &tsk_rt(t)->job_params.flags)) { | ||
104 | /* signal has not yet been sent and we are responsible for sending | ||
105 | * since we just set the sent-bit when it was previously 0. */ | ||
106 | |||
107 | TRACE_TASK(t, "SIG_BUDGET being sent!\n"); | ||
108 | send_sig(SIG_BUDGET, t, 1); /* '1' denotes signal sent from kernel */ | ||
109 | } | ||
110 | } | ||
99 | 111 | ||
100 | static int __init init_budget_enforcement(void) | 112 | static int __init init_budget_enforcement(void) |
101 | { | 113 | { |
diff --git a/litmus/jobs.c b/litmus/jobs.c index fb093c03d53d..9fe4eb1fa168 100644 --- a/litmus/jobs.c +++ b/litmus/jobs.c | |||
@@ -13,6 +13,8 @@ static inline void setup_release(struct task_struct *t, lt_t release) | |||
13 | t->rt_param.job_params.deadline = release + get_rt_relative_deadline(t); | 13 | t->rt_param.job_params.deadline = release + get_rt_relative_deadline(t); |
14 | t->rt_param.job_params.exec_time = 0; | 14 | t->rt_param.job_params.exec_time = 0; |
15 | 15 | ||
16 | clear_bit(RT_JOB_SIG_BUDGET_SENT, &t->rt_param.job_params.flags); | ||
17 | |||
16 | /* update job sequence number */ | 18 | /* update job sequence number */ |
17 | t->rt_param.job_params.job_no++; | 19 | t->rt_param.job_params.job_no++; |
18 | 20 | ||
diff --git a/litmus/litmus.c b/litmus/litmus.c index 83a860c52e17..53727d699915 100644 --- a/litmus/litmus.c +++ b/litmus/litmus.c | |||
@@ -162,6 +162,16 @@ asmlinkage long sys_set_rt_task_param(pid_t pid, struct rt_task __user * param) | |||
162 | pid, tp.budget_policy); | 162 | pid, tp.budget_policy); |
163 | goto out_unlock; | 163 | goto out_unlock; |
164 | } | 164 | } |
165 | if (tp.budget_signal_policy != NO_SIGNALS && | ||
166 | tp.budget_signal_policy != QUANTUM_SIGNALS && | ||
167 | tp.budget_signal_policy != PRECISE_SIGNALS) | ||
168 | { | ||
169 | printk(KERN_INFO "litmus: real-time task %d rejected " | ||
170 | "because unsupported budget signalling policy " | ||
171 | "specified (%d)\n", | ||
172 | pid, tp.budget_signal_policy); | ||
173 | goto out_unlock; | ||
174 | } | ||
165 | 175 | ||
166 | target->rt_param.task_params = tp; | 176 | target->rt_param.task_params = tp; |
167 | 177 | ||
diff --git a/litmus/sched_cedf.c b/litmus/sched_cedf.c index 0460e232d6e6..d98de4579394 100644 --- a/litmus/sched_cedf.c +++ b/litmus/sched_cedf.c | |||
@@ -433,21 +433,29 @@ static noinline void job_completion(struct task_struct *t, int forced) | |||
433 | */ | 433 | */ |
434 | static void cedf_tick(struct task_struct* t) | 434 | static void cedf_tick(struct task_struct* t) |
435 | { | 435 | { |
436 | if (is_realtime(t) && budget_enforced(t) && budget_exhausted(t)) { | 436 | if (is_realtime(t) && budget_exhausted(t)) |
437 | if (!is_np(t)) { | 437 | { |
438 | /* np tasks will be preempted when they become | 438 | if (budget_signalled(t) && !sigbudget_sent(t)) { |
439 | * preemptable again | 439 | /* signal exhaustion */ |
440 | */ | 440 | send_sigbudget(t); |
441 | litmus_reschedule_local(); | 441 | } |
442 | set_will_schedule(); | 442 | |
443 | TRACE("cedf_scheduler_tick: " | 443 | if (budget_enforced(t)) { |
444 | "%d is preemptable " | 444 | if (!is_np(t)) { |
445 | " => FORCE_RESCHED\n", t->pid); | 445 | /* np tasks will be preempted when they become |
446 | } else if (is_user_np(t)) { | 446 | * preemptable again |
447 | TRACE("cedf_scheduler_tick: " | 447 | */ |
448 | "%d is non-preemptable, " | 448 | litmus_reschedule_local(); |
449 | "preemption delayed.\n", t->pid); | 449 | set_will_schedule(); |
450 | request_exit_np(t); | 450 | TRACE("cedf_scheduler_tick: " |
451 | "%d is preemptable " | ||
452 | " => FORCE_RESCHED\n", t->pid); | ||
453 | } else if (is_user_np(t)) { | ||
454 | TRACE("cedf_scheduler_tick: " | ||
455 | "%d is non-preemptable, " | ||
456 | "preemption delayed.\n", t->pid); | ||
457 | request_exit_np(t); | ||
458 | } | ||
451 | } | 459 | } |
452 | } | 460 | } |
453 | } | 461 | } |
@@ -785,7 +793,7 @@ static struct task_struct* cedf_schedule(struct task_struct * prev) | |||
785 | { | 793 | { |
786 | cpu_entry_t* entry = &__get_cpu_var(cedf_cpu_entries); | 794 | cpu_entry_t* entry = &__get_cpu_var(cedf_cpu_entries); |
787 | cedf_domain_t *cluster = entry->cluster; | 795 | cedf_domain_t *cluster = entry->cluster; |
788 | int out_of_time, sleep, preempt, np, exists, blocks; | 796 | int out_of_time, signal_budget, sleep, preempt, np, exists, blocks; |
789 | struct task_struct* next = NULL; | 797 | struct task_struct* next = NULL; |
790 | 798 | ||
791 | #ifdef CONFIG_RELEASE_MASTER | 799 | #ifdef CONFIG_RELEASE_MASTER |
@@ -812,6 +820,10 @@ static struct task_struct* cedf_schedule(struct task_struct * prev) | |||
812 | out_of_time = exists && | 820 | out_of_time = exists && |
813 | budget_enforced(entry->scheduled) && | 821 | budget_enforced(entry->scheduled) && |
814 | budget_exhausted(entry->scheduled); | 822 | budget_exhausted(entry->scheduled); |
823 | signal_budget = exists && | ||
824 | budget_signalled(entry->scheduled) && | ||
825 | budget_exhausted(entry->scheduled) && | ||
826 | !sigbudget_sent(entry->scheduled); | ||
815 | np = exists && is_np(entry->scheduled); | 827 | np = exists && is_np(entry->scheduled); |
816 | sleep = exists && get_rt_flags(entry->scheduled) == RT_F_SLEEP; | 828 | sleep = exists && get_rt_flags(entry->scheduled) == RT_F_SLEEP; |
817 | preempt = entry->scheduled != entry->linked; | 829 | preempt = entry->scheduled != entry->linked; |
@@ -830,6 +842,9 @@ static struct task_struct* cedf_schedule(struct task_struct * prev) | |||
830 | TRACE_TASK(prev, "will be preempted by %s/%d\n", | 842 | TRACE_TASK(prev, "will be preempted by %s/%d\n", |
831 | entry->linked->comm, entry->linked->pid); | 843 | entry->linked->comm, entry->linked->pid); |
832 | 844 | ||
845 | /* Send the signal that the budget has been exhausted */ | ||
846 | if (signal_budget) | ||
847 | send_sigbudget(entry->scheduled); | ||
833 | 848 | ||
834 | /* If a task blocks we have no choice but to reschedule. | 849 | /* If a task blocks we have no choice but to reschedule. |
835 | */ | 850 | */ |
diff --git a/litmus/sched_gsn_edf.c b/litmus/sched_gsn_edf.c index 11304d634661..83b2f04b1532 100644 --- a/litmus/sched_gsn_edf.c +++ b/litmus/sched_gsn_edf.c | |||
@@ -410,20 +410,28 @@ static noinline void job_completion(struct task_struct *t, int forced) | |||
410 | */ | 410 | */ |
411 | static void gsnedf_tick(struct task_struct* t) | 411 | static void gsnedf_tick(struct task_struct* t) |
412 | { | 412 | { |
413 | if (is_realtime(t) && budget_enforced(t) && budget_exhausted(t)) { | 413 | if (is_realtime(t) && budget_exhausted(t)) |
414 | if (!is_np(t)) { | 414 | { |
415 | /* np tasks will be preempted when they become | 415 | if (budget_signalled(t) && !sigbudget_sent(t)) { |
416 | * preemptable again | 416 | /* signal exhaustion */ |
417 | */ | 417 | send_sigbudget(t); |
418 | litmus_reschedule_local(); | 418 | } |
419 | TRACE("gsnedf_scheduler_tick: " | 419 | |
420 | "%d is preemptable " | 420 | if (budget_enforced(t)) { |
421 | " => FORCE_RESCHED\n", t->pid); | 421 | if (!is_np(t)) { |
422 | } else if (is_user_np(t)) { | 422 | /* np tasks will be preempted when they become |
423 | TRACE("gsnedf_scheduler_tick: " | 423 | * preemptable again |
424 | "%d is non-preemptable, " | 424 | */ |
425 | "preemption delayed.\n", t->pid); | 425 | litmus_reschedule_local(); |
426 | request_exit_np(t); | 426 | TRACE("gsnedf_scheduler_tick: " |
427 | "%d is preemptable " | ||
428 | " => FORCE_RESCHED\n", t->pid); | ||
429 | } else if (is_user_np(t)) { | ||
430 | TRACE("gsnedf_scheduler_tick: " | ||
431 | "%d is non-preemptable, " | ||
432 | "preemption delayed.\n", t->pid); | ||
433 | request_exit_np(t); | ||
434 | } | ||
427 | } | 435 | } |
428 | } | 436 | } |
429 | } | 437 | } |
@@ -764,7 +772,7 @@ static void gsnedf_change_prio_pai_tasklet(struct task_struct *old_prio, | |||
764 | static struct task_struct* gsnedf_schedule(struct task_struct * prev) | 772 | static struct task_struct* gsnedf_schedule(struct task_struct * prev) |
765 | { | 773 | { |
766 | cpu_entry_t* entry = &__get_cpu_var(gsnedf_cpu_entries); | 774 | cpu_entry_t* entry = &__get_cpu_var(gsnedf_cpu_entries); |
767 | int out_of_time, sleep, preempt, np, exists, blocks; | 775 | int out_of_time, signal_budget, sleep, preempt, np, exists, blocks; |
768 | struct task_struct* next = NULL; | 776 | struct task_struct* next = NULL; |
769 | 777 | ||
770 | #ifdef CONFIG_RELEASE_MASTER | 778 | #ifdef CONFIG_RELEASE_MASTER |
@@ -787,8 +795,13 @@ static struct task_struct* gsnedf_schedule(struct task_struct * prev) | |||
787 | /* (0) Determine state */ | 795 | /* (0) Determine state */ |
788 | exists = entry->scheduled != NULL; | 796 | exists = entry->scheduled != NULL; |
789 | blocks = exists && !is_running(entry->scheduled); | 797 | blocks = exists && !is_running(entry->scheduled); |
790 | out_of_time = exists && budget_enforced(entry->scheduled) | 798 | out_of_time = exists && |
791 | && budget_exhausted(entry->scheduled); | 799 | budget_enforced(entry->scheduled) && |
800 | budget_exhausted(entry->scheduled); | ||
801 | signal_budget = exists && | ||
802 | budget_signalled(entry->scheduled) && | ||
803 | budget_exhausted(entry->scheduled) && | ||
804 | !sigbudget_sent(entry->scheduled); | ||
792 | np = exists && is_np(entry->scheduled); | 805 | np = exists && is_np(entry->scheduled); |
793 | sleep = exists && get_rt_flags(entry->scheduled) == RT_F_SLEEP; | 806 | sleep = exists && get_rt_flags(entry->scheduled) == RT_F_SLEEP; |
794 | preempt = entry->scheduled != entry->linked; | 807 | preempt = entry->scheduled != entry->linked; |
@@ -800,9 +813,9 @@ static struct task_struct* gsnedf_schedule(struct task_struct * prev) | |||
800 | /* | 813 | /* |
801 | if (exists) | 814 | if (exists) |
802 | TRACE_TASK(prev, | 815 | TRACE_TASK(prev, |
803 | "blocks:%d out_of_time:%d np:%d sleep:%d preempt:%d " | 816 | "blocks:%d out_of_time:%d signal_budget: %d np:%d sleep:%d preempt:%d " |
804 | "state:%d sig:%d\n", | 817 | "state:%d sig:%d\n", |
805 | blocks, out_of_time, np, sleep, preempt, | 818 | blocks, out_of_time, signal_budget, np, sleep, preempt, |
806 | prev->state, signal_pending(prev)); | 819 | prev->state, signal_pending(prev)); |
807 | */ | 820 | */ |
808 | 821 | ||
@@ -810,6 +823,10 @@ static struct task_struct* gsnedf_schedule(struct task_struct * prev) | |||
810 | TRACE_TASK(prev, "will be preempted by %s/%d\n", | 823 | TRACE_TASK(prev, "will be preempted by %s/%d\n", |
811 | entry->linked->comm, entry->linked->pid); | 824 | entry->linked->comm, entry->linked->pid); |
812 | 825 | ||
826 | /* Send the signal that the budget has been exhausted */ | ||
827 | if (signal_budget) | ||
828 | send_sigbudget(entry->scheduled); | ||
829 | |||
813 | /* If a task blocks we have no choice but to reschedule. | 830 | /* If a task blocks we have no choice but to reschedule. |
814 | */ | 831 | */ |
815 | if (blocks) { | 832 | if (blocks) { |
diff --git a/litmus/sched_pfp.c b/litmus/sched_pfp.c index 62be699629b1..6129eb94d3ea 100644 --- a/litmus/sched_pfp.c +++ b/litmus/sched_pfp.c | |||
@@ -135,17 +135,25 @@ static void pfp_tick(struct task_struct *t) | |||
135 | */ | 135 | */ |
136 | BUG_ON(is_realtime(t) && t != pfp->scheduled); | 136 | BUG_ON(is_realtime(t) && t != pfp->scheduled); |
137 | 137 | ||
138 | if (is_realtime(t) && budget_enforced(t) && budget_exhausted(t)) { | 138 | if (is_realtime(t) && budget_exhausted(t)) |
139 | if (!is_np(t)) { | 139 | { |
140 | litmus_reschedule_local(); | 140 | if (budget_signalled(t) && !sigbudget_sent(t)) { |
141 | TRACE("pfp_scheduler_tick: " | 141 | /* signal exhaustion */ |
142 | "%d is preemptable " | 142 | send_sigbudget(t); |
143 | " => FORCE_RESCHED\n", t->pid); | 143 | } |
144 | } else if (is_user_np(t)) { | 144 | |
145 | TRACE("pfp_scheduler_tick: " | 145 | if (budget_enforced(t)) { |
146 | "%d is non-preemptable, " | 146 | if (!is_np(t)) { |
147 | "preemption delayed.\n", t->pid); | 147 | litmus_reschedule_local(); |
148 | request_exit_np(t); | 148 | TRACE("pfp_scheduler_tick: " |
149 | "%d is preemptable " | ||
150 | " => FORCE_RESCHED\n", t->pid); | ||
151 | } else if (is_user_np(t)) { | ||
152 | TRACE("pfp_scheduler_tick: " | ||
153 | "%d is non-preemptable, " | ||
154 | "preemption delayed.\n", t->pid); | ||
155 | request_exit_np(t); | ||
156 | } | ||
149 | } | 157 | } |
150 | } | 158 | } |
151 | } | 159 | } |
@@ -155,7 +163,7 @@ static struct task_struct* pfp_schedule(struct task_struct * prev) | |||
155 | pfp_domain_t* pfp = local_pfp; | 163 | pfp_domain_t* pfp = local_pfp; |
156 | struct task_struct* next; | 164 | struct task_struct* next; |
157 | 165 | ||
158 | int out_of_time, sleep, preempt, np, exists, blocks, resched, migrate; | 166 | int out_of_time, signal_budget, sleep, preempt, np, exists, blocks, resched, migrate; |
159 | 167 | ||
160 | raw_spin_lock(&pfp->slock); | 168 | raw_spin_lock(&pfp->slock); |
161 | 169 | ||
@@ -172,6 +180,10 @@ static struct task_struct* pfp_schedule(struct task_struct * prev) | |||
172 | out_of_time = exists && | 180 | out_of_time = exists && |
173 | budget_enforced(pfp->scheduled) && | 181 | budget_enforced(pfp->scheduled) && |
174 | budget_exhausted(pfp->scheduled); | 182 | budget_exhausted(pfp->scheduled); |
183 | signal_budget = exists && | ||
184 | budget_signalled(pfp->scheduled) && | ||
185 | budget_exhausted(pfp->scheduled) && | ||
186 | !sigbudget_sent(pfp->scheduled); | ||
175 | np = exists && is_np(pfp->scheduled); | 187 | np = exists && is_np(pfp->scheduled); |
176 | sleep = exists && get_rt_flags(pfp->scheduled) == RT_F_SLEEP; | 188 | sleep = exists && get_rt_flags(pfp->scheduled) == RT_F_SLEEP; |
177 | migrate = exists && get_partition(pfp->scheduled) != pfp->cpu; | 189 | migrate = exists && get_partition(pfp->scheduled) != pfp->cpu; |
@@ -183,6 +195,10 @@ static struct task_struct* pfp_schedule(struct task_struct * prev) | |||
183 | */ | 195 | */ |
184 | resched = preempt; | 196 | resched = preempt; |
185 | 197 | ||
198 | /* Send the signal that the budget has been exhausted */ | ||
199 | if (signal_budget) | ||
200 | send_sigbudget(pfp->scheduled); | ||
201 | |||
186 | /* If a task blocks we have no choice but to reschedule. | 202 | /* If a task blocks we have no choice but to reschedule. |
187 | */ | 203 | */ |
188 | if (blocks) | 204 | if (blocks) |
diff --git a/litmus/sched_psn_edf.c b/litmus/sched_psn_edf.c index b0c8126bd44a..a5fda133bad9 100644 --- a/litmus/sched_psn_edf.c +++ b/litmus/sched_psn_edf.c | |||
@@ -169,17 +169,25 @@ static void psnedf_tick(struct task_struct *t) | |||
169 | */ | 169 | */ |
170 | BUG_ON(is_realtime(t) && t != pedf->scheduled); | 170 | BUG_ON(is_realtime(t) && t != pedf->scheduled); |
171 | 171 | ||
172 | if (is_realtime(t) && budget_enforced(t) && budget_exhausted(t)) { | 172 | if (is_realtime(t) && budget_exhausted(t)) |
173 | if (!is_np(t)) { | 173 | { |
174 | litmus_reschedule_local(); | 174 | if (budget_signalled(t) && !sigbudget_sent(t)) { |
175 | TRACE("psnedf_scheduler_tick: " | 175 | /* signal exhaustion */ |
176 | "%d is preemptable " | 176 | send_sigbudget(t); |
177 | " => FORCE_RESCHED\n", t->pid); | 177 | } |
178 | } else if (is_user_np(t)) { | 178 | |
179 | TRACE("psnedf_scheduler_tick: " | 179 | if (budget_enforced(t)) { |
180 | "%d is non-preemptable, " | 180 | if (!is_np(t)) { |
181 | "preemption delayed.\n", t->pid); | 181 | litmus_reschedule_local(); |
182 | request_exit_np(t); | 182 | TRACE("psnedf_scheduler_tick: " |
183 | "%d is preemptable " | ||
184 | " => FORCE_RESCHED\n", t->pid); | ||
185 | } else if (is_user_np(t)) { | ||
186 | TRACE("psnedf_scheduler_tick: " | ||
187 | "%d is non-preemptable, " | ||
188 | "preemption delayed.\n", t->pid); | ||
189 | request_exit_np(t); | ||
190 | } | ||
183 | } | 191 | } |
184 | } | 192 | } |
185 | } | 193 | } |
@@ -190,8 +198,7 @@ static struct task_struct* psnedf_schedule(struct task_struct * prev) | |||
190 | rt_domain_t* edf = &pedf->domain; | 198 | rt_domain_t* edf = &pedf->domain; |
191 | struct task_struct* next; | 199 | struct task_struct* next; |
192 | 200 | ||
193 | int out_of_time, sleep, preempt, | 201 | int out_of_time, signal_budget, sleep, preempt, np, exists, blocks, resched; |
194 | np, exists, blocks, resched; | ||
195 | 202 | ||
196 | raw_spin_lock(&pedf->slock); | 203 | raw_spin_lock(&pedf->slock); |
197 | 204 | ||
@@ -208,6 +215,10 @@ static struct task_struct* psnedf_schedule(struct task_struct * prev) | |||
208 | out_of_time = exists && | 215 | out_of_time = exists && |
209 | budget_enforced(pedf->scheduled) && | 216 | budget_enforced(pedf->scheduled) && |
210 | budget_exhausted(pedf->scheduled); | 217 | budget_exhausted(pedf->scheduled); |
218 | signal_budget = exists && | ||
219 | budget_signalled(pedf->scheduled) && | ||
220 | budget_exhausted(pedf->scheduled) && | ||
221 | !sigbudget_sent(pedf->scheduled); | ||
211 | np = exists && is_np(pedf->scheduled); | 222 | np = exists && is_np(pedf->scheduled); |
212 | sleep = exists && get_rt_flags(pedf->scheduled) == RT_F_SLEEP; | 223 | sleep = exists && get_rt_flags(pedf->scheduled) == RT_F_SLEEP; |
213 | preempt = edf_preemption_needed(edf, prev); | 224 | preempt = edf_preemption_needed(edf, prev); |
@@ -218,6 +229,10 @@ static struct task_struct* psnedf_schedule(struct task_struct * prev) | |||
218 | */ | 229 | */ |
219 | resched = preempt; | 230 | resched = preempt; |
220 | 231 | ||
232 | /* Send the signal that the budget has been exhausted */ | ||
233 | if (signal_budget) | ||
234 | send_sigbudget(pedf->scheduled); | ||
235 | |||
221 | /* If a task blocks we have no choice but to reschedule. | 236 | /* If a task blocks we have no choice but to reschedule. |
222 | */ | 237 | */ |
223 | if (blocks) | 238 | if (blocks) |