Commit 381e63da44301f49be5876d56a5da2434f132dff

Authored by Rafael J. Wysocki

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;