From a8e79815372c8abafaf7b11e48be2990605b172c Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Mon, 15 Oct 2007 17:00:15 +0200 Subject: [PATCH] --- yaml --- r: 69119 b: refs/heads/master c: 3a5e4dc12f23fb96fafd4f5d0f61e6c3070f80a5 h: refs/heads/master i: 69117: bd8aba1b57775392ecb14289356ecbee3bd8bcb6 69115: 8fea1d33e225ef94b533ac45fa78218f0bef78ac 69111: 7dbb6b82cbb5cda54ae8e9176eb523e95e56528f 69103: 01e4181e5707ab853bc884daa9d60843f60f2fba 69087: 79260a9c59780e142ebbc78da799b199df57567c 69055: 84772f8a68a90846d7d56df7d17705a7d6efd929 68991: 1b003de91c3b59231f3a1f939807c14085198244 68863: faf47cd561796af837dbe965ae0dca77edeb444f 68607: 55b50b910eceaa64163a1eade6d44ed3fb21e653 v: v3 --- [refs] | 2 +- trunk/kernel/sched.c | 43 +++++++++++++++++++++++-------------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/[refs] b/[refs] index 5c256fea3f99..7879623b299a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8cbbe86dfcfd68ad69916164bdc838d9e09adca8 +refs/heads/master: 3a5e4dc12f23fb96fafd4f5d0f61e6c3070f80a5 diff --git a/trunk/kernel/sched.c b/trunk/kernel/sched.c index db88b5655aca..2c6295b395a9 100644 --- a/trunk/kernel/sched.c +++ b/trunk/kernel/sched.c @@ -75,6 +75,12 @@ unsigned long long __attribute__((weak)) sched_clock(void) return (unsigned long long)jiffies * (1000000000 / HZ); } +#ifdef CONFIG_SMP +#define is_migration_thread(p, rq) ((p) == (rq)->migration_thread) +#else +#define is_migration_thread(p, rq) 0 +#endif + /* * Convert user-nice values [ -20 ... 0 ... 19 ] * to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ], @@ -6532,12 +6538,25 @@ EXPORT_SYMBOL(__might_sleep); #endif #ifdef CONFIG_MAGIC_SYSRQ +static void normalize_task(struct rq *rq, struct task_struct *p) +{ + int on_rq; + update_rq_clock(rq); + on_rq = p->se.on_rq; + if (on_rq) + deactivate_task(rq, p, 0); + __setscheduler(rq, p, SCHED_NORMAL, 0); + if (on_rq) { + activate_task(rq, p, 0); + resched_task(rq->curr); + } +} + void normalize_rt_tasks(void) { struct task_struct *g, *p; unsigned long flags; struct rq *rq; - int on_rq; read_lock_irq(&tasklist_lock); do_each_thread(g, p) { @@ -6561,26 +6580,10 @@ void normalize_rt_tasks(void) spin_lock_irqsave(&p->pi_lock, flags); rq = __task_rq_lock(p); -#ifdef CONFIG_SMP - /* - * Do not touch the migration thread: - */ - if (p == rq->migration_thread) - goto out_unlock; -#endif - update_rq_clock(rq); - on_rq = p->se.on_rq; - if (on_rq) - deactivate_task(rq, p, 0); - __setscheduler(rq, p, SCHED_NORMAL, 0); - if (on_rq) { - activate_task(rq, p, 0); - resched_task(rq->curr); - } -#ifdef CONFIG_SMP - out_unlock: -#endif + if (!is_migration_thread(p, rq)) + normalize_task(rq, p); + __task_rq_unlock(rq); spin_unlock_irqrestore(&p->pi_lock, flags); } while_each_thread(g, p);