• Rafael J. Wysocki's avatar
    PM: Handle device registrations during suspend/resume · 58aca232
    Rafael J. Wysocki authored
    Modify the PM core to protect its data structures, specifically the
    dpm_active list, from being corrupted if a child of the currently
    suspending device is registered concurrently with its ->suspend()
    callback.  In that case, since the new device (the child) is added
    to dpm_active after its parent, the PM core will attempt to
    suspend it after the parent, which is wrong.
    
    Introduce a new member of struct dev_pm_info, called 'sleeping',
    and use it to check if the parent of the device being added to
    dpm_active has been suspended, in which case the device registration
    fails.  Also, use 'sleeping' for checking if the ordering of devices
    on dpm_active is correct.
    
    Introduce variable 'all_sleeping' that will be set to 'true' once all
    devices have been suspended and make new device registrations fail
    until 'all_sleeping' is reset to 'false', in order to avoid having
    unsuspended devices around while the system is going into a sleep state.
    
    Remove pm_sleep_rwsem which is not necessary any more.
    
    Special thanks to Alan Stern for discussions and suggestions that
    lead to the creation of this patch.
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    Acked-by: default avatarPavel Machek <pavel@ucw.cz>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    58aca232
core.c 34.7 KB