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 ---