aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorMåns Rullgård <mru@inprovide.com>2004-11-07 04:06:45 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-11-07 04:06:45 -0800
commit107e7ba54f5dcd12b5ddbd6a41cf7a9f08b0ea4e (patch)
tree96f4acd1a9498591d446247ceb6e963b6ee0c5a3 /kernel
parent4b44897435a4e907b87cb14501c04d593f2323d8 (diff)
downloadhistory-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.c32
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 */