• T
    kthread: Prevent unpark race which puts threads on the wrong cpu · f2530dc7
    Thomas Gleixner 提交于
    The smpboot threads rely on the park/unpark mechanism which binds per
    cpu threads on a particular core. Though the functionality is racy:
    
    CPU0	       	 	CPU1  	     	    CPU2
    unpark(T)				    wake_up_process(T)
      clear(SHOULD_PARK)	T runs
    			leave parkme() due to !SHOULD_PARK  
      bind_to(CPU2)		BUG_ON(wrong CPU)						    
    
    We cannot let the tasks move themself to the target CPU as one of
    those tasks is actually the migration thread itself, which requires
    that it starts running on the target cpu right away.
    
    The solution to this problem is to prevent wakeups in park mode which
    are not from unpark(). That way we can guarantee that the association
    of the task to the target cpu is working correctly.
    
    Add a new task state (TASK_PARKED) which prevents other wakeups and
    use this state explicitly for the unpark wakeup.
    
    Peter noticed: Also, since the task state is visible to userspace and
    all the parked tasks are still in the PID space, its a good hint in ps
    and friends that these tasks aren't really there for the moment.
    
    The migration thread has another related issue.
    
    CPU0	      	     	 CPU1
    Bring up CPU2
    create_thread(T)
    park(T)
     wait_for_completion()
    			 parkme()
    			 complete()
    sched_set_stop_task()
    			 schedule(TASK_PARKED)
    
    The sched_set_stop_task() call is issued while the task is on the
    runqueue of CPU1 and that confuses the hell out of the stop_task class
    on that cpu. So we need the same synchronizaion before
    sched_set_stop_task().
    Reported-by: NDave Jones <davej@redhat.com>
    Reported-and-tested-by: NDave Hansen <dave@sr71.net>
    Reported-and-tested-by: NBorislav Petkov <bp@alien8.de>
    Acked-by: NPeter Ziljstra <peterz@infradead.org>
    Cc: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
    Cc: dhillf@gmail.com
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/alpine.LFD.2.02.1304091635430.21884@ionosSigned-off-by: NThomas Gleixner <tglx@linutronix.de>
    f2530dc7
kthread.c 17.0 KB