History

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

Linus Torvalds committed 13 years ago

Commit 7dee8df2 parents 3dbecf0 726dcbe6 files · +19 −5Browse files

Showing the changes to kernel (2 of 6 files). Show all

Unified · Split

2 files
  1. kernel/power/snapshot.c +4 −1
  2. kernel/power/user.c +8 −0
kernel/power/snapshot.c+4−1
@@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void) · 742 unmodified lines
743743 struct memory_bitmap *bm1, *bm2;
744744 int error = 0;
745745
746− BUG_ON(forbidden_pages_map || free_pages_map);
746+ if (forbidden_pages_map && free_pages_map)
747+ return 0;
748+ else
749+ BUG_ON(forbidden_pages_map || free_pages_map);
747750
748751 bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL);
749752 if (!bm1)
kernel/power/user.c+8−0
@@ -39,6 +39,7 @@ static struct snapshot_data { · 38 unmodified lines
3939 char frozen;
4040 char ready;
4141 char platform_support;
42+ bool free_bitmaps;
4243 } snapshot_state;
4344
4445 atomic_t snapshot_device_available = ATOMIC_INIT(1);
@@ -82,6 +83,10 @@ static int snapshot_open(struct inode *inode, struct file *filp) · 37 unmodified lines
8283 data->swap = -1;
8384 data->mode = O_WRONLY;
8485 error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
86+ if (!error) {
87+ error = create_basic_memory_bitmaps();
88+ data->free_bitmaps = !error;
89+ }
8590 if (error)
8691 pm_notifier_call_chain(PM_POST_RESTORE);
8792 }
@@ -111,6 +116,8 @@ static int snapshot_release(struct inode *inode, struct file *filp) · 23 unmodified lines
111116 pm_restore_gfp_mask();
112117 free_basic_memory_bitmaps();
113118 thaw_processes();
119+ } else if (data->free_bitmaps) {
120+ free_basic_memory_bitmaps();
114121 }
115122 pm_notifier_call_chain(data->mode == O_RDONLY ?
116123 PM_POST_HIBERNATION : PM_POST_RESTORE);
@@ -231,6 +238,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, · 114 unmodified lines
231238 break;
232239 pm_restore_gfp_mask();
233240 free_basic_memory_bitmaps();
241+ data->free_bitmaps = false;
234242 thaw_processes();
235243 data->frozen = 0;
236244 break;