Skip to content

Commit

Permalink
Merge tag 'pm+acpi-4.0-rc8' of git://git.kernel.org/pub/scm/linux/ker…
Browse files Browse the repository at this point in the history
…nel/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
  • Loading branch information
torvalds committed Apr 10, 2015
2 parents 3cfb2f7 + b2d5fb9 commit e5e02de
Show file tree
Hide file tree
Showing 6 changed files with 16 additions and 35 deletions.
2 changes: 1 addition & 1 deletion drivers/acpi/processor_idle.c
Original file line number Diff line number Diff line change
Expand Up @@ -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';
}
Expand Down
19 changes: 11 additions & 8 deletions drivers/cpufreq/cpufreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/**
Expand Down
3 changes: 0 additions & 3 deletions drivers/cpuidle/cpuidle.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
5 changes: 3 additions & 2 deletions drivers/cpuidle/sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

Expand Down
1 change: 0 additions & 1 deletion include/linux/cpuidle.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
21 changes: 1 addition & 20 deletions kernel/power/snapshot.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit e5e02de

Please sign in to comment.