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
Showing the changes to kernel (2 of 6 files). Show all
Unified · Split
| @@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void) · 742 unmodified lines | |||
| 743 | struct memory_bitmap *bm1, *bm2; | 743 | struct memory_bitmap *bm1, *bm2; |
| 744 | int error = 0; | 744 | int error = 0; |
| 745 | 745 | ||
| 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); | ||
| 747 | 750 | ||
| 748 | bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL); | 751 | bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL); |
| 749 | if (!bm1) | 752 | if (!bm1) |
| @@ -39,6 +39,7 @@ static struct snapshot_data { · 38 unmodified lines | |||
| 39 | char frozen; | 39 | char frozen; |
| 40 | char ready; | 40 | char ready; |
| 41 | char platform_support; | 41 | char platform_support; |
| 42 | bool free_bitmaps; | ||
| 42 | } snapshot_state; | 43 | } snapshot_state; |
| 43 | 44 | ||
| 44 | atomic_t snapshot_device_available = ATOMIC_INIT(1); | 45 | 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 | |||
| 82 | data->swap = -1; | 83 | data->swap = -1; |
| 83 | data->mode = O_WRONLY; | 84 | data->mode = O_WRONLY; |
| 84 | error = pm_notifier_call_chain(PM_RESTORE_PREPARE); | 85 | error = pm_notifier_call_chain(PM_RESTORE_PREPARE); |
| 86 | if (!error) { | ||
| 87 | error = create_basic_memory_bitmaps(); | ||
| 88 | data->free_bitmaps = !error; | ||
| 89 | } | ||
| 85 | if (error) | 90 | if (error) |
| 86 | pm_notifier_call_chain(PM_POST_RESTORE); | 91 | pm_notifier_call_chain(PM_POST_RESTORE); |
| 87 | } | 92 | } |
| @@ -111,6 +116,8 @@ static int snapshot_release(struct inode *inode, struct file *filp) · 23 unmodified lines | |||
| 111 | pm_restore_gfp_mask(); | 116 | pm_restore_gfp_mask(); |
| 112 | free_basic_memory_bitmaps(); | 117 | free_basic_memory_bitmaps(); |
| 113 | thaw_processes(); | 118 | thaw_processes(); |
| 119 | } else if (data->free_bitmaps) { | ||
| 120 | free_basic_memory_bitmaps(); | ||
| 114 | } | 121 | } |
| 115 | pm_notifier_call_chain(data->mode == O_RDONLY ? | 122 | pm_notifier_call_chain(data->mode == O_RDONLY ? |
| 116 | PM_POST_HIBERNATION : PM_POST_RESTORE); | 123 | PM_POST_HIBERNATION : PM_POST_RESTORE); |
| @@ -231,6 +238,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, · 114 unmodified lines | |||
| 231 | break; | 238 | break; |
| 232 | pm_restore_gfp_mask(); | 239 | pm_restore_gfp_mask(); |
| 233 | free_basic_memory_bitmaps(); | 240 | free_basic_memory_bitmaps(); |
| 241 | data->free_bitmaps = false; | ||
| 234 | thaw_processes(); | 242 | thaw_processes(); |
| 235 | data->frozen = 0; | 243 | data->frozen = 0; |
| 236 | break; | 244 | break; |