diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2013-03-17 17:23:36 -0400 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2013-03-17 17:23:36 -0400 |
commit | 469aaad39c956446b8a31d351ee36bedd87ac18a (patch) | |
tree | 3e2864a01df8a04ab7a406342627d3dc850760af /include/litmus/rt_param.h | |
parent | 9374a7c30b6906d01c548833fb8a7b65ba4b5ccc (diff) |
Per-task budget high-resolution timers (hrtimers).
As a step towards implementing more complex budget tracking
method (ex. BWI, VXR, etc.), we need per-task budget trackers
because we may be required to drain budget from a task, even
while it is suspended or blocked.
This patch does:
1) Replaces the per-CPU hrtimers with per-task hrtimers.
2) Plugin architecture for different budget policies.
This patch creates three budget draining policies:
SIMPLE, SAWARE (suspension-aware), and SOBLIV (suspension-oblivious).
However, only SIMPLE is supported by this patch.
SIMPLE (default):
Budget drains while the task is scheduled. Budget is preserved
across self-suspensions (but not job completions, of course).
Only SIMPLE is supported in this patch. (Maintaining current Litmus
functionality.)
SAWARE:
Draining according to suspension-aware analysis. Budget should drain
whenever a task is among the top-m tasks in its cluster, where
m is the number of processors in said cluster. This draining should
happen whether or not the task is actually scheduled.
SOBLIV:
Draining according to suspension-oblivious analysis. Budget should
drain whenever the task is scheduled or suspended (but not due to
preemption). Exception: Draining should halt when we can prove that
the task is not among the top-m tasks blocked on the same lock (i.e.,
on the PQ in the OMLP-family locking protocols).
Diffstat (limited to 'include/litmus/rt_param.h')
-rw-r--r-- | include/litmus/rt_param.h | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h index bf0ee8dbae6e..887075b908ca 100644 --- a/include/litmus/rt_param.h +++ b/include/litmus/rt_param.h | |||
@@ -36,6 +36,14 @@ typedef enum { | |||
36 | } budget_policy_t; | 36 | } budget_policy_t; |
37 | 37 | ||
38 | typedef enum { | 38 | typedef enum { |
39 | /* all drain mechanisms are ignored if budget enforcement or signalling | ||
40 | is not in use. */ | ||
41 | DRAIN_SIMPLE, /* drains while task is linked */ | ||
42 | DRAIN_SAWARE, /* drains according to suspension-aware analysis */ | ||
43 | DRAIN_SOBLIV, /* drains according to suspension-obliv analysis */ | ||
44 | } budget_drain_policy_t; | ||
45 | |||
46 | typedef enum { | ||
39 | NO_SIGNALS, /* job receives no signals when it exhausts its budget */ | 47 | NO_SIGNALS, /* job receives no signals when it exhausts its budget */ |
40 | QUANTUM_SIGNALS, /* budget signals are only sent on quantum boundaries */ | 48 | QUANTUM_SIGNALS, /* budget signals are only sent on quantum boundaries */ |
41 | PRECISE_SIGNALS, /* budget signals are triggered with hrtimers */ | 49 | PRECISE_SIGNALS, /* budget signals are triggered with hrtimers */ |
@@ -132,6 +140,7 @@ struct rt_task { | |||
132 | unsigned int priority; | 140 | unsigned int priority; |
133 | task_class_t cls; | 141 | task_class_t cls; |
134 | budget_policy_t budget_policy; /* ignored by pfair */ | 142 | budget_policy_t budget_policy; /* ignored by pfair */ |
143 | budget_drain_policy_t drain_policy; | ||
135 | budget_signal_policy_t budget_signal_policy; /* currently ignored by pfair */ | 144 | budget_signal_policy_t budget_signal_policy; /* currently ignored by pfair */ |
136 | release_policy_t release_policy; | 145 | release_policy_t release_policy; |
137 | }; | 146 | }; |
@@ -213,8 +222,9 @@ struct control_page { | |||
213 | /* don't export internal data structures to user space (liblitmus) */ | 222 | /* don't export internal data structures to user space (liblitmus) */ |
214 | #ifdef __KERNEL__ | 223 | #ifdef __KERNEL__ |
215 | 224 | ||
216 | #include <litmus/binheap.h> | ||
217 | #include <linux/semaphore.h> | 225 | #include <linux/semaphore.h> |
226 | #include <litmus/budget.h> | ||
227 | #include <litmus/binheap.h> | ||
218 | 228 | ||
219 | #ifdef CONFIG_LITMUS_SOFTIRQD | 229 | #ifdef CONFIG_LITMUS_SOFTIRQD |
220 | #include <linux/interrupt.h> | 230 | #include <linux/interrupt.h> |
@@ -247,15 +257,8 @@ struct rt_job { | |||
247 | * Increase this sequence number when a job is released. | 257 | * Increase this sequence number when a job is released. |
248 | */ | 258 | */ |
249 | unsigned int job_no; | 259 | unsigned int job_no; |
250 | |||
251 | /* bits: | ||
252 | * 0th: Set if a budget exhaustion signal has already been sent for | ||
253 | * the current job. */ | ||
254 | unsigned long flags; | ||
255 | }; | 260 | }; |
256 | 261 | ||
257 | #define RT_JOB_SIG_BUDGET_SENT 0 | ||
258 | |||
259 | struct pfair_param; | 262 | struct pfair_param; |
260 | 263 | ||
261 | enum klmirqd_sem_status | 264 | enum klmirqd_sem_status |
@@ -278,12 +281,12 @@ typedef enum gpu_migration_dist | |||
278 | MIG_LAST = MIG_NONE | 281 | MIG_LAST = MIG_NONE |
279 | } gpu_migration_dist_t; | 282 | } gpu_migration_dist_t; |
280 | 283 | ||
281 | typedef struct feedback_est{ | 284 | typedef struct feedback_est |
285 | { | ||
282 | fp_t est; | 286 | fp_t est; |
283 | fp_t accum_err; | 287 | fp_t accum_err; |
284 | } feedback_est_t; | 288 | } feedback_est_t; |
285 | 289 | ||
286 | |||
287 | #define AVG_EST_WINDOW_SIZE 20 | 290 | #define AVG_EST_WINDOW_SIZE 20 |
288 | 291 | ||
289 | typedef int (*notify_rsrc_exit_t)(struct task_struct* tsk); | 292 | typedef int (*notify_rsrc_exit_t)(struct task_struct* tsk); |
@@ -417,7 +420,6 @@ struct rt_param { | |||
417 | struct binheap_node aux_task_owner_node; | 420 | struct binheap_node aux_task_owner_node; |
418 | #endif | 421 | #endif |
419 | 422 | ||
420 | |||
421 | #ifdef CONFIG_NP_SECTION | 423 | #ifdef CONFIG_NP_SECTION |
422 | /* For the FMLP under PSN-EDF, it is required to make the task | 424 | /* For the FMLP under PSN-EDF, it is required to make the task |
423 | * non-preemptive from kernel space. In order not to interfere with | 425 | * non-preemptive from kernel space. In order not to interfere with |
@@ -427,6 +429,8 @@ struct rt_param { | |||
427 | unsigned int kernel_np; | 429 | unsigned int kernel_np; |
428 | #endif | 430 | #endif |
429 | 431 | ||
432 | struct budget_tracker budget; | ||
433 | |||
430 | /* This field can be used by plugins to store where the task | 434 | /* This field can be used by plugins to store where the task |
431 | * is currently scheduled. It is the responsibility of the | 435 | * is currently scheduled. It is the responsibility of the |
432 | * plugin to avoid race conditions. | 436 | * plugin to avoid race conditions. |