• Kirill Tkhai's avatar
    sched: Teach scheduler to understand TASK_ON_RQ_MIGRATING state · cca26e80
    Kirill Tkhai authored
    This is a new p->on_rq state which will be used to indicate that a task
    is in a process of migrating between two RQs. It allows to get
    rid of double_rq_lock(), which we used to use to change a rq of
    a queued task before.
    
    Let's consider an example. To move a task between src_rq and
    dst_rq we will do the following:
    
    	raw_spin_lock(&src_rq->lock);
    	/* p is a task which is queued on src_rq */
    	p = ...;
    
    	dequeue_task(src_rq, p, 0);
    	p->on_rq = TASK_ON_RQ_MIGRATING;
    	set_task_cpu(p, dst_cpu);
    	raw_spin_unlock(&src_rq->lock);
    
        	/*
        	 * Both RQs are unlocked here.
        	 * Task p is dequeued from src_rq
        	 * but its on_rq value is not zero.
        	 */
    
    	raw_spin_lock(&dst_rq->lock);
    	p->on_rq = TASK_ON_RQ_QUEUED;
    	enqueue_task(dst_rq, p, 0);
    	raw_spin_unlock(&dst_rq->lock);
    
    While p->on_rq is TASK_ON_RQ_MIGRATING, task is considered as
    "migrating", and other parallel scheduler actions with it are
    not available to parallel callers. The parallel caller is
    spining till migration is completed.
    
    The unavailable actions are changing of cpu affinity, changing
    of priority etc, in other words all the functionality which used
    to require task_rq(p)->lock before (and related to the task).
    
    To implement TASK_ON_RQ_MIGRATING support we primarily are using
    the following fact. Most of scheduler users (from which we are
    protecting a migrating task) use task_rq_lock() and
    __task_rq_lock() to get the lock of task_rq(p). These primitives
    know that task's cpu may change, and they are spining while the
    lock of the right RQ is not held. We add one more condition into
    them, so they will be also spinning until the migration is
    finished.
    Signed-off-by: default avatarKirill Tkhai <ktkhai@parallels.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Paul Turner <pjt@google.com>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Mike Galbraith <umgwanakikbuti@gmail.com>
    Cc: Kirill Tkhai <tkhai@yandex.ru>
    Cc: Tim Chen <tim.c.chen@linux.intel.com>
    Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Link: http://lkml.kernel.org/r/1408528062.23412.88.camel@tkhaiSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    cca26e80
sched.h 40.3 KB