linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [Patch] s2disk / hibernate: Bug 47931 / Bug 83821
@ 2014-11-08 22:30 Rainer Fiebig
  0 siblings, 0 replies; only message in thread
From: Rainer Fiebig @ 2014-11-08 22:30 UTC (permalink / raw)
  To: linux-pm


Hi!

I think I’ve found a solution for Bug 47931 and Bug 83821.
It makes s2disk almost 100% reliable on my x86_64-system.
Only one line of code needs to be modified and placed higher up in the code.


Background
s2disk sometimes does not succeed at the first attempt but needs two or even 
more attempts (Bug 47931, https://bugzilla.kernel.org/show_bug.cgi?id=47931).
This happens if more than 50% of memory is used by applications and 
buffers/cache. 
As buffers/cache can take up a lot of memory quickly, Bug 47931 may occur even 
if only a few applications are running.

Bug 83821 (https://bugzilla.kernel.org/show_bug.cgi?id=83821.) causes a 
similar behavior if s2disk is executed immediately after a memory-intensive 
application was closed or if it is executed more than 2 times in a row after a 
fresh system start.
That means it can occur even if less than 50% of memory is used.

For the user this is quite bewildering and time-consuming. It makes s2disk 
unreliable and basically unusable.

I found out that both bugs can be prevented by issuing "drop_caches=1" 
before s2disk.

In function "int hibernate_preallocate_memory(void)" in 
kernel/power/snapshot.c "shrink_all_memory()" is called to free memory.
Unfortunately, it is placed too far down in the code to take effect. 
This is why we run into Bug 47931.
If memory-usage is low, it may not be called at all. This probably causes 
Bug 83821.


Solution
The solution is simple: free memory early and do it with every s2disk.

Only one line of code needs to be modified and and put before
"saveable = count_data_pages();":

shrink_all_memory(count_data_pages() / 2);.

Freeing 50% of used data-pages seems sufficient without applying too much 
pressure which could have a negative effect on resumes and initial system-
responsiveness. 

The "shrink_all_memory(saveable - size);"-statement further down in the code 
must be deleted.


Results
This modification has made s2disk almost 100% reliable on my system.

Testing was done with kernels 3.16.2 and 3.14.22 on an x86_64-system with 
12 GB RAM.
I have not tested it on a 32-bit-system.

Here's an example of a case where s2disk now works 
but surely would have failed before:


> free
             total       used       free     shared    buffers     cached
Mem:      11973244   11734724     238520          0    6107076    1995700
-/+ buffers/cache:    3631948    8341296
Swap:     10714108          0   10714108


I have found only two conditions where s2disk still fails:

1.) If "used - buffers/cache" is > 50% of memory. 
In this case s2disk stops and returns to the desktop. 
That's not a big problem and is to be expected due to its current limit 
of 50% of RAM.
Example:


> free
             total       used       free     shared    buffers     cached
Mem:      11973244   10786352    1186892          0    1436860    2341156
-/+ buffers/cache:    7008336    4964908
Swap:     10714108    1003124    9710984

2.) If "used - buffers/cache" is very close to 50% of memory.
Here one may run into Bug 75101 
(https://bugzilla.kernel.org/show_bug.cgi?id=75101). Which is bad, because it 
requires a hard-reset.
I have encountered this only once when testing the limits.
But it may be a problem on systems with sparse memory.
Example:


> free
             total       used       free     shared    buffers     cached
Mem:      11997572    6490540    5507032          0      32600     577632
-/+ buffers/cache:    5880308    6117264
Swap:     10714108     739580    9974528


Other than 2.) I have not encountered any major negative side-effects.
I use s2both and if memory usage was high before s2disk, resumes may take a 
little longer than after a plain suspend to RAM.
In those cases the system also may be a little less responsive initially.
For me this is negligible and clearly outweighed by the benefit of almost 
total reliability.
In addition, the whole procedure is at least not slower than before.

More test-results in the thread for Bug 47931 (posted by "Jay").

I am not sure whether my post or the patch conform to conventions here 
but in view of the potential improvement in s2disk I thought 
I'd give it a try.

Reviews/comments/advice welcome.


Rainer Fiebig



Signed-off-by: J. Rainer Fiebig <j.r.f@t-online.de>

--- linux-3.16.2/kernel/power/snapshot.orig     2014-08-04 00:25:02.000000000 
+0200
+++ linux-3.16.2/kernel/power/snapshot.c        2014-10-28 20:49:32.000000000 
+0100
@@ -1332,6 +1332,13 @@ int hibernate_preallocate_memory(void)
 
        /* Count the number of saveable data pages. */
        save_highmem = count_highmem_pages();
+
+       /* 
+        * Free memory. About 50% of used data pages seems sufficient 
+        * without exerting too much pressure. This is done on every s2disk.
+        */
+       shrink_all_memory(count_data_pages() / 2);
+
        saveable = count_data_pages();
 
        /*
@@ -1389,14 +1396,6 @@ int hibernate_preallocate_memory(void)
                size = min_t(unsigned long, pages, max_size);
 
        /*
-        * Let the memory management subsystem know that we're going to need a
-        * large number of page frames to allocate and make it free some 
memory.
-        * NOTE: If this is not done, performance will be hurt badly in some
-        * test cases.
-        */
-       shrink_all_memory(saveable - size);
-
-       /*
         * The number of saveable pages in memory was too high, so apply some
         * pressure to decrease it.  First, make room for the largest possible
         * image and fail if that doesn't work.  Next, try to decrease the 
size
--

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2014-11-08 22:35 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-08 22:30 [Patch] s2disk / hibernate: Bug 47931 / Bug 83821 Rainer Fiebig

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).