diff options
Diffstat (limited to 'recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0128-PM-Hibernate-fix-the-number-of-pages-used-for-hibern.patch')
-rw-r--r-- | recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0128-PM-Hibernate-fix-the-number-of-pages-used-for-hibern.patch | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0128-PM-Hibernate-fix-the-number-of-pages-used-for-hibern.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0128-PM-Hibernate-fix-the-number-of-pages-used-for-hibern.patch new file mode 100644 index 00000000..913b4738 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0128-PM-Hibernate-fix-the-number-of-pages-used-for-hibern.patch | |||
@@ -0,0 +1,100 @@ | |||
1 | From a33123cb0368231d84b8839f9f56bee45c51016d Mon Sep 17 00:00:00 2001 | ||
2 | From: Bojan Smojver <bojan@rexursive.com> | ||
3 | Date: Tue, 24 Apr 2012 23:53:28 +0200 | ||
4 | Subject: [PATCH 128/165] PM / Hibernate: fix the number of pages used for | ||
5 | hibernate/thaw buffering | ||
6 | |||
7 | commit f8262d476823a7ea1eb497ff9676d1eab2393c75 upstream. | ||
8 | |||
9 | Hibernation regression fix, since 3.2. | ||
10 | |||
11 | Calculate the number of required free pages based on non-high memory | ||
12 | pages only, because that is where the buffers will come from. | ||
13 | |||
14 | Commit 081a9d043c983f161b78fdc4671324d1342b86bc introduced a new buffer | ||
15 | page allocation logic during hibernation, in order to improve the | ||
16 | performance. The amount of pages allocated was calculated based on total | ||
17 | amount of pages available, although only non-high memory pages are | ||
18 | usable for this purpose. This caused hibernation code to attempt to over | ||
19 | allocate pages on platforms that have high memory, which led to hangs. | ||
20 | |||
21 | Signed-off-by: Bojan Smojver <bojan@rexursive.com> | ||
22 | Signed-off-by: Rafael J. Wysocki <rjw@suse.de> | ||
23 | Signed-off-by: Ben Hutchings <ben@decadent.org.uk> | ||
24 | --- | ||
25 | kernel/power/swap.c | 28 ++++++++++++++++++++++------ | ||
26 | 1 files changed, 22 insertions(+), 6 deletions(-) | ||
27 | |||
28 | diff --git a/kernel/power/swap.c b/kernel/power/swap.c | ||
29 | index 11a594c..b313086 100644 | ||
30 | --- a/kernel/power/swap.c | ||
31 | +++ b/kernel/power/swap.c | ||
32 | @@ -52,6 +52,23 @@ | ||
33 | |||
34 | #define MAP_PAGE_ENTRIES (PAGE_SIZE / sizeof(sector_t) - 1) | ||
35 | |||
36 | +/* | ||
37 | + * Number of free pages that are not high. | ||
38 | + */ | ||
39 | +static inline unsigned long low_free_pages(void) | ||
40 | +{ | ||
41 | + return nr_free_pages() - nr_free_highpages(); | ||
42 | +} | ||
43 | + | ||
44 | +/* | ||
45 | + * Number of pages required to be kept free while writing the image. Always | ||
46 | + * half of all available low pages before the writing starts. | ||
47 | + */ | ||
48 | +static inline unsigned long reqd_free_pages(void) | ||
49 | +{ | ||
50 | + return low_free_pages() / 2; | ||
51 | +} | ||
52 | + | ||
53 | struct swap_map_page { | ||
54 | sector_t entries[MAP_PAGE_ENTRIES]; | ||
55 | sector_t next_swap; | ||
56 | @@ -73,7 +90,7 @@ struct swap_map_handle { | ||
57 | sector_t cur_swap; | ||
58 | sector_t first_sector; | ||
59 | unsigned int k; | ||
60 | - unsigned long nr_free_pages, written; | ||
61 | + unsigned long reqd_free_pages; | ||
62 | u32 crc32; | ||
63 | }; | ||
64 | |||
65 | @@ -317,8 +334,7 @@ static int get_swap_writer(struct swap_map_handle *handle) | ||
66 | goto err_rel; | ||
67 | } | ||
68 | handle->k = 0; | ||
69 | - handle->nr_free_pages = nr_free_pages() >> 1; | ||
70 | - handle->written = 0; | ||
71 | + handle->reqd_free_pages = reqd_free_pages(); | ||
72 | handle->first_sector = handle->cur_swap; | ||
73 | return 0; | ||
74 | err_rel: | ||
75 | @@ -353,11 +369,11 @@ static int swap_write_page(struct swap_map_handle *handle, void *buf, | ||
76 | handle->cur_swap = offset; | ||
77 | handle->k = 0; | ||
78 | } | ||
79 | - if (bio_chain && ++handle->written > handle->nr_free_pages) { | ||
80 | + if (bio_chain && low_free_pages() <= handle->reqd_free_pages) { | ||
81 | error = hib_wait_on_bio_chain(bio_chain); | ||
82 | if (error) | ||
83 | goto out; | ||
84 | - handle->written = 0; | ||
85 | + handle->reqd_free_pages = reqd_free_pages(); | ||
86 | } | ||
87 | out: | ||
88 | return error; | ||
89 | @@ -619,7 +635,7 @@ static int save_image_lzo(struct swap_map_handle *handle, | ||
90 | * Adjust number of free pages after all allocations have been done. | ||
91 | * We don't want to run out of pages when writing. | ||
92 | */ | ||
93 | - handle->nr_free_pages = nr_free_pages() >> 1; | ||
94 | + handle->reqd_free_pages = reqd_free_pages(); | ||
95 | |||
96 | /* | ||
97 | * Start the CRC32 thread. | ||
98 | -- | ||
99 | 1.7.7.6 | ||
100 | |||