mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-08 15:04:45 +00:00
Power management and ACPI fixes for v4.0-rc8
- Revert a 3.17 hibernate commit that was supposed to fix an issue related to e820 reserved regions, but broke resume from hibernation on Lenovo x230 (Rafael J Wysocki). - Prevent the ACPI cpuidle driver from overwriting the name and description of the C0 state set by the core when the list of C-states changes (Thomas Schlichter). - Remove the no longer needed state_count field from struct cpuidle_device which prevents the list of C-states shown by the sysfs interface from becoming incorrect when the current number of them is different from the number of C-states on boot (Bartlomiej Zolnierkiewicz). - The cpufreq core updates the policy object of the only online CPU during system resume to make it reflect the current hardware state, but it always assumes that CPU to be CPU0 which need not be the case, so fix the code to avoid that assumption (Viresh Kumar). / -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABCAAGBQJVJvsIAAoJEILEb/54YlRx5XgP/RPowy2vnlT6ewkexjZWrCO8 mbcEiPrXSvebemYPUT0WWWChctBbvWUyWjOr9HLzJa1MpMtBzkyn4Av4ru/RlAgM aPqCLWLHudhSivz9h01Db1IVI091bZoYIT+bvyGMJEeka8dTyAX3xUKnobQJyc+8 Zd5lYvtYvilCN8QS9ejIFHvlgEsAA0tQ6UVf9shgHGGrC62nKDtzS6kxZikkatFp iUX86ziZXg9puKc2PRHAmuq1csOFuEfGevaGiLRp7CuTUtYMfvDANnYgT3CmZYXi qeu5ZVvyK6JfbC7i0eU4zx+6y5GicX47C5yatdmqywI7m+l0PbcuQ4Fu88znZ1uU EMMUiyoNhlGLNAuQzbCfNsKikPydhujSFt3FS/Li2yrdRmY3XLF75zDNY9e2sqW6 lIvonjqBVTiI8N6DLmBckQu2uxTKzt+rzCBoMj4WHZDcRNsxcHtXW6ZHYCZWw3t5 tCitjCUfedgfanZUNl/wB/+tc+OjJ4Z8l8JKaXdmAvRjzWoYigJg07AXyJJ7Ra3T VVo/aMwMuTF7dHxBwPdyKpcp6iHp50fr+0YLaIi8ec0MJf9W5w/kQ2oicAiXzMO8 kWlSJXRh6HL0R36Ky5EyOywlCz4oXlfwB+Ube5/jTkUshO9cBYcMVaCJal7F5LZl Wi/wqoxIS3HfOFRrYe01 =g0eu -----END PGP SIGNATURE----- Merge tag 'pm+acpi-4.0-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull power management and ACPI fixes from Rafael Wysocki: "These are stable-candidate fixes of some recently reported issues in the cpufreq core, cpuidle core, the ACPI cpuidle driver and the hibernate core. Specifics: - Revert a 3.17 hibernate commit that was supposed to fix an issue related to e820 reserved regions, but broke resume from hibernation on Lenovo x230 (Rafael J Wysocki). - Prevent the ACPI cpuidle driver from overwriting the name and description of the C0 state set by the core when the list of C-states changes (Thomas Schlichter). - Remove the no longer needed state_count field from struct cpuidle_device which prevents the list of C-states shown by the sysfs interface from becoming incorrect when the current number of them is different from the number of C-states on boot (Bartlomiej Zolnierkiewicz). - The cpufreq core updates the policy object of the only online CPU during system resume to make it reflect the current hardware state, but it always assumes that CPU to be CPU0 which need not be the case, so fix the code to avoid that assumption (Viresh Kumar)" * tag 'pm+acpi-4.0-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: Revert "PM / hibernate: avoid unsafe pages in e820 reserved regions" cpuidle: ACPI: do not overwrite name and description of C0 cpuidle: remove state_count field from struct cpuidle_device cpufreq: Schedule work for the first-online CPU on resume
This commit is contained in:
commit
e5e02de066
@ -922,7 +922,7 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr)
|
||||
return -EINVAL;
|
||||
|
||||
drv->safe_state_index = -1;
|
||||
for (i = 0; i < CPUIDLE_STATE_MAX; i++) {
|
||||
for (i = CPUIDLE_DRIVER_STATE_START; i < CPUIDLE_STATE_MAX; i++) {
|
||||
drv->states[i].name[0] = '\0';
|
||||
drv->states[i].desc[0] = '\0';
|
||||
}
|
||||
|
@ -1698,15 +1698,18 @@ void cpufreq_resume(void)
|
||||
|| __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS))
|
||||
pr_err("%s: Failed to start governor for policy: %p\n",
|
||||
__func__, policy);
|
||||
|
||||
/*
|
||||
* schedule call cpufreq_update_policy() for boot CPU, i.e. last
|
||||
* policy in list. It will verify that the current freq is in
|
||||
* sync with what we believe it to be.
|
||||
*/
|
||||
if (list_is_last(&policy->policy_list, &cpufreq_policy_list))
|
||||
schedule_work(&policy->update);
|
||||
}
|
||||
|
||||
/*
|
||||
* schedule call cpufreq_update_policy() for first-online CPU, as that
|
||||
* wouldn't be hotplugged-out on suspend. It will verify that the
|
||||
* current freq is in sync with what we believe it to be.
|
||||
*/
|
||||
policy = cpufreq_cpu_get_raw(cpumask_first(cpu_online_mask));
|
||||
if (WARN_ON(!policy))
|
||||
return;
|
||||
|
||||
schedule_work(&policy->update);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -330,9 +330,6 @@ int cpuidle_enable_device(struct cpuidle_device *dev)
|
||||
if (!dev->registered)
|
||||
return -EINVAL;
|
||||
|
||||
if (!dev->state_count)
|
||||
dev->state_count = drv->state_count;
|
||||
|
||||
ret = cpuidle_add_device_sysfs(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -401,7 +401,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device)
|
||||
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device);
|
||||
|
||||
/* state statistics */
|
||||
for (i = 0; i < device->state_count; i++) {
|
||||
for (i = 0; i < drv->state_count; i++) {
|
||||
kobj = kzalloc(sizeof(struct cpuidle_state_kobj), GFP_KERNEL);
|
||||
if (!kobj)
|
||||
goto error_state;
|
||||
@ -433,9 +433,10 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device)
|
||||
*/
|
||||
static void cpuidle_remove_state_sysfs(struct cpuidle_device *device)
|
||||
{
|
||||
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < device->state_count; i++)
|
||||
for (i = 0; i < drv->state_count; i++)
|
||||
cpuidle_free_state_kobj(device, i);
|
||||
}
|
||||
|
||||
|
@ -77,7 +77,6 @@ struct cpuidle_device {
|
||||
unsigned int cpu;
|
||||
|
||||
int last_residency;
|
||||
int state_count;
|
||||
struct cpuidle_state_usage states_usage[CPUIDLE_STATE_MAX];
|
||||
struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX];
|
||||
struct cpuidle_driver_kobj *kobj_driver;
|
||||
|
@ -955,25 +955,6 @@ static void mark_nosave_pages(struct memory_bitmap *bm)
|
||||
}
|
||||
}
|
||||
|
||||
static bool is_nosave_page(unsigned long pfn)
|
||||
{
|
||||
struct nosave_region *region;
|
||||
|
||||
list_for_each_entry(region, &nosave_regions, list) {
|
||||
if (pfn >= region->start_pfn && pfn < region->end_pfn) {
|
||||
pr_err("PM: %#010llx in e820 nosave region: "
|
||||
"[mem %#010llx-%#010llx]\n",
|
||||
(unsigned long long) pfn << PAGE_SHIFT,
|
||||
(unsigned long long) region->start_pfn << PAGE_SHIFT,
|
||||
((unsigned long long) region->end_pfn << PAGE_SHIFT)
|
||||
- 1);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* create_basic_memory_bitmaps - create bitmaps needed for marking page
|
||||
* frames that should not be saved and free page frames. The pointers
|
||||
@ -2042,7 +2023,7 @@ static int mark_unsafe_pages(struct memory_bitmap *bm)
|
||||
do {
|
||||
pfn = memory_bm_next_pfn(bm);
|
||||
if (likely(pfn != BM_END_OF_MAP)) {
|
||||
if (likely(pfn_valid(pfn)) && !is_nosave_page(pfn))
|
||||
if (likely(pfn_valid(pfn)))
|
||||
swsusp_set_page_free(pfn_to_page(pfn));
|
||||
else
|
||||
return -EFAULT;
|
||||
|
Loading…
Reference in New Issue
Block a user