• Oleg Nesterov's avatar
    kthreads: rework kthread_stop() · 63706172
    Oleg Nesterov authored
    Based on Eric's patch which in turn was based on my patch.
    
    kthread_stop() has the nasty problems:
    
    - it runs unpredictably long with the global semaphore held.
    
    - it deadlocks if kthread itself does kthread_stop() before it obeys
      the kthread_should_stop() request.
    
    - it is not useable if kthread exits on its own, see for example the
      ugly "wait_to_die:" hack in migration_thread()
    
    - it is not possible to just tell kthread it should stop, we must always
      wait for its exit.
    
    With this patch kthread() allocates all neccesary data (struct kthread) on
    its own stack, globals kthread_stop_xxx are deleted.  ->vfork_done is used
    as a pointer into "struct kthread", this means kthread_stop() can easily
    wait for kthread's exit.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Pavel Emelyanov <xemul@openvz.org>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Vitaliy Gusev <vgusev@openvz.org
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    63706172
kthread.c 6.72 KB