Skip to content
  • Oleg Nesterov's avatar
    kthread: Don't use to_live_kthread() in kthread_[un]park() · cf380a4a
    Oleg Nesterov authored
    
    
    Now that to_kthread() is always validm change kthread_park() and
    kthread_unpark() to use it and kill to_live_kthread().
    
    The conversion of kthread_unpark() is trivial. If KTHREAD_IS_PARKED is set
    then the task has called complete(&self->parked) and there the function
    cannot race against a concurrent kthread_stop() and exit.
    
    kthread_park() is more tricky, because its semantics are not well
    defined. It returns -ENOSYS if the thread exited but this can never happen
    and as Roman pointed out kthread_park() can obviously block forever if it
    would race with the exiting kthread.
    
    The usage of kthread_park() in cpuhp code (cpu.c, smpboot.c, stop_machine.c)
    is fine. It can never see an exiting/exited kthread, smpboot_destroy_threads()
    clears *ht->store, smpboot_park_thread() checks it is not NULL under the same
    smpboot_threads_lock. cpuhp_threads and cpu_stop_threads never exit, so other
    callers are fine too.
    
    But it has two more users:
    
    - watchdog_park_threads():
    
      The code is actually correct, get_online_cpus() ensures that
      kthread_park() can't race with itself (note that kthread_park() can't
      handle this race correctly), but it should not use kthread_park()
      directly.
    
    - drivers/gpu/drm/amd/scheduler/gpu_scheduler.c should not use
      kthread_park() either.
    
      kthread_park() must not be called after amd_sched_fini() which does
      kthread_stop(), otherwise even to_live_kthread() is not safe because
      task_struct can be already freed and sched->thread can point to nowhere.
    
    The usage of kthread_park/unpark should either be restricted to core code
    which is properly protected against the exit race or made more robust so it
    is safe to use it in drivers.
    
    To catch eventual exit issues, add a WARN_ON(PF_EXITING) for now.
    
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Chunming Zhou <David1.Zhou@amd.com>
    Cc: Roman Pen <roman.penyaev@profitbricks.com>
    Cc: Petr Mladek <pmladek@suse.com>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Alex Deucher <alexander.deucher@amd.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Link: http://lkml.kernel.org/r/20161129175107.GA5339@redhat.com
    
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    cf380a4a