Merge branches 'pm-core', 'pm-domains', 'pm-sleep', 'acpi-pm' and 'pm-cpuidle'
Merge changes in the PM core, system-wide PM infrastructure, generic power domains (genpd) framework, ACPI PM infrastructure and cpuidle for 4.19. * pm-core: driver core: Add flag to autoremove device link on supplier unbind driver core: Rename flag AUTOREMOVE to AUTOREMOVE_CONSUMER * pm-domains: PM / Domains: Introduce dev_pm_domain_attach_by_name() PM / Domains: Introduce option to attach a device by name to genpd PM / Domains: dt: Add a power-domain-names property * pm-sleep: PM / reboot: Eliminate race between reboot and suspend PM / hibernate: Mark expected switch fall-through x86/power/hibernate_64: Remove VLA usage PM / hibernate: cast PAGE_SIZE to int when comparing with error code * acpi-pm: ACPI / PM: save NVS memory for ASUS 1025C laptop ACPI / PM: Default to s2idle in all machines supporting LP S0 * pm-cpuidle: ARM: cpuidle: silence error on driver registration failure
This commit is contained in:
@@ -15,7 +15,9 @@
|
||||
atomic_t system_freezing_cnt = ATOMIC_INIT(0);
|
||||
EXPORT_SYMBOL(system_freezing_cnt);
|
||||
|
||||
/* indicate whether PM freezing is in effect, protected by pm_mutex */
|
||||
/* indicate whether PM freezing is in effect, protected by
|
||||
* system_transition_mutex
|
||||
*/
|
||||
bool pm_freezing;
|
||||
bool pm_nosig_freezing;
|
||||
|
||||
|
@@ -338,7 +338,7 @@ static int create_image(int platform_mode)
|
||||
* hibernation_snapshot - Quiesce devices and create a hibernation image.
|
||||
* @platform_mode: If set, use platform driver to prepare for the transition.
|
||||
*
|
||||
* This routine must be called with pm_mutex held.
|
||||
* This routine must be called with system_transition_mutex held.
|
||||
*/
|
||||
int hibernation_snapshot(int platform_mode)
|
||||
{
|
||||
@@ -500,8 +500,9 @@ static int resume_target_kernel(bool platform_mode)
|
||||
* hibernation_restore - Quiesce devices and restore from a hibernation image.
|
||||
* @platform_mode: If set, use platform driver to prepare for the transition.
|
||||
*
|
||||
* This routine must be called with pm_mutex held. If it is successful, control
|
||||
* reappears in the restored target kernel in hibernation_snapshot().
|
||||
* This routine must be called with system_transition_mutex held. If it is
|
||||
* successful, control reappears in the restored target kernel in
|
||||
* hibernation_snapshot().
|
||||
*/
|
||||
int hibernation_restore(int platform_mode)
|
||||
{
|
||||
@@ -638,6 +639,7 @@ static void power_down(void)
|
||||
break;
|
||||
case HIBERNATION_PLATFORM:
|
||||
hibernation_platform_enter();
|
||||
/* Fall through */
|
||||
case HIBERNATION_SHUTDOWN:
|
||||
if (pm_power_off)
|
||||
kernel_power_off();
|
||||
@@ -805,13 +807,13 @@ static int software_resume(void)
|
||||
* name_to_dev_t() below takes a sysfs buffer mutex when sysfs
|
||||
* is configured into the kernel. Since the regular hibernate
|
||||
* trigger path is via sysfs which takes a buffer mutex before
|
||||
* calling hibernate functions (which take pm_mutex) this can
|
||||
* cause lockdep to complain about a possible ABBA deadlock
|
||||
* calling hibernate functions (which take system_transition_mutex)
|
||||
* this can cause lockdep to complain about a possible ABBA deadlock
|
||||
* which cannot happen since we're in the boot code here and
|
||||
* sysfs can't be invoked yet. Therefore, we use a subclass
|
||||
* here to avoid lockdep complaining.
|
||||
*/
|
||||
mutex_lock_nested(&pm_mutex, SINGLE_DEPTH_NESTING);
|
||||
mutex_lock_nested(&system_transition_mutex, SINGLE_DEPTH_NESTING);
|
||||
|
||||
if (swsusp_resume_device)
|
||||
goto Check_image;
|
||||
@@ -899,7 +901,7 @@ static int software_resume(void)
|
||||
atomic_inc(&snapshot_device_available);
|
||||
/* For success case, the suspend path will release the lock */
|
||||
Unlock:
|
||||
mutex_unlock(&pm_mutex);
|
||||
mutex_unlock(&system_transition_mutex);
|
||||
pm_pr_dbg("Hibernation image not present or could not be loaded.\n");
|
||||
return error;
|
||||
Close_Finish:
|
||||
|
@@ -15,17 +15,16 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/suspend.h>
|
||||
|
||||
#include "power.h"
|
||||
|
||||
DEFINE_MUTEX(pm_mutex);
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
||||
void lock_system_sleep(void)
|
||||
{
|
||||
current->flags |= PF_FREEZER_SKIP;
|
||||
mutex_lock(&pm_mutex);
|
||||
mutex_lock(&system_transition_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(lock_system_sleep);
|
||||
|
||||
@@ -37,8 +36,9 @@ void unlock_system_sleep(void)
|
||||
*
|
||||
* Reason:
|
||||
* Fundamentally, we just don't need it, because freezing condition
|
||||
* doesn't come into effect until we release the pm_mutex lock,
|
||||
* since the freezer always works with pm_mutex held.
|
||||
* doesn't come into effect until we release the
|
||||
* system_transition_mutex lock, since the freezer always works with
|
||||
* system_transition_mutex held.
|
||||
*
|
||||
* More importantly, in the case of hibernation,
|
||||
* unlock_system_sleep() gets called in snapshot_read() and
|
||||
@@ -47,7 +47,7 @@ void unlock_system_sleep(void)
|
||||
* enter the refrigerator, thus causing hibernation to lockup.
|
||||
*/
|
||||
current->flags &= ~PF_FREEZER_SKIP;
|
||||
mutex_unlock(&pm_mutex);
|
||||
mutex_unlock(&system_transition_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unlock_system_sleep);
|
||||
|
||||
|
@@ -556,7 +556,7 @@ static int enter_state(suspend_state_t state)
|
||||
} else if (!valid_state(state)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!mutex_trylock(&pm_mutex))
|
||||
if (!mutex_trylock(&system_transition_mutex))
|
||||
return -EBUSY;
|
||||
|
||||
if (state == PM_SUSPEND_TO_IDLE)
|
||||
@@ -590,7 +590,7 @@ static int enter_state(suspend_state_t state)
|
||||
pm_pr_dbg("Finishing wakeup.\n");
|
||||
suspend_finish();
|
||||
Unlock:
|
||||
mutex_unlock(&pm_mutex);
|
||||
mutex_unlock(&system_transition_mutex);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@@ -923,7 +923,7 @@ int swsusp_write(unsigned int flags)
|
||||
}
|
||||
memset(&snapshot, 0, sizeof(struct snapshot_handle));
|
||||
error = snapshot_read_next(&snapshot);
|
||||
if (error < PAGE_SIZE) {
|
||||
if (error < (int)PAGE_SIZE) {
|
||||
if (error >= 0)
|
||||
error = -EFAULT;
|
||||
|
||||
@@ -1483,7 +1483,7 @@ int swsusp_read(unsigned int *flags_p)
|
||||
|
||||
memset(&snapshot, 0, sizeof(struct snapshot_handle));
|
||||
error = snapshot_write_next(&snapshot);
|
||||
if (error < PAGE_SIZE)
|
||||
if (error < (int)PAGE_SIZE)
|
||||
return error < 0 ? error : -EFAULT;
|
||||
header = (struct swsusp_info *)data_of(snapshot);
|
||||
error = get_swap_reader(&handle, flags_p);
|
||||
|
@@ -216,7 +216,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (!mutex_trylock(&pm_mutex))
|
||||
if (!mutex_trylock(&system_transition_mutex))
|
||||
return -EBUSY;
|
||||
|
||||
lock_device_hotplug();
|
||||
@@ -394,7 +394,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
|
||||
}
|
||||
|
||||
unlock_device_hotplug();
|
||||
mutex_unlock(&pm_mutex);
|
||||
mutex_unlock(&system_transition_mutex);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
@@ -294,7 +294,7 @@ void kernel_power_off(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kernel_power_off);
|
||||
|
||||
static DEFINE_MUTEX(reboot_mutex);
|
||||
DEFINE_MUTEX(system_transition_mutex);
|
||||
|
||||
/*
|
||||
* Reboot system call: for obvious reasons only root may call it,
|
||||
@@ -338,7 +338,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
|
||||
if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)
|
||||
cmd = LINUX_REBOOT_CMD_HALT;
|
||||
|
||||
mutex_lock(&reboot_mutex);
|
||||
mutex_lock(&system_transition_mutex);
|
||||
switch (cmd) {
|
||||
case LINUX_REBOOT_CMD_RESTART:
|
||||
kernel_restart(NULL);
|
||||
@@ -389,7 +389,7 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&reboot_mutex);
|
||||
mutex_unlock(&system_transition_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user