diff options
| author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2008-05-02 20:51:29 -0400 |
|---|---|---|
| committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2008-05-02 20:51:29 -0400 |
| commit | a1f204ec33f806c6db8a4bfe6cc1a1e6109e8ef8 (patch) | |
| tree | 0c501aea2199e0c3af478150cb33dcd1f779206d /include | |
| parent | 2f030cd48bbdfc6f4155c38684d0e8b98195f4f5 (diff) | |
LITMUS: rework rt_domain to not cause circular lockig dependencies
Diffstat (limited to 'include')
| -rw-r--r-- | include/litmus/edf_common.h | 4 | ||||
| -rw-r--r-- | include/litmus/rt_domain.h | 33 |
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 | ||
| 15 | void edf_domain_init(rt_domain_t* rt, check_resched_needed_t resched, | 15 | void edf_domain_init(rt_domain_t* rt, check_resched_needed_t resched, |
| 16 | release_at_t release); | 16 | release_job_t release); |
| 17 | 17 | ||
| 18 | int edf_higher_prio(struct task_struct* first, | 18 | int 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 | |||
| 8 | struct _rt_domain; | 10 | struct _rt_domain; |
| 9 | 11 | ||
| 10 | typedef int (*check_resched_needed_t)(struct _rt_domain *rt); | 12 | typedef int (*check_resched_needed_t)(struct _rt_domain *rt); |
| 11 | typedef void (*release_at_t)(struct task_struct *t); | 13 | typedef void (*release_job_t)(struct task_struct *t, struct _rt_domain *rt); |
| 12 | 14 | ||
| 13 | typedef struct _rt_domain { | 15 | typedef 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 | ||
| 38 | void rt_domain_init(rt_domain_t *rt, check_resched_needed_t f, | 42 | void 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 | ||
| 41 | void __add_ready(rt_domain_t* rt, struct task_struct *new); | 46 | void __add_ready(rt_domain_t* rt, struct task_struct *new); |
| 42 | void __add_release(rt_domain_t* rt, struct task_struct *task); | 47 | void __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); | |||
| 44 | struct task_struct* __take_ready(rt_domain_t* rt); | 49 | struct task_struct* __take_ready(rt_domain_t* rt); |
| 45 | struct task_struct* __peek_ready(rt_domain_t* rt); | 50 | struct task_struct* __peek_ready(rt_domain_t* rt); |
| 46 | 51 | ||
| 47 | void try_release_pending(rt_domain_t* rt); | ||
| 48 | void __release_pending(rt_domain_t* rt); | ||
| 49 | |||
| 50 | static inline void add_ready(rt_domain_t* rt, struct task_struct *new) | 52 | static 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 | ||
| 59 | static inline struct task_struct* take_ready(rt_domain_t* rt) | 61 | static 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 |
