• Chen Yu's avatar
    kthread: Fix task state in kthread worker if being frozen · 6b9ccbc0
    Chen Yu authored
    When analyzing a kernel waring message, Peter pointed out that there is a race
    condition when the kworker is being frozen and falls into try_to_freeze() with
    TASK_INTERRUPTIBLE, which could trigger a might_sleep() warning in try_to_freeze().
    Although the root cause is not related to freeze()[1], it is still worthy to fix
    this issue ahead.
    
    One possible race scenario:
    
            CPU 0                                           CPU 1
            -----                                           -----
    
            // kthread_worker_fn
            set_current_state(TASK_INTERRUPTIBLE);
                                                           suspend_freeze_processes()
                                                             freeze_processes
                                                               static_branch_inc(&freezer_active);
                                                             freeze_kernel_threads
                                                               pm_nosig_freezing = true;
            if (work) { //false
              __set_current_state(TASK_RUNNING);
    
            } else if (!freezing(current)) //false, been frozen
    
                          freezing():
                          if (static_branch_unlikely(&freezer_active))
                            if (pm_nosig_freezing)
                              return true;
              schedule()
    	}
    
            // state is still TASK_INTERRUPTIBLE
            try_to_freeze()
              might_sleep() <--- warning
    
    Fix this by explicitly set the TASK_RUNNING before entering
    try_to_freeze().
    
    Fixes: b56c0d89 ("kthread: implement kthread_worker")
    Suggested-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Suggested-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarChen Yu <yu.c.chen@intel.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/lkml/Zs2ZoAcUsZMX2B%2FI@chenyu5-mobl2/ [1]
    6b9ccbc0
kthread.c 42.5 KB