Merge branches 'pm-sleep', 'pm-cpufreq' and 'pm-cpuidle'
* pm-sleep: Revert "PM / hibernate: avoid unsafe pages in e820 reserved regions" * pm-cpufreq: cpufreq: Schedule work for the first-online CPU on resume * pm-cpuidle: cpuidle: ACPI: do not overwrite name and description of C0 cpuidle: remove state_count field from struct cpuidle_device
This commit is contained in:
commit
b2d5fb97d3
@ -922,7 +922,7 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
drv->safe_state_index = -1;
|
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].name[0] = '\0';
|
||||||
drv->states[i].desc[0] = '\0';
|
drv->states[i].desc[0] = '\0';
|
||||||
}
|
}
|
||||||
|
@ -1698,15 +1698,18 @@ void cpufreq_resume(void)
|
|||||||
|| __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS))
|
|| __cpufreq_governor(policy, CPUFREQ_GOV_LIMITS))
|
||||||
pr_err("%s: Failed to start governor for policy: %p\n",
|
pr_err("%s: Failed to start governor for policy: %p\n",
|
||||||
__func__, policy);
|
__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)
|
if (!dev->registered)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!dev->state_count)
|
|
||||||
dev->state_count = drv->state_count;
|
|
||||||
|
|
||||||
ret = cpuidle_add_device_sysfs(dev);
|
ret = cpuidle_add_device_sysfs(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return 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);
|
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device);
|
||||||
|
|
||||||
/* state statistics */
|
/* 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);
|
kobj = kzalloc(sizeof(struct cpuidle_state_kobj), GFP_KERNEL);
|
||||||
if (!kobj)
|
if (!kobj)
|
||||||
goto error_state;
|
goto error_state;
|
||||||
@ -433,9 +433,10 @@ error_state:
|
|||||||
*/
|
*/
|
||||||
static void cpuidle_remove_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;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < device->state_count; i++)
|
for (i = 0; i < drv->state_count; i++)
|
||||||
cpuidle_free_state_kobj(device, i);
|
cpuidle_free_state_kobj(device, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,6 @@ struct cpuidle_device {
|
|||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
|
|
||||||
int last_residency;
|
int last_residency;
|
||||||
int state_count;
|
|
||||||
struct cpuidle_state_usage states_usage[CPUIDLE_STATE_MAX];
|
struct cpuidle_state_usage states_usage[CPUIDLE_STATE_MAX];
|
||||||
struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX];
|
struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX];
|
||||||
struct cpuidle_driver_kobj *kobj_driver;
|
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
|
* create_basic_memory_bitmaps - create bitmaps needed for marking page
|
||||||
* frames that should not be saved and free page frames. The pointers
|
* 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 {
|
do {
|
||||||
pfn = memory_bm_next_pfn(bm);
|
pfn = memory_bm_next_pfn(bm);
|
||||||
if (likely(pfn != BM_END_OF_MAP)) {
|
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));
|
swsusp_set_page_free(pfn_to_page(pfn));
|
||||||
else
|
else
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
Loading…
Reference in New Issue
Block a user