diff options
author | Måns Rullgård <mru@inprovide.com> | 2004-11-07 04:06:45 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-11-07 04:06:45 -0800 |
commit | 107e7ba54f5dcd12b5ddbd6a41cf7a9f08b0ea4e (patch) | |
tree | 96f4acd1a9498591d446247ceb6e963b6ee0c5a3 /kernel | |
parent | 4b44897435a4e907b87cb14501c04d593f2323d8 (diff) | |
download | history-107e7ba54f5dcd12b5ddbd6a41cf7a9f08b0ea4e.tar.gz |
[PATCH] SysRq-n changes RT tasks to normal
Teach sysrq-N to switch all rt-policy tasks to SCHED_OTHER. For recovering
from (and diagnosing) userspace bugs.
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 76d8d418eae35e..595348452a06d2 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -4607,3 +4607,35 @@ void __might_sleep(char *file, int line) } EXPORT_SYMBOL(__might_sleep); #endif + +#ifdef CONFIG_MAGIC_SYSRQ +void normalize_rt_tasks(void) +{ + struct task_struct *p; + prio_array_t *array; + unsigned long flags; + runqueue_t *rq; + + read_lock_irq(&tasklist_lock); + for_each_process (p) { + if (!rt_task(p)) + continue; + + rq = task_rq_lock(p, &flags); + + array = p->array; + if (array) + deactivate_task(p, task_rq(p)); + __setscheduler(p, SCHED_NORMAL, 0); + if (array) { + __activate_task(p, task_rq(p)); + resched_task(rq->curr); + } + + task_rq_unlock(rq, &flags); + } + read_unlock_irq(&tasklist_lock); +} + +EXPORT_SYMBOL(normalize_rt_tasks); +#endif /* CONFIG_MAGIC_SYSRQ */ |