summaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0128-PM-Hibernate-fix-the-number-of-pages-used-for-hibern.patch
diff options
context:
space:
mode:
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.patch100
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 @@
1From a33123cb0368231d84b8839f9f56bee45c51016d Mon Sep 17 00:00:00 2001
2From: Bojan Smojver <bojan@rexursive.com>
3Date: Tue, 24 Apr 2012 23:53:28 +0200
4Subject: [PATCH 128/165] PM / Hibernate: fix the number of pages used for
5 hibernate/thaw buffering
6
7commit f8262d476823a7ea1eb497ff9676d1eab2393c75 upstream.
8
9Hibernation regression fix, since 3.2.
10
11Calculate the number of required free pages based on non-high memory
12pages only, because that is where the buffers will come from.
13
14Commit 081a9d043c983f161b78fdc4671324d1342b86bc introduced a new buffer
15page allocation logic during hibernation, in order to improve the
16performance. The amount of pages allocated was calculated based on total
17amount of pages available, although only non-high memory pages are
18usable for this purpose. This caused hibernation code to attempt to over
19allocate pages on platforms that have high memory, which led to hangs.
20
21Signed-off-by: Bojan Smojver <bojan@rexursive.com>
22Signed-off-by: Rafael J. Wysocki <rjw@suse.de>
23Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
24---
25 kernel/power/swap.c | 28 ++++++++++++++++++++++------
26 1 files changed, 22 insertions(+), 6 deletions(-)
27
28diff --git a/kernel/power/swap.c b/kernel/power/swap.c
29index 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--
991.7.7.6
100