Skip to content
  • Rafael J. Wysocki's avatar
    PM: Do not hold dpm_list_mtx while disabling/enabling nonboot CPUs · 32bdfac5
    Rafael J. Wysocki authored
    We shouldn't hold dpm_list_mtx while executing
    [disable|enable]_nonboot_cpus(), because theoretically this may lead
    to a deadlock as shown by the following example (provided by Johannes
    Berg):
    
    CPU 3       CPU 2                     CPU 1
                                          suspend/hibernate
                something:
                rtnl_lock()               device_pm_lock()
                                           -> mutex_lock(&dpm_list_mtx)
    
                mutex_lock(&dpm_list_mtx)
    
    linkwatch_work
     -> rtnl_lock()
                                          disable_nonboot_cpus()
                                           -> flush CPU 3 workqueue
    
    Fortunately, device drivers are supposed to stop any activities that
    might lead to the registration of new device objects way before
    disable_nonboot_cpus() is called, so it shouldn't be necessary to
    hold dpm_list_mtx over the entire late part of device suspend and
    early part of device resume.
    
    Thus, during the late suspend and the early resume of devices acquire
    dpm_list_mtx only when dpm_list is going to be traversed and release
    it right after that.
    
    This patch is reported to fix the regressions tracked as
    http://bugzilla.kernel.org/show_bug.cgi?id=13245
    
    .
    
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Reported-by: default avatarMiles Lane <miles.lane@gmail.com>
    Tested-by: default avatarMing Lei <tom.leiming@gmail.com>
    32bdfac5