swap.c (681e4a5e13c1c8315694eb4f44e0cdd84c9082d2) | swap.c (f8262d476823a7ea1eb497ff9676d1eab2393c75) |
---|---|
1/* 2 * linux/kernel/power/swap.c 3 * 4 * This file provides functions for reading the suspend image from 5 * and writing it to a swap partition. 6 * 7 * Copyright (C) 1998,2001-2005 Pavel Machek <pavel@ucw.cz> 8 * Copyright (C) 2006 Rafael J. Wysocki <rjw@sisk.pl> --- 37 unchanged lines hidden (view full) --- 46 * allocated and populated one at a time, so we only need one memory 47 * page to set up the entire structure. 48 * 49 * During resume we pick up all swap_map_page structures into a list. 50 */ 51 52#define MAP_PAGE_ENTRIES (PAGE_SIZE / sizeof(sector_t) - 1) 53 | 1/* 2 * linux/kernel/power/swap.c 3 * 4 * This file provides functions for reading the suspend image from 5 * and writing it to a swap partition. 6 * 7 * Copyright (C) 1998,2001-2005 Pavel Machek <pavel@ucw.cz> 8 * Copyright (C) 2006 Rafael J. Wysocki <rjw@sisk.pl> --- 37 unchanged lines hidden (view full) --- 46 * allocated and populated one at a time, so we only need one memory 47 * page to set up the entire structure. 48 * 49 * During resume we pick up all swap_map_page structures into a list. 50 */ 51 52#define MAP_PAGE_ENTRIES (PAGE_SIZE / sizeof(sector_t) - 1) 53 |
54/* 55 * Number of free pages that are not high. 56 */ 57static 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 */ 66static inline unsigned long reqd_free_pages(void) 67{ 68 return low_free_pages() / 2; 69} 70 |
|
54struct swap_map_page { 55 sector_t entries[MAP_PAGE_ENTRIES]; 56 sector_t next_swap; 57}; 58 59struct swap_map_page_list { 60 struct swap_map_page *map; 61 struct swap_map_page_list *next; --- 5 unchanged lines hidden (view full) --- 67 */ 68 69struct swap_map_handle { 70 struct swap_map_page *cur; 71 struct swap_map_page_list *maps; 72 sector_t cur_swap; 73 sector_t first_sector; 74 unsigned int k; | 71struct swap_map_page { 72 sector_t entries[MAP_PAGE_ENTRIES]; 73 sector_t next_swap; 74}; 75 76struct swap_map_page_list { 77 struct swap_map_page *map; 78 struct swap_map_page_list *next; --- 5 unchanged lines hidden (view full) --- 84 */ 85 86struct swap_map_handle { 87 struct swap_map_page *cur; 88 struct swap_map_page_list *maps; 89 sector_t cur_swap; 90 sector_t first_sector; 91 unsigned int k; |
75 unsigned long nr_free_pages, written; | 92 unsigned long reqd_free_pages; |
76 u32 crc32; 77}; 78 79struct swsusp_header { 80 char reserved[PAGE_SIZE - 20 - sizeof(sector_t) - sizeof(int) - 81 sizeof(u32)]; 82 u32 crc32; 83 sector_t image; --- 227 unchanged lines hidden (view full) --- 311 goto err_close; 312 } 313 handle->cur_swap = alloc_swapdev_block(root_swap); 314 if (!handle->cur_swap) { 315 ret = -ENOSPC; 316 goto err_rel; 317 } 318 handle->k = 0; | 93 u32 crc32; 94}; 95 96struct swsusp_header { 97 char reserved[PAGE_SIZE - 20 - sizeof(sector_t) - sizeof(int) - 98 sizeof(u32)]; 99 u32 crc32; 100 sector_t image; --- 227 unchanged lines hidden (view full) --- 328 goto err_close; 329 } 330 handle->cur_swap = alloc_swapdev_block(root_swap); 331 if (!handle->cur_swap) { 332 ret = -ENOSPC; 333 goto err_rel; 334 } 335 handle->k = 0; |
319 handle->nr_free_pages = nr_free_pages() >> 1; 320 handle->written = 0; | 336 handle->reqd_free_pages = reqd_free_pages(); |
321 handle->first_sector = handle->cur_swap; 322 return 0; 323err_rel: 324 release_swap_writer(handle); 325err_close: 326 swsusp_close(FMODE_WRITE); 327 return ret; 328} --- 18 unchanged lines hidden (view full) --- 347 handle->cur->next_swap = offset; 348 error = write_page(handle->cur, handle->cur_swap, bio_chain); 349 if (error) 350 goto out; 351 clear_page(handle->cur); 352 handle->cur_swap = offset; 353 handle->k = 0; 354 } | 337 handle->first_sector = handle->cur_swap; 338 return 0; 339err_rel: 340 release_swap_writer(handle); 341err_close: 342 swsusp_close(FMODE_WRITE); 343 return ret; 344} --- 18 unchanged lines hidden (view full) --- 363 handle->cur->next_swap = offset; 364 error = write_page(handle->cur, handle->cur_swap, bio_chain); 365 if (error) 366 goto out; 367 clear_page(handle->cur); 368 handle->cur_swap = offset; 369 handle->k = 0; 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); 357 if (error) 358 goto out; | 372 error = hib_wait_on_bio_chain(bio_chain); 373 if (error) 374 goto out; |
359 handle->written = 0; | 375 handle->reqd_free_pages = reqd_free_pages(); |
360 } 361 out: 362 return error; 363} 364 365static int flush_swap_writer(struct swap_map_handle *handle) 366{ 367 if (handle->cur && handle->cur_swap) --- 245 unchanged lines hidden (view full) --- 613 goto out_clean; 614 } 615 } 616 617 /* 618 * Adjust number of free pages after all allocations have been done. 619 * We don't want to run out of pages when writing. 620 */ | 376 } 377 out: 378 return error; 379} 380 381static int flush_swap_writer(struct swap_map_handle *handle) 382{ 383 if (handle->cur && handle->cur_swap) --- 245 unchanged lines hidden (view full) --- 629 goto out_clean; 630 } 631 } 632 633 /* 634 * Adjust number of free pages after all allocations have been done. 635 * We don't want to run out of pages when writing. 636 */ |
621 handle->nr_free_pages = nr_free_pages() >> 1; | 637 handle->reqd_free_pages = reqd_free_pages(); |
622 623 /* 624 * Start the CRC32 thread. 625 */ 626 init_waitqueue_head(&crc->go); 627 init_waitqueue_head(&crc->done); 628 629 handle->crc32 = 0; --- 822 unchanged lines hidden --- | 638 639 /* 640 * Start the CRC32 thread. 641 */ 642 init_waitqueue_head(&crc->go); 643 init_waitqueue_head(&crc->done); 644 645 handle->crc32 = 0; --- 822 unchanged lines hidden --- |