From fd3aa01f176cf12b1625f4f46ba01f3340bb57ed Mon Sep 17 00:00:00 2001 From: Glenn Elliott Date: Tue, 11 Sep 2012 19:36:11 -0400 Subject: blarg --- litmus/litmus.c | 109 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 87 insertions(+), 22 deletions(-) (limited to 'litmus') diff --git a/litmus/litmus.c b/litmus/litmus.c index 81384327e850..2300281b6b30 100644 --- a/litmus/litmus.c +++ b/litmus/litmus.c @@ -290,6 +290,60 @@ asmlinkage long sys_null_call(cycles_t __user *ts) return ret; } + + + + + + + + + +long __litmus_admit_task(struct task_struct* tsk); + +asmlinkage long sys_slave_non_rt_threads(void) +{ + long retval = 0; + struct task_struct *leader = current->group_leader; + struct task_struct *t; + struct task_struct *hp = NULL; + + read_lock_irq(&tasklist_lock); + + is_realtime(target) + + t = leader; + do { + TRACE_CUR("threads in %s/%d: %s/%d:\n", leader->comm, leader->pid, t->comm, t->pid); + + if (tsk_rt(t)->heap_node == NULL) { + retval = __litmus_admit_task(t); + + if (retval != 0) break; + + /* hasn't been admitted into rt. make it a slave. */ + tsk_rt(t)->slave = 1; + } + else if (is_realtime(t)) + if (litmus->compare(t, hp)) { + hp = t; + } + } + + t = next_thread(t); + } while(t != leader); + + if (hp) { + /* set up inheritance */ + + } + + read_unlock_irq(&tasklist_lock); + + return 0; +} + + /* p is a real-time task. Re-init its state as a best-effort task. */ static void reinit_litmus_state(struct task_struct* p, int restore) { @@ -318,32 +372,11 @@ static void reinit_litmus_state(struct task_struct* p, int restore) } } -long litmus_admit_task(struct task_struct* tsk) +long __litmus_admit_task(struct task_struct* tsk) { long retval = 0; unsigned long flags; - BUG_ON(is_realtime(tsk)); - - if (get_rt_relative_deadline(tsk) == 0 || - get_exec_cost(tsk) > - min(get_rt_relative_deadline(tsk), get_rt_period(tsk)) ) { - TRACE_TASK(tsk, - "litmus admit: invalid task parameters " - "(e = %lu, p = %lu, d = %lu)\n", - get_exec_cost(tsk), get_rt_period(tsk), - get_rt_relative_deadline(tsk)); - retval = -EINVAL; - goto out; - } - - if (!cpu_online(get_partition(tsk))) { - TRACE_TASK(tsk, "litmus admit: cpu %d is not online\n", - get_partition(tsk)); - retval = -EINVAL; - goto out; - } - INIT_LIST_HEAD(&tsk_rt(tsk)->list); /* avoid scheduler plugin changing underneath us */ @@ -375,6 +408,38 @@ long litmus_admit_task(struct task_struct* tsk) out_unlock: raw_spin_unlock_irqrestore(&task_transition_lock, flags); + + return retval; +} + +long litmus_admit_task(struct task_struct* tsk) +{ + long retval = 0; + unsigned long flags; + + BUG_ON(is_realtime(tsk)); + + if (get_rt_relative_deadline(tsk) == 0 || + get_exec_cost(tsk) > + min(get_rt_relative_deadline(tsk), get_rt_period(tsk)) ) { + TRACE_TASK(tsk, + "litmus admit: invalid task parameters " + "(e = %lu, p = %lu, d = %lu)\n", + get_exec_cost(tsk), get_rt_period(tsk), + get_rt_relative_deadline(tsk)); + retval = -EINVAL; + goto out; + } + + if (!cpu_online(get_partition(tsk))) { + TRACE_TASK(tsk, "litmus admit: cpu %d is not online\n", + get_partition(tsk)); + retval = -EINVAL; + goto out; + } + + retval = __litmus_admit_task(tsk); + out: return retval; } -- cgit v1.2.2