diff options
| -rw-r--r-- | kernel/power/swap.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 8742fd013a94..eef311a58a64 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c | |||
| @@ -51,6 +51,23 @@ | |||
| 51 | 51 | ||
| 52 | #define MAP_PAGE_ENTRIES (PAGE_SIZE / sizeof(sector_t) - 1) | 52 | #define MAP_PAGE_ENTRIES (PAGE_SIZE / sizeof(sector_t) - 1) |
| 53 | 53 | ||
| 54 | /* | ||
| 55 | * Number of free pages that are not high. | ||
| 56 | */ | ||
| 57 | static inline unsigned long low_free_pages(void) | ||
| 58 | { | ||
| 59 | return nr_free_pages() - nr_free_highpages(); | ||
| 60 | } | ||
| 61 | |||
| 62 | /* | ||
| 63 | * Number of pages required to be kept free while writing the image. Always | ||
| 64 | * half of all available low pages before the writing starts. | ||
| 65 | */ | ||
| 66 | static inline unsigned long reqd_free_pages(void) | ||
| 67 | { | ||
| 68 | return low_free_pages() / 2; | ||
| 69 | } | ||
| 70 | |||
| 54 | struct swap_map_page { | 71 | struct swap_map_page { |
| 55 | sector_t entries[MAP_PAGE_ENTRIES]; | 72 | sector_t entries[MAP_PAGE_ENTRIES]; |
| 56 | sector_t next_swap; | 73 | sector_t next_swap; |
| @@ -72,7 +89,7 @@ struct swap_map_handle { | |||
| 72 | sector_t cur_swap; | 89 | sector_t cur_swap; |
| 73 | sector_t first_sector; | 90 | sector_t first_sector; |
| 74 | unsigned int k; | 91 | unsigned int k; |
| 75 | unsigned long nr_free_pages, written; | 92 | unsigned long reqd_free_pages; |
| 76 | u32 crc32; | 93 | u32 crc32; |
| 77 | }; | 94 | }; |
| 78 | 95 | ||
| @@ -316,8 +333,7 @@ static int get_swap_writer(struct swap_map_handle *handle) | |||
| 316 | goto err_rel; | 333 | goto err_rel; |
| 317 | } | 334 | } |
| 318 | handle->k = 0; | 335 | handle->k = 0; |
| 319 | handle->nr_free_pages = nr_free_pages() >> 1; | 336 | handle->reqd_free_pages = reqd_free_pages(); |
| 320 | handle->written = 0; | ||
| 321 | handle->first_sector = handle->cur_swap; | 337 | handle->first_sector = handle->cur_swap; |
| 322 | return 0; | 338 | return 0; |
| 323 | err_rel: | 339 | err_rel: |
| @@ -352,11 +368,11 @@ static int swap_write_page(struct swap_map_handle *handle, void *buf, | |||
| 352 | handle->cur_swap = offset; | 368 | handle->cur_swap = offset; |
| 353 | handle->k = 0; | 369 | handle->k = 0; |
| 354 | } | 370 | } |
| 355 | if (bio_chain && ++handle->written > handle->nr_free_pages) { | 371 | if (bio_chain && low_free_pages() <= handle->reqd_free_pages) { |
| 356 | error = hib_wait_on_bio_chain(bio_chain); | 372 | error = hib_wait_on_bio_chain(bio_chain); |
| 357 | if (error) | 373 | if (error) |
| 358 | goto out; | 374 | goto out; |
| 359 | handle->written = 0; | 375 | handle->reqd_free_pages = reqd_free_pages(); |
| 360 | } | 376 | } |
| 361 | out: | 377 | out: |
| 362 | return error; | 378 | return error; |
| @@ -618,7 +634,7 @@ static int save_image_lzo(struct swap_map_handle *handle, | |||
| 618 | * Adjust number of free pages after all allocations have been done. | 634 | * Adjust number of free pages after all allocations have been done. |
| 619 | * We don't want to run out of pages when writing. | 635 | * We don't want to run out of pages when writing. |
| 620 | */ | 636 | */ |
| 621 | handle->nr_free_pages = nr_free_pages() >> 1; | 637 | handle->reqd_free_pages = reqd_free_pages(); |
| 622 | 638 | ||
| 623 | /* | 639 | /* |
| 624 | * Start the CRC32 thread. | 640 | * Start the CRC32 thread. |
