57222d2089b8baeadc8cc03f076f0bb2c1dfec90
[safe/jmp/linux-2.6] / kernel / power / swsusp.c
1 /*
2  * linux/kernel/power/swsusp.c
3  *
4  * This file provides code to write suspend image to swap and read it back.
5  *
6  * Copyright (C) 1998-2001 Gabor Kuti <seasons@fornax.hu>
7  * Copyright (C) 1998,2001-2005 Pavel Machek <pavel@suse.cz>
8  *
9  * This file is released under the GPLv2.
10  *
11  * I'd like to thank the following people for their work:
12  *
13  * Pavel Machek <pavel@ucw.cz>:
14  * Modifications, defectiveness pointing, being with me at the very beginning,
15  * suspend to swap space, stop all tasks. Port to 2.4.18-ac and 2.5.17.
16  *
17  * Steve Doddi <dirk@loth.demon.co.uk>:
18  * Support the possibility of hardware state restoring.
19  *
20  * Raph <grey.havens@earthling.net>:
21  * Support for preserving states of network devices and virtual console
22  * (including X and svgatextmode)
23  *
24  * Kurt Garloff <garloff@suse.de>:
25  * Straightened the critical function in order to prevent compilers from
26  * playing tricks with local variables.
27  *
28  * Andreas Mohr <a.mohr@mailto.de>
29  *
30  * Alex Badea <vampire@go.ro>:
31  * Fixed runaway init
32  *
33  * Rafael J. Wysocki <rjw@sisk.pl>
34  * Reworked the freeing of memory and the handling of swap
35  *
36  * More state savers are welcome. Especially for the scsi layer...
37  *
38  * For TODOs,FIXMEs also look in Documentation/power/swsusp.txt
39  */
40
41 #include <linux/mm.h>
42 #include <linux/suspend.h>
43 #include <linux/spinlock.h>
44 #include <linux/kernel.h>
45 #include <linux/major.h>
46 #include <linux/swap.h>
47 #include <linux/pm.h>
48 #include <linux/swapops.h>
49 #include <linux/bootmem.h>
50 #include <linux/syscalls.h>
51 #include <linux/highmem.h>
52 #include <linux/time.h>
53 #include <linux/rbtree.h>
54 #include <linux/io.h>
55
56 #include "power.h"
57
58 int in_suspend __nosavedata = 0;
59
60 /**
61  *      swsusp_show_speed - print the time elapsed between two events represented by
62  *      @start and @stop
63  *
64  *      @nr_pages -     number of pages processed between @start and @stop
65  *      @msg -          introductory message to print
66  */
67
68 void swsusp_show_speed(struct timeval *start, struct timeval *stop,
69                         unsigned nr_pages, char *msg)
70 {
71         s64 elapsed_centisecs64;
72         int centisecs;
73         int k;
74         int kps;
75
76         elapsed_centisecs64 = timeval_to_ns(stop) - timeval_to_ns(start);
77         do_div(elapsed_centisecs64, NSEC_PER_SEC / 100);
78         centisecs = elapsed_centisecs64;
79         if (centisecs == 0)
80                 centisecs = 1;  /* avoid div-by-zero */
81         k = nr_pages * (PAGE_SIZE / 1024);
82         kps = (k * 100) / centisecs;
83         printk(KERN_INFO "PM: %s %d kbytes in %d.%02d seconds (%d.%02d MB/s)\n",
84                         msg, k,
85                         centisecs / 100, centisecs % 100,
86                         kps / 1000, (kps % 1000) / 10);
87 }