Merge tag 'pm-extra-4.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull more power management updates deom Rafael Wysocki: "These fix two bugs introduced by recent power management updates (in the cpuidle menu governor and intel_pstate) and a few other issues, clean up things and remove unused code. Specifics: - Fix for a cpuidle menu governor problem that started to take an unnecessary spinlock after one of the recent updates and that did not play well with the RT patch (Rafael Wysocki). - Fix for the new intel_pstate operation mode switching feature added recently that did not reinitialize P-state limits properly when switching operation modes (Rafael Wysocki). - Removal of unused global notifiers from the PM QoS framework (Viresh Kumar). - Generic power domains framework update to make it handle asynchronous invocations of PM callbacks in the "noirq" phases of system suspend/hibernation correctly (Ulf Hansson). - Two hibernation core cleanups (Rafael Wysocki). - intel_idle cleanup related to the sysfs interface (Len Brown). - Off-by-one bug fix in the OPP (Operating Performance Points) framework (Andrzej Hajda). - OPP framework's documentation fix (Viresh Kumar). - cpufreq qoriq driver cleanup (Tang Yuantian). - Fixes for typos in comments in the device runtime PM framework (Christophe Jaillet)" * tag 'pm-extra-4.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: PM / OPP: Documentation: Fix opp-microvolt in examples intel_idle: stop exposing platform acronyms in sysfs cpufreq: intel_pstate: Fix limits issue with operation mode switching PM / hibernate: Define pr_fmt() and use pr_*() instead of printk() PM / hibernate: Untangle power_down() cpuidle: menu: Avoid taking spinlock for accessing QoS values PM / QoS: Remove global notifiers PM / runtime: Fix some typos cpufreq: qoriq: clean up unused code PM / OPP: fix off-by-one bug in dev_pm_opp_get_max_volt_latency loop PM / Domains: Power off masters immediately in the power off sequence PM / Domains: Rename is_async to one_dev_on for genpd_power_off() PM / Domains: Move genpd_power_off() above genpd_power_on()
This commit is contained in:
@@ -10,6 +10,8 @@
|
||||
* This file is released under the GPLv2.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "PM: " fmt
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/syscalls.h>
|
||||
@@ -104,7 +106,7 @@ EXPORT_SYMBOL(system_entering_hibernation);
|
||||
#ifdef CONFIG_PM_DEBUG
|
||||
static void hibernation_debug_sleep(void)
|
||||
{
|
||||
printk(KERN_INFO "hibernation debug: Waiting for 5 seconds.\n");
|
||||
pr_info("hibernation debug: Waiting for 5 seconds.\n");
|
||||
mdelay(5000);
|
||||
}
|
||||
|
||||
@@ -250,10 +252,9 @@ void swsusp_show_speed(ktime_t start, ktime_t stop,
|
||||
centisecs = 1; /* avoid div-by-zero */
|
||||
k = nr_pages * (PAGE_SIZE / 1024);
|
||||
kps = (k * 100) / centisecs;
|
||||
printk(KERN_INFO "PM: %s %u kbytes in %u.%02u seconds (%u.%02u MB/s)\n",
|
||||
msg, k,
|
||||
centisecs / 100, centisecs % 100,
|
||||
kps / 1000, (kps % 1000) / 10);
|
||||
pr_info("%s %u kbytes in %u.%02u seconds (%u.%02u MB/s)\n",
|
||||
msg, k, centisecs / 100, centisecs % 100, kps / 1000,
|
||||
(kps % 1000) / 10);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -271,8 +272,7 @@ static int create_image(int platform_mode)
|
||||
|
||||
error = dpm_suspend_end(PMSG_FREEZE);
|
||||
if (error) {
|
||||
printk(KERN_ERR "PM: Some devices failed to power down, "
|
||||
"aborting hibernation\n");
|
||||
pr_err("Some devices failed to power down, aborting hibernation\n");
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -288,8 +288,7 @@ static int create_image(int platform_mode)
|
||||
|
||||
error = syscore_suspend();
|
||||
if (error) {
|
||||
printk(KERN_ERR "PM: Some system devices failed to power down, "
|
||||
"aborting hibernation\n");
|
||||
pr_err("Some system devices failed to power down, aborting hibernation\n");
|
||||
goto Enable_irqs;
|
||||
}
|
||||
|
||||
@@ -304,8 +303,8 @@ static int create_image(int platform_mode)
|
||||
restore_processor_state();
|
||||
trace_suspend_resume(TPS("machine_suspend"), PM_EVENT_HIBERNATE, false);
|
||||
if (error)
|
||||
printk(KERN_ERR "PM: Error %d creating hibernation image\n",
|
||||
error);
|
||||
pr_err("Error %d creating hibernation image\n", error);
|
||||
|
||||
if (!in_suspend) {
|
||||
events_check_enabled = false;
|
||||
clear_free_pages();
|
||||
@@ -432,8 +431,7 @@ static int resume_target_kernel(bool platform_mode)
|
||||
|
||||
error = dpm_suspend_end(PMSG_QUIESCE);
|
||||
if (error) {
|
||||
printk(KERN_ERR "PM: Some devices failed to power down, "
|
||||
"aborting resume\n");
|
||||
pr_err("Some devices failed to power down, aborting resume\n");
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -608,6 +606,22 @@ static void power_down(void)
|
||||
{
|
||||
#ifdef CONFIG_SUSPEND
|
||||
int error;
|
||||
|
||||
if (hibernation_mode == HIBERNATION_SUSPEND) {
|
||||
error = suspend_devices_and_enter(PM_SUSPEND_MEM);
|
||||
if (error) {
|
||||
hibernation_mode = hibernation_ops ?
|
||||
HIBERNATION_PLATFORM :
|
||||
HIBERNATION_SHUTDOWN;
|
||||
} else {
|
||||
/* Restore swap signature. */
|
||||
error = swsusp_unmark();
|
||||
if (error)
|
||||
pr_err("Swap will be unusable! Try swapon -a.\n");
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (hibernation_mode) {
|
||||
@@ -620,32 +634,13 @@ static void power_down(void)
|
||||
if (pm_power_off)
|
||||
kernel_power_off();
|
||||
break;
|
||||
#ifdef CONFIG_SUSPEND
|
||||
case HIBERNATION_SUSPEND:
|
||||
error = suspend_devices_and_enter(PM_SUSPEND_MEM);
|
||||
if (error) {
|
||||
if (hibernation_ops)
|
||||
hibernation_mode = HIBERNATION_PLATFORM;
|
||||
else
|
||||
hibernation_mode = HIBERNATION_SHUTDOWN;
|
||||
power_down();
|
||||
}
|
||||
/*
|
||||
* Restore swap signature.
|
||||
*/
|
||||
error = swsusp_unmark();
|
||||
if (error)
|
||||
printk(KERN_ERR "PM: Swap will be unusable! "
|
||||
"Try swapon -a.\n");
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
kernel_halt();
|
||||
/*
|
||||
* Valid image is on the disk, if we continue we risk serious data
|
||||
* corruption after resume.
|
||||
*/
|
||||
printk(KERN_CRIT "PM: Please power down manually\n");
|
||||
pr_crit("Power down manually\n");
|
||||
while (1)
|
||||
cpu_relax();
|
||||
}
|
||||
@@ -655,7 +650,7 @@ static int load_image_and_restore(void)
|
||||
int error;
|
||||
unsigned int flags;
|
||||
|
||||
pr_debug("PM: Loading hibernation image.\n");
|
||||
pr_debug("Loading hibernation image.\n");
|
||||
|
||||
lock_device_hotplug();
|
||||
error = create_basic_memory_bitmaps();
|
||||
@@ -667,7 +662,7 @@ static int load_image_and_restore(void)
|
||||
if (!error)
|
||||
hibernation_restore(flags & SF_PLATFORM_MODE);
|
||||
|
||||
printk(KERN_ERR "PM: Failed to load hibernation image, recovering.\n");
|
||||
pr_err("Failed to load hibernation image, recovering.\n");
|
||||
swsusp_free();
|
||||
free_basic_memory_bitmaps();
|
||||
Unlock:
|
||||
@@ -685,7 +680,7 @@ int hibernate(void)
|
||||
bool snapshot_test = false;
|
||||
|
||||
if (!hibernation_available()) {
|
||||
pr_debug("PM: Hibernation not available.\n");
|
||||
pr_debug("Hibernation not available.\n");
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
@@ -703,9 +698,9 @@ int hibernate(void)
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "PM: Syncing filesystems ... ");
|
||||
pr_info("Syncing filesystems ... \n");
|
||||
sys_sync();
|
||||
printk("done.\n");
|
||||
pr_info("done.\n");
|
||||
|
||||
error = freeze_processes();
|
||||
if (error)
|
||||
@@ -731,7 +726,7 @@ int hibernate(void)
|
||||
else
|
||||
flags |= SF_CRC32_MODE;
|
||||
|
||||
pr_debug("PM: writing image.\n");
|
||||
pr_debug("Writing image.\n");
|
||||
error = swsusp_write(flags);
|
||||
swsusp_free();
|
||||
if (!error) {
|
||||
@@ -743,7 +738,7 @@ int hibernate(void)
|
||||
in_suspend = 0;
|
||||
pm_restore_gfp_mask();
|
||||
} else {
|
||||
pr_debug("PM: Image restored successfully.\n");
|
||||
pr_debug("Image restored successfully.\n");
|
||||
}
|
||||
|
||||
Free_bitmaps:
|
||||
@@ -751,7 +746,7 @@ int hibernate(void)
|
||||
Thaw:
|
||||
unlock_device_hotplug();
|
||||
if (snapshot_test) {
|
||||
pr_debug("PM: Checking hibernation image\n");
|
||||
pr_debug("Checking hibernation image\n");
|
||||
error = swsusp_check();
|
||||
if (!error)
|
||||
error = load_image_and_restore();
|
||||
@@ -815,10 +810,10 @@ static int software_resume(void)
|
||||
goto Unlock;
|
||||
}
|
||||
|
||||
pr_debug("PM: Checking hibernation image partition %s\n", resume_file);
|
||||
pr_debug("Checking hibernation image partition %s\n", resume_file);
|
||||
|
||||
if (resume_delay) {
|
||||
printk(KERN_INFO "Waiting %dsec before reading resume device...\n",
|
||||
pr_info("Waiting %dsec before reading resume device ...\n",
|
||||
resume_delay);
|
||||
ssleep(resume_delay);
|
||||
}
|
||||
@@ -857,10 +852,10 @@ static int software_resume(void)
|
||||
}
|
||||
|
||||
Check_image:
|
||||
pr_debug("PM: Hibernation image partition %d:%d present\n",
|
||||
pr_debug("Hibernation image partition %d:%d present\n",
|
||||
MAJOR(swsusp_resume_device), MINOR(swsusp_resume_device));
|
||||
|
||||
pr_debug("PM: Looking for hibernation image.\n");
|
||||
pr_debug("Looking for hibernation image.\n");
|
||||
error = swsusp_check();
|
||||
if (error)
|
||||
goto Unlock;
|
||||
@@ -879,7 +874,7 @@ static int software_resume(void)
|
||||
goto Close_Finish;
|
||||
}
|
||||
|
||||
pr_debug("PM: Preparing processes for restore.\n");
|
||||
pr_debug("Preparing processes for restore.\n");
|
||||
error = freeze_processes();
|
||||
if (error)
|
||||
goto Close_Finish;
|
||||
@@ -892,7 +887,7 @@ static int software_resume(void)
|
||||
/* For success case, the suspend path will release the lock */
|
||||
Unlock:
|
||||
mutex_unlock(&pm_mutex);
|
||||
pr_debug("PM: Hibernation image not present or could not be loaded.\n");
|
||||
pr_debug("Hibernation image not present or could not be loaded.\n");
|
||||
return error;
|
||||
Close_Finish:
|
||||
swsusp_close(FMODE_READ);
|
||||
@@ -1016,7 +1011,7 @@ static ssize_t disk_store(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
error = -EINVAL;
|
||||
|
||||
if (!error)
|
||||
pr_debug("PM: Hibernation mode set to '%s'\n",
|
||||
pr_debug("Hibernation mode set to '%s'\n",
|
||||
hibernation_modes[mode]);
|
||||
unlock_system_sleep();
|
||||
return error ? error : n;
|
||||
@@ -1052,7 +1047,7 @@ static ssize_t resume_store(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
lock_system_sleep();
|
||||
swsusp_resume_device = res;
|
||||
unlock_system_sleep();
|
||||
printk(KERN_INFO "PM: Starting manual resume from disk\n");
|
||||
pr_info("Starting manual resume from disk\n");
|
||||
noresume = 0;
|
||||
software_resume();
|
||||
return n;
|
||||
|
Reference in New Issue
Block a user