Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=051a1d1afa47206e23ae03f781c6795ce870e3d5
Commit:     051a1d1afa47206e23ae03f781c6795ce870e3d5
Parent:     c63a1190368771b8207d86c4217ae4afdf1cbd5e
Author:     Dmitry Adamushko <[EMAIL PROTECTED]>
AuthorDate: Tue Dec 18 15:21:13 2007 +0100
Committer:  Ingo Molnar <[EMAIL PROTECTED]>
CommitDate: Tue Dec 18 15:21:13 2007 +0100

    sched: fix crash on ia64, introduce task_current()
    
    Some services (e.g. sched_setscheduler(), rt_mutex_setprio() and
    sched_move_task()) must handle a given task differently in case it's the
    'rq->curr' task on its run-queue. The task_running() interface is not
    suitable for determining such tasks for platforms with one of the
    following options:
    
    #define __ARCH_WANT_UNLOCKED_CTXSW
    #define __ARCH_WANT_INTERRUPTS_ON_CTXSW
    
    Due to the fact that it makes use of 'p->oncpu == 1' as a criterion but
    such a task is not necessarily 'rq->curr'.
    
    The detailed explanation is available here:
    
https://lists.linux-foundation.org/pipermail/containers/2007-December/009262.html
    
    Signed-off-by: Dmitry Adamushko <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
    Tested-by: Dhaval Giani <[EMAIL PROTECTED]>
    Tested-by: KAMEZAWA Hiroyuki <[EMAIL PROTECTED]>
---
 kernel/sched.c |   17 +++++++++++------
 1 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/kernel/sched.c b/kernel/sched.c
index c6e551d..5ae0d42 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -508,10 +508,15 @@ EXPORT_SYMBOL_GPL(cpu_clock);
 # define finish_arch_switch(prev)      do { } while (0)
 #endif
 
+static inline int task_current(struct rq *rq, struct task_struct *p)
+{
+       return rq->curr == p;
+}
+
 #ifndef __ARCH_WANT_UNLOCKED_CTXSW
 static inline int task_running(struct rq *rq, struct task_struct *p)
 {
-       return rq->curr == p;
+       return task_current(rq, p);
 }
 
 static inline void prepare_lock_switch(struct rq *rq, struct task_struct *next)
@@ -540,7 +545,7 @@ static inline int task_running(struct rq *rq, struct 
task_struct *p)
 #ifdef CONFIG_SMP
        return p->oncpu;
 #else
-       return rq->curr == p;
+       return task_current(rq, p);
 #endif
 }
 
@@ -3334,7 +3339,7 @@ unsigned long long task_sched_runtime(struct task_struct 
*p)
 
        rq = task_rq_lock(p, &flags);
        ns = p->se.sum_exec_runtime;
-       if (rq->curr == p) {
+       if (task_current(rq, p)) {
                update_rq_clock(rq);
                delta_exec = rq->clock - p->se.exec_start;
                if ((s64)delta_exec > 0)
@@ -4021,7 +4026,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
 
        oldprio = p->prio;
        on_rq = p->se.on_rq;
-       running = task_running(rq, p);
+       running = task_current(rq, p);
        if (on_rq) {
                dequeue_task(rq, p, 0);
                if (running)
@@ -4332,7 +4337,7 @@ recheck:
        }
        update_rq_clock(rq);
        on_rq = p->se.on_rq;
-       running = task_running(rq, p);
+       running = task_current(rq, p);
        if (on_rq) {
                deactivate_task(rq, p, 0);
                if (running)
@@ -7101,7 +7106,7 @@ void sched_move_task(struct task_struct *tsk)
 
        update_rq_clock(rq);
 
-       running = task_running(rq, tsk);
+       running = task_current(rq, tsk);
        on_rq = tsk->se.on_rq;
 
        if (on_rq) {
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to