aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/litmus/budget.h27
-rw-r--r--include/litmus/litmus.h6
-rw-r--r--include/litmus/locking.h8
-rw-r--r--include/litmus/rt_param.h30
-rw-r--r--include/litmus/sched_trace.h9
5 files changed, 60 insertions, 20 deletions
diff --git a/include/litmus/budget.h b/include/litmus/budget.h
index 2a3511245f7a..72f04777e0b0 100644
--- a/include/litmus/budget.h
+++ b/include/litmus/budget.h
@@ -54,15 +54,17 @@ struct enforcement_timer
54 54
55typedef void (*scheduled_t)(struct task_struct* t); 55typedef void (*scheduled_t)(struct task_struct* t);
56typedef void (*blocked_t)(struct task_struct* t); 56typedef void (*blocked_t)(struct task_struct* t);
57typedef void (*preempt_or_sleep_t)(struct task_struct* t); 57typedef void (*preempt_t)(struct task_struct* t);
58typedef void (*exhausted_t)(struct task_struct* t); 58typedef void (*sleep_t)(struct task_struct* t);
59typedef enum hrtimer_restart (*exhausted_t)(struct task_struct* t);
59typedef void (*exit_t)(struct task_struct* t); 60typedef void (*exit_t)(struct task_struct* t);
60 61
61struct budget_tracker_ops 62struct budget_tracker_ops
62{ 63{
63 scheduled_t on_scheduled; /* called from litmus_schedule(). */ 64 scheduled_t on_scheduled; /* called from litmus_schedule(). */
64 blocked_t on_blocked; /* called from plugin::schedule() */ 65 blocked_t on_blocked; /* called from plugin::schedule() */
65 preempt_or_sleep_t on_preempt_or_sleep; /* called from plugin::schedule() */ 66 preempt_t on_preempt; /* called from plugin::schedule() */
67 sleep_t on_sleep; /* called from plugin::schedule() */
66 68
67 exit_t on_exit; /* task exiting rt mode */ 69 exit_t on_exit; /* task exiting rt mode */
68 70
@@ -84,15 +86,30 @@ enum BT_FLAGS
84}; 86};
85 87
86/* Functions for simple DRAIN_SIMPLE policy common 88/* Functions for simple DRAIN_SIMPLE policy common
87 * to every scheduler. Scheduler must provided 89 * to every scheduler. Scheduler must provide
88 * implementation for simple_on_exhausted(). 90 * implementation for simple_on_exhausted().
89 */ 91 */
90void simple_on_scheduled(struct task_struct* t); 92void simple_on_scheduled(struct task_struct* t);
91void simple_on_blocked(struct task_struct* t); 93void simple_on_blocked(struct task_struct* t);
92void simple_on_preempt_or_sleep(struct task_struct* t); 94void simple_on_preempt(struct task_struct* t);
95void simple_on_sleep(struct task_struct* t);
93void simple_on_exit(struct task_struct* t); 96void simple_on_exit(struct task_struct* t);
94 97
95 98
99/* Functions for DRAIN_SOBLIV policy common
100 * to every scheduler. Scheduler must provide
101 * implementation for sobliv_on_exhausted().
102 *
103 * Limitation: Quantum budget tracking is unsupported.
104 */
105void sobliv_on_scheduled(struct task_struct* t);
106void sobliv_on_blocked(struct task_struct* t);
107void sobliv_on_sleep(struct task_struct* t);
108/* Use the DRAIN_SIMPLE implementations */
109#define sobliv_on_preempt simple_on_preempt
110#define sobliv_on_exit simple_on_exit
111
112
96void init_budget_tracker(struct budget_tracker* bt, 113void init_budget_tracker(struct budget_tracker* bt,
97 const struct budget_tracker_ops* ops); 114 const struct budget_tracker_ops* ops);
98 115
diff --git a/include/litmus/litmus.h b/include/litmus/litmus.h
index f6ea5f6e80ee..ce24e62eee81 100644
--- a/include/litmus/litmus.h
+++ b/include/litmus/litmus.h
@@ -70,7 +70,11 @@ void litmus_exit_task(struct task_struct *tsk);
70#define get_period(t) (tsk_rt(t)->task_params.period) 70#define get_period(t) (tsk_rt(t)->task_params.period)
71#define get_release(t) (tsk_rt(t)->job_params.release) 71#define get_release(t) (tsk_rt(t)->job_params.release)
72#define get_lateness(t) (tsk_rt(t)->job_params.lateness) 72#define get_lateness(t) (tsk_rt(t)->job_params.lateness)
73#define get_budget_timer(t) (tsk_rt(t)->job_params.budget_timer) 73#define get_backlog(t) (tsk_rt(t)->job_params.backlog)
74
75#define has_backlog(t) (get_backlog(t) != 0)
76
77#define get_budget_timer(t) (tsk_rt(t)->budget)
74 78
75#define effective_priority(t) ((!(tsk_rt(t)->inh_task)) ? t : tsk_rt(t)->inh_task) 79#define effective_priority(t) ((!(tsk_rt(t)->inh_task)) ? t : tsk_rt(t)->inh_task)
76#define base_priority(t) (t) 80#define base_priority(t) (t)
diff --git a/include/litmus/locking.h b/include/litmus/locking.h
index 3ae6692dbe95..962ad5e6726a 100644
--- a/include/litmus/locking.h
+++ b/include/litmus/locking.h
@@ -229,5 +229,13 @@ struct litmus_lock_ops {
229void suspend_for_lock(void); 229void suspend_for_lock(void);
230int wake_up_for_lock(struct task_struct* t); 230int wake_up_for_lock(struct task_struct* t);
231 231
232/* thread safe?? */
233#ifndef CONFIG_LITMUS_NESTED_LOCKING
234#define holds_locks(tsk) \
235 (tsk_rt(t)->num_locks_held || tsk_rt(t)->num_local_locks_held)
236#else
237#define holds_locks(tsk) \
238 (tsk_rt(t)->num_locks_held || tsk_rt(t)->num_local_locks_held || !binheap_empty(&tsk_rt(t)->hp_blocked_tasks))
232#endif 239#endif
233 240
241#endif
diff --git a/include/litmus/rt_param.h b/include/litmus/rt_param.h
index 887075b908ca..499ecd899fcd 100644
--- a/include/litmus/rt_param.h
+++ b/include/litmus/rt_param.h
@@ -257,6 +257,19 @@ struct rt_job {
257 * Increase this sequence number when a job is released. 257 * Increase this sequence number when a job is released.
258 */ 258 */
259 unsigned int job_no; 259 unsigned int job_no;
260
261 /* Increments each time a job is forced to complete by
262 * budget exhaustion. If a job completes without remaining
263 * budget, the next job will be early-released _without_
264 * pushing back its deadline. job_backlog is decremented once
265 * per early release. This behavior continues until
266 * backlog == 0.
267 */
268 unsigned int backlog;
269
270 /* denotes if the current job is a backlogged job that was caused
271 * by an earlier budget exhaustion */
272 unsigned int is_backlogged_job:1;
260}; 273};
261 274
262struct pfair_param; 275struct pfair_param;
@@ -387,6 +400,14 @@ struct rt_param {
387 unsigned int num_local_locks_held; 400 unsigned int num_local_locks_held;
388#endif 401#endif
389 402
403#ifdef CONFIG_LITMUS_NESTED_LOCKING
404 raw_spinlock_t hp_blocked_tasks_lock;
405 struct binheap hp_blocked_tasks;
406
407 /* pointer to lock upon which is currently blocked */
408 struct litmus_lock* blocked_lock;
409#endif
410
390 /* user controlled parameters */ 411 /* user controlled parameters */
391 struct rt_task task_params; 412 struct rt_task task_params;
392 413
@@ -401,15 +422,6 @@ struct rt_param {
401 */ 422 */
402 struct task_struct* inh_task; 423 struct task_struct* inh_task;
403 424
404#ifdef CONFIG_LITMUS_NESTED_LOCKING
405 raw_spinlock_t hp_blocked_tasks_lock;
406 struct binheap hp_blocked_tasks;
407
408 /* pointer to lock upon which is currently blocked */
409 struct litmus_lock* blocked_lock;
410#endif
411
412
413#ifdef CONFIG_REALTIME_AUX_TASKS 425#ifdef CONFIG_REALTIME_AUX_TASKS
414 unsigned int is_aux_task:1; 426 unsigned int is_aux_task:1;
415 unsigned int aux_ready:1; 427 unsigned int aux_ready:1;
diff --git a/include/litmus/sched_trace.h b/include/litmus/sched_trace.h
index 0785db39b2fc..9a7e6fa1e6b6 100644
--- a/include/litmus/sched_trace.h
+++ b/include/litmus/sched_trace.h
@@ -52,11 +52,10 @@ struct st_switch_away_data { /* A process was switched away from on a given CPU.
52 52
53struct st_completion_data { /* A job completed. */ 53struct st_completion_data { /* A job completed. */
54 u64 when; 54 u64 when;
55 u8 forced:1; /* Set to 1 if job overran and kernel advanced to the 55 u64 backlog_remaining:62;
56 * next task automatically; set to 0 otherwise. 56 u8 was_backlog_job:1;
57 */ 57 u8 forced:1; /* Set to 1 if job overran and kernel advanced to the
58 u8 __uflags:7; 58 * next task automatically; set to 0 otherwise. */
59 u8 __unused[7];
60} __attribute__((packed)); 59} __attribute__((packed));
61 60
62struct st_block_data { /* A task blocks. */ 61struct st_block_data { /* A task blocks. */