Commit 7dee8dff authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pm+acpi-3.12-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI and power management fixes from Rafael Wysocki:

 - The resume part of user space driven hibernation (s2disk) is now
   broken after the change that moved the creation of memory bitmaps to
   after the freezing of tasks, because I forgot that the resume utility
   loaded the image before freezing tasks and needed the bitmaps for
   that.  The fix adds special handling for that case.

 - One of recent commits changed the export of acpi_bus_get_device() to
   EXPORT_SYMBOL_GPL(), which was technically correct but broke existing
   binary modules using that function including one in particularly
   widespread use.  Change it back to EXPORT_SYMBOL().

 - The intel_pstate driver sometimes fails to disable turbo if its
   no_turbo sysfs attribute is set.  Fix from Srinivas Pandruvada.

 - One of recent cpufreq fixes forgot to update a check in cpufreq-cpu0
   which still (incorrectly) treats non-NULL as non-error.  Fix from
   Philipp Zabel.

 - The SPEAr cpufreq driver uses a wrong variable type in one place
   preventing it from catching errors returned by one of the functions
   called by it.  Fix from Sachin Kamat.

* tag 'pm+acpi-3.12-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI: Use EXPORT_SYMBOL() for acpi_bus_get_device()
  intel_pstate: fix no_turbo
  cpufreq: cpufreq-cpu0: NULL is a valid regulator, part 2
  cpufreq: SPEAr: Fix incorrect variable type
  PM / hibernate: Fix user space driven resume regression
parents 3dbecf0a 726dcbe5
...@@ -968,7 +968,7 @@ int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device) ...@@ -968,7 +968,7 @@ int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device)
} }
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(acpi_bus_get_device); EXPORT_SYMBOL(acpi_bus_get_device);
int acpi_device_add(struct acpi_device *device, int acpi_device_add(struct acpi_device *device,
void (*release)(struct device *)) void (*release)(struct device *))
......
...@@ -229,7 +229,7 @@ static int cpu0_cpufreq_probe(struct platform_device *pdev) ...@@ -229,7 +229,7 @@ static int cpu0_cpufreq_probe(struct platform_device *pdev)
if (of_property_read_u32(np, "clock-latency", &transition_latency)) if (of_property_read_u32(np, "clock-latency", &transition_latency))
transition_latency = CPUFREQ_ETERNAL; transition_latency = CPUFREQ_ETERNAL;
if (cpu_reg) { if (!IS_ERR(cpu_reg)) {
struct opp *opp; struct opp *opp;
unsigned long min_uV, max_uV; unsigned long min_uV, max_uV;
int i; int i;
......
...@@ -394,7 +394,10 @@ static void intel_pstate_set_pstate(struct cpudata *cpu, int pstate) ...@@ -394,7 +394,10 @@ static void intel_pstate_set_pstate(struct cpudata *cpu, int pstate)
trace_cpu_frequency(pstate * 100000, cpu->cpu); trace_cpu_frequency(pstate * 100000, cpu->cpu);
cpu->pstate.current_pstate = pstate; cpu->pstate.current_pstate = pstate;
wrmsrl(MSR_IA32_PERF_CTL, pstate << 8); if (limits.no_turbo)
wrmsrl(MSR_IA32_PERF_CTL, BIT(32) | (pstate << 8));
else
wrmsrl(MSR_IA32_PERF_CTL, pstate << 8);
} }
......
...@@ -113,7 +113,7 @@ static int spear_cpufreq_target(struct cpufreq_policy *policy, ...@@ -113,7 +113,7 @@ static int spear_cpufreq_target(struct cpufreq_policy *policy,
unsigned int target_freq, unsigned int relation) unsigned int target_freq, unsigned int relation)
{ {
struct cpufreq_freqs freqs; struct cpufreq_freqs freqs;
unsigned long newfreq; long newfreq;
struct clk *srcclk; struct clk *srcclk;
int index, ret, mult = 1; int index, ret, mult = 1;
......
...@@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void) ...@@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void)
struct memory_bitmap *bm1, *bm2; struct memory_bitmap *bm1, *bm2;
int error = 0; int error = 0;
BUG_ON(forbidden_pages_map || free_pages_map); if (forbidden_pages_map && free_pages_map)
return 0;
else
BUG_ON(forbidden_pages_map || free_pages_map);
bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL); bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL);
if (!bm1) if (!bm1)
......
...@@ -39,6 +39,7 @@ static struct snapshot_data { ...@@ -39,6 +39,7 @@ static struct snapshot_data {
char frozen; char frozen;
char ready; char ready;
char platform_support; char platform_support;
bool free_bitmaps;
} snapshot_state; } snapshot_state;
atomic_t snapshot_device_available = ATOMIC_INIT(1); atomic_t snapshot_device_available = ATOMIC_INIT(1);
...@@ -82,6 +83,10 @@ static int snapshot_open(struct inode *inode, struct file *filp) ...@@ -82,6 +83,10 @@ static int snapshot_open(struct inode *inode, struct file *filp)
data->swap = -1; data->swap = -1;
data->mode = O_WRONLY; data->mode = O_WRONLY;
error = pm_notifier_call_chain(PM_RESTORE_PREPARE); error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
if (!error) {
error = create_basic_memory_bitmaps();
data->free_bitmaps = !error;
}
if (error) if (error)
pm_notifier_call_chain(PM_POST_RESTORE); pm_notifier_call_chain(PM_POST_RESTORE);
} }
...@@ -111,6 +116,8 @@ static int snapshot_release(struct inode *inode, struct file *filp) ...@@ -111,6 +116,8 @@ static int snapshot_release(struct inode *inode, struct file *filp)
pm_restore_gfp_mask(); pm_restore_gfp_mask();
free_basic_memory_bitmaps(); free_basic_memory_bitmaps();
thaw_processes(); thaw_processes();
} else if (data->free_bitmaps) {
free_basic_memory_bitmaps();
} }
pm_notifier_call_chain(data->mode == O_RDONLY ? pm_notifier_call_chain(data->mode == O_RDONLY ?
PM_POST_HIBERNATION : PM_POST_RESTORE); PM_POST_HIBERNATION : PM_POST_RESTORE);
...@@ -231,6 +238,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, ...@@ -231,6 +238,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
break; break;
pm_restore_gfp_mask(); pm_restore_gfp_mask();
free_basic_memory_bitmaps(); free_basic_memory_bitmaps();
data->free_bitmaps = false;
thaw_processes(); thaw_processes();
data->frozen = 0; data->frozen = 0;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment