Commit 381e63da44301f49be5876d56a5da2434f132dff
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
Merge branches 'pm-cpufreq' and 'pm-sleep'
* pm-cpufreq: cpufreq: release policy->rwsem on error cpufreq: fix cpufreq suspend/resume for intel_pstate * pm-sleep: Revert "PM / Hibernate: Iterate over set bits instead of PFNs in swsusp_free()"
Showing 2 changed files Side-by-side Diff
drivers/cpufreq/cpufreq.c
... | ... | @@ -1289,6 +1289,8 @@ |
1289 | 1289 | per_cpu(cpufreq_cpu_data, j) = NULL; |
1290 | 1290 | write_unlock_irqrestore(&cpufreq_driver_lock, flags); |
1291 | 1291 | |
1292 | + up_write(&policy->rwsem); | |
1293 | + | |
1292 | 1294 | if (cpufreq_driver->exit) |
1293 | 1295 | cpufreq_driver->exit(policy); |
1294 | 1296 | err_set_policy_cpu: |
... | ... | @@ -1656,6 +1658,8 @@ |
1656 | 1658 | if (!cpufreq_driver) |
1657 | 1659 | return; |
1658 | 1660 | |
1661 | + cpufreq_suspended = true; | |
1662 | + | |
1659 | 1663 | if (!has_target()) |
1660 | 1664 | return; |
1661 | 1665 | |
... | ... | @@ -1670,8 +1674,6 @@ |
1670 | 1674 | pr_err("%s: Failed to suspend driver: %p\n", __func__, |
1671 | 1675 | policy); |
1672 | 1676 | } |
1673 | - | |
1674 | - cpufreq_suspended = true; | |
1675 | 1677 | } |
1676 | 1678 | |
1677 | 1679 | /** |
1678 | 1680 | |
... | ... | @@ -1687,12 +1689,12 @@ |
1687 | 1689 | if (!cpufreq_driver) |
1688 | 1690 | return; |
1689 | 1691 | |
1692 | + cpufreq_suspended = false; | |
1693 | + | |
1690 | 1694 | if (!has_target()) |
1691 | 1695 | return; |
1692 | 1696 | |
1693 | 1697 | pr_debug("%s: Resuming Governors\n", __func__); |
1694 | - | |
1695 | - cpufreq_suspended = false; | |
1696 | 1698 | |
1697 | 1699 | list_for_each_entry(policy, &cpufreq_policy_list, policy_list) { |
1698 | 1700 | if (cpufreq_driver->resume && cpufreq_driver->resume(policy)) |
kernel/power/snapshot.c
... | ... | @@ -725,14 +725,6 @@ |
725 | 725 | clear_bit(bit, addr); |
726 | 726 | } |
727 | 727 | |
728 | -static void memory_bm_clear_current(struct memory_bitmap *bm) | |
729 | -{ | |
730 | - int bit; | |
731 | - | |
732 | - bit = max(bm->cur.node_bit - 1, 0); | |
733 | - clear_bit(bit, bm->cur.node->data); | |
734 | -} | |
735 | - | |
736 | 728 | static int memory_bm_test_bit(struct memory_bitmap *bm, unsigned long pfn) |
737 | 729 | { |
738 | 730 | void *addr; |
739 | 731 | |
740 | 732 | |
741 | 733 | |
... | ... | @@ -1341,35 +1333,23 @@ |
1341 | 1333 | |
1342 | 1334 | void swsusp_free(void) |
1343 | 1335 | { |
1344 | - unsigned long fb_pfn, fr_pfn; | |
1336 | + struct zone *zone; | |
1337 | + unsigned long pfn, max_zone_pfn; | |
1345 | 1338 | |
1346 | - memory_bm_position_reset(forbidden_pages_map); | |
1347 | - memory_bm_position_reset(free_pages_map); | |
1339 | + for_each_populated_zone(zone) { | |
1340 | + max_zone_pfn = zone_end_pfn(zone); | |
1341 | + for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) | |
1342 | + if (pfn_valid(pfn)) { | |
1343 | + struct page *page = pfn_to_page(pfn); | |
1348 | 1344 | |
1349 | -loop: | |
1350 | - fr_pfn = memory_bm_next_pfn(free_pages_map); | |
1351 | - fb_pfn = memory_bm_next_pfn(forbidden_pages_map); | |
1352 | - | |
1353 | - /* | |
1354 | - * Find the next bit set in both bitmaps. This is guaranteed to | |
1355 | - * terminate when fb_pfn == fr_pfn == BM_END_OF_MAP. | |
1356 | - */ | |
1357 | - do { | |
1358 | - if (fb_pfn < fr_pfn) | |
1359 | - fb_pfn = memory_bm_next_pfn(forbidden_pages_map); | |
1360 | - if (fr_pfn < fb_pfn) | |
1361 | - fr_pfn = memory_bm_next_pfn(free_pages_map); | |
1362 | - } while (fb_pfn != fr_pfn); | |
1363 | - | |
1364 | - if (fr_pfn != BM_END_OF_MAP && pfn_valid(fr_pfn)) { | |
1365 | - struct page *page = pfn_to_page(fr_pfn); | |
1366 | - | |
1367 | - memory_bm_clear_current(forbidden_pages_map); | |
1368 | - memory_bm_clear_current(free_pages_map); | |
1369 | - __free_page(page); | |
1370 | - goto loop; | |
1345 | + if (swsusp_page_is_forbidden(page) && | |
1346 | + swsusp_page_is_free(page)) { | |
1347 | + swsusp_unset_page_forbidden(page); | |
1348 | + swsusp_unset_page_free(page); | |
1349 | + __free_page(page); | |
1350 | + } | |
1351 | + } | |
1371 | 1352 | } |
1372 | - | |
1373 | 1353 | nr_copy_pages = 0; |
1374 | 1354 | nr_meta_pages = 0; |
1375 | 1355 | restore_pblist = NULL; |