aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/litmus/edf_common.h4
-rw-r--r--include/litmus/rt_domain.h33
2 files changed, 19 insertions, 18 deletions
diff --git a/include/litmus/edf_common.h b/include/litmus/edf_common.h
index f79bd76e17..37630e5c26 100644
--- a/include/litmus/edf_common.h
+++ b/include/litmus/edf_common.h
@@ -12,8 +12,8 @@
12#include <litmus/rt_domain.h> 12#include <litmus/rt_domain.h>
13 13
14 14
15void edf_domain_init(rt_domain_t* rt, check_resched_needed_t resched, 15void edf_domain_init(rt_domain_t* rt, check_resched_needed_t resched,
16 release_at_t release); 16 release_job_t release);
17 17
18int edf_higher_prio(struct task_struct* first, 18int edf_higher_prio(struct task_struct* first,
19 struct task_struct* second); 19 struct task_struct* second);
diff --git a/include/litmus/rt_domain.h b/include/litmus/rt_domain.h
index fd3c205bcc..7b2a11c0f2 100644
--- a/include/litmus/rt_domain.h
+++ b/include/litmus/rt_domain.h
@@ -5,14 +5,18 @@
5#ifndef __UNC_RT_DOMAIN_H__ 5#ifndef __UNC_RT_DOMAIN_H__
6#define __UNC_RT_DOMAIN_H__ 6#define __UNC_RT_DOMAIN_H__
7 7
8#include <linux/interrupt.h>
9
8struct _rt_domain; 10struct _rt_domain;
9 11
10typedef int (*check_resched_needed_t)(struct _rt_domain *rt); 12typedef int (*check_resched_needed_t)(struct _rt_domain *rt);
11typedef void (*release_at_t)(struct task_struct *t); 13typedef void (*release_job_t)(struct task_struct *t, struct _rt_domain *rt);
12 14
13typedef struct _rt_domain { 15typedef struct _rt_domain {
16 struct tasklet_struct release_tasklet;
17
14 /* runnable rt tasks are in here */ 18 /* runnable rt tasks are in here */
15 rwlock_t ready_lock; 19 spinlock_t ready_lock;
16 struct list_head ready_queue; 20 struct list_head ready_queue;
17 21
18 /* real-time tasks waiting for release are in here */ 22 /* real-time tasks waiting for release are in here */
@@ -22,8 +26,8 @@ typedef struct _rt_domain {
22 /* how do we check if we need to kick another CPU? */ 26 /* how do we check if we need to kick another CPU? */
23 check_resched_needed_t check_resched; 27 check_resched_needed_t check_resched;
24 28
25 /* how do we setup a job release? */ 29 /* how do we release a job? */
26 release_at_t setup_release; 30 release_job_t release_job;
27 31
28 /* how are tasks ordered in the ready queue? */ 32 /* how are tasks ordered in the ready queue? */
29 list_cmp_t order; 33 list_cmp_t order;
@@ -35,8 +39,9 @@ typedef struct _rt_domain {
35#define ready_jobs_pending(rt) \ 39#define ready_jobs_pending(rt) \
36 (!list_empty(&(rt)->ready_queue)) 40 (!list_empty(&(rt)->ready_queue))
37 41
38void rt_domain_init(rt_domain_t *rt, check_resched_needed_t f, 42void rt_domain_init(rt_domain_t *rt, list_cmp_t order,
39 release_at_t g, list_cmp_t order); 43 check_resched_needed_t check,
44 release_job_t relase);
40 45
41void __add_ready(rt_domain_t* rt, struct task_struct *new); 46void __add_ready(rt_domain_t* rt, struct task_struct *new);
42void __add_release(rt_domain_t* rt, struct task_struct *task); 47void __add_release(rt_domain_t* rt, struct task_struct *task);
@@ -44,16 +49,13 @@ void __add_release(rt_domain_t* rt, struct task_struct *task);
44struct task_struct* __take_ready(rt_domain_t* rt); 49struct task_struct* __take_ready(rt_domain_t* rt);
45struct task_struct* __peek_ready(rt_domain_t* rt); 50struct task_struct* __peek_ready(rt_domain_t* rt);
46 51
47void try_release_pending(rt_domain_t* rt);
48void __release_pending(rt_domain_t* rt);
49
50static inline void add_ready(rt_domain_t* rt, struct task_struct *new) 52static inline void add_ready(rt_domain_t* rt, struct task_struct *new)
51{ 53{
52 unsigned long flags; 54 unsigned long flags;
53 /* first we need the write lock for rt_ready_queue */ 55 /* first we need the write lock for rt_ready_queue */
54 write_lock_irqsave(&rt->ready_lock, flags); 56 spin_lock_irqsave(&rt->ready_lock, flags);
55 __add_ready(rt, new); 57 __add_ready(rt, new);
56 write_unlock_irqrestore(&rt->ready_lock, flags); 58 spin_unlock_irqrestore(&rt->ready_lock, flags);
57} 59}
58 60
59static inline struct task_struct* take_ready(rt_domain_t* rt) 61static inline struct task_struct* take_ready(rt_domain_t* rt)
@@ -61,9 +63,9 @@ static inline struct task_struct* take_ready(rt_domain_t* rt)
61 unsigned long flags; 63 unsigned long flags;
62 struct task_struct* ret; 64 struct task_struct* ret;
63 /* first we need the write lock for rt_ready_queue */ 65 /* first we need the write lock for rt_ready_queue */
64 write_lock_irqsave(&rt->ready_lock, flags); 66 spin_lock_irqsave(&rt->ready_lock, flags);
65 ret = __take_ready(rt); 67 ret = __take_ready(rt);
66 write_unlock_irqrestore(&rt->ready_lock, flags); 68 spin_unlock_irqrestore(&rt->ready_lock, flags);
67 return ret; 69 return ret;
68} 70}
69 71
@@ -87,11 +89,10 @@ static inline int jobs_pending(rt_domain_t* rt)
87 unsigned long flags; 89 unsigned long flags;
88 int ret; 90 int ret;
89 /* first we need the write lock for rt_ready_queue */ 91 /* first we need the write lock for rt_ready_queue */
90 read_lock_irqsave(&rt->ready_lock, flags); 92 spin_lock_irqsave(&rt->ready_lock, flags);
91 ret = __jobs_pending(rt); 93 ret = __jobs_pending(rt);
92 read_unlock_irqrestore(&rt->ready_lock, flags); 94 spin_unlock_irqrestore(&rt->ready_lock, flags);
93 return ret; 95 return ret;
94} 96}
95 97
96
97#endif 98#endif