[PATCH] debug: workqueue locking sanity
[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
54 #include "power.h"
55
56 /*
57  * Preferred image size in bytes (tunable via /sys/power/image_size).
58  * When it is set to N, swsusp will do its best to ensure the image
59  * size will not exceed N bytes, but if that is impossible, it will
60  * try to create the smallest image possible.
61  */
62 unsigned long image_size = 500 * 1024 * 1024;
63
64 int in_suspend __nosavedata = 0;
65
66 #ifdef CONFIG_HIGHMEM
67 unsigned int count_highmem_pages(void);
68 int restore_highmem(void);
69 #else
70 static inline int restore_highmem(void) { return 0; }
71 static inline unsigned int count_highmem_pages(void) { return 0; }
72 #endif
73
74 /**
75  *      The following functions are used for tracing the allocated
76  *      swap pages, so that they can be freed in case of an error.
77  *
78  *      The functions operate on a linked bitmap structure defined
79  *      in power.h
80  */
81
82 void free_bitmap(struct bitmap_page *bitmap)
83 {
84         struct bitmap_page *bp;
85
86         while (bitmap) {
87                 bp = bitmap->next;
88                 free_page((unsigned long)bitmap);
89                 bitmap = bp;
90         }
91 }
92
93 struct bitmap_page *alloc_bitmap(unsigned int nr_bits)
94 {
95         struct bitmap_page *bitmap, *bp;
96         unsigned int n;
97
98         if (!nr_bits)
99                 return NULL;
100
101         bitmap = (struct bitmap_page *)get_zeroed_page(GFP_KERNEL);
102         bp = bitmap;
103         for (n = BITMAP_PAGE_BITS; n < nr_bits; n += BITMAP_PAGE_BITS) {
104                 bp->next = (struct bitmap_page *)get_zeroed_page(GFP_KERNEL);
105                 bp = bp->next;
106                 if (!bp) {
107                         free_bitmap(bitmap);
108                         return NULL;
109                 }
110         }
111         return bitmap;
112 }
113
114 static int bitmap_set(struct bitmap_page *bitmap, unsigned long bit)
115 {
116         unsigned int n;
117
118         n = BITMAP_PAGE_BITS;
119         while (bitmap && n <= bit) {
120                 n += BITMAP_PAGE_BITS;
121                 bitmap = bitmap->next;
122         }
123         if (!bitmap)
124                 return -EINVAL;
125         n -= BITMAP_PAGE_BITS;
126         bit -= n;
127         n = 0;
128         while (bit >= BITS_PER_CHUNK) {
129                 bit -= BITS_PER_CHUNK;
130                 n++;
131         }
132         bitmap->chunks[n] |= (1UL << bit);
133         return 0;
134 }
135
136 sector_t alloc_swapdev_block(int swap, struct bitmap_page *bitmap)
137 {
138         unsigned long offset;
139
140         offset = swp_offset(get_swap_page_of_type(swap));
141         if (offset) {
142                 if (bitmap_set(bitmap, offset))
143                         swap_free(swp_entry(swap, offset));
144                 else
145                         return swapdev_block(swap, offset);
146         }
147         return 0;
148 }
149
150 void free_all_swap_pages(int swap, struct bitmap_page *bitmap)
151 {
152         unsigned int bit, n;
153         unsigned long test;
154
155         bit = 0;
156         while (bitmap) {
157                 for (n = 0; n < BITMAP_PAGE_CHUNKS; n++)
158                         for (test = 1UL; test; test <<= 1) {
159                                 if (bitmap->chunks[n] & test)
160                                         swap_free(swp_entry(swap, bit));
161                                 bit++;
162                         }
163                 bitmap = bitmap->next;
164         }
165 }
166
167 /**
168  *      swsusp_show_speed - print the time elapsed between two events represented by
169  *      @start and @stop
170  *
171  *      @nr_pages -     number of pages processed between @start and @stop
172  *      @msg -          introductory message to print
173  */
174
175 void swsusp_show_speed(struct timeval *start, struct timeval *stop,
176                         unsigned nr_pages, char *msg)
177 {
178         s64 elapsed_centisecs64;
179         int centisecs;
180         int k;
181         int kps;
182
183         elapsed_centisecs64 = timeval_to_ns(stop) - timeval_to_ns(start);
184         do_div(elapsed_centisecs64, NSEC_PER_SEC / 100);
185         centisecs = elapsed_centisecs64;
186         if (centisecs == 0)
187                 centisecs = 1;  /* avoid div-by-zero */
188         k = nr_pages * (PAGE_SIZE / 1024);
189         kps = (k * 100) / centisecs;
190         printk("%s %d kbytes in %d.%02d seconds (%d.%02d MB/s)\n", msg, k,
191                         centisecs / 100, centisecs % 100,
192                         kps / 1000, (kps % 1000) / 10);
193 }
194
195 /**
196  *      swsusp_shrink_memory -  Try to free as much memory as needed
197  *
198  *      ... but do not OOM-kill anyone
199  *
200  *      Notice: all userland should be stopped before it is called, or
201  *      livelock is possible.
202  */
203
204 #define SHRINK_BITE     10000
205 static inline unsigned long __shrink_memory(long tmp)
206 {
207         if (tmp > SHRINK_BITE)
208                 tmp = SHRINK_BITE;
209         return shrink_all_memory(tmp);
210 }
211
212 int swsusp_shrink_memory(void)
213 {
214         long tmp;
215         struct zone *zone;
216         unsigned long pages = 0;
217         unsigned int i = 0;
218         char *p = "-\\|/";
219         struct timeval start, stop;
220
221         printk("Shrinking memory...  ");
222         do_gettimeofday(&start);
223         do {
224                 long size, highmem_size;
225
226                 highmem_size = count_highmem_pages();
227                 size = count_data_pages() + PAGES_FOR_IO;
228                 tmp = size;
229                 size += highmem_size;
230                 for_each_zone (zone)
231                         if (populated_zone(zone)) {
232                                 if (is_highmem(zone)) {
233                                         highmem_size -= zone->free_pages;
234                                 } else {
235                                         tmp -= zone->free_pages;
236                                         tmp += zone->lowmem_reserve[ZONE_NORMAL];
237                                         tmp += snapshot_additional_pages(zone);
238                                 }
239                         }
240
241                 if (highmem_size < 0)
242                         highmem_size = 0;
243
244                 tmp += highmem_size;
245                 if (tmp > 0) {
246                         tmp = __shrink_memory(tmp);
247                         if (!tmp)
248                                 return -ENOMEM;
249                         pages += tmp;
250                 } else if (size > image_size / PAGE_SIZE) {
251                         tmp = __shrink_memory(size - (image_size / PAGE_SIZE));
252                         pages += tmp;
253                 }
254                 printk("\b%c", p[i++%4]);
255         } while (tmp > 0);
256         do_gettimeofday(&stop);
257         printk("\bdone (%lu pages freed)\n", pages);
258         swsusp_show_speed(&start, &stop, pages, "Freed");
259
260         return 0;
261 }
262
263 int swsusp_suspend(void)
264 {
265         int error;
266
267         if ((error = arch_prepare_suspend()))
268                 return error;
269
270         local_irq_disable();
271         /* At this point, device_suspend() has been called, but *not*
272          * device_power_down(). We *must* device_power_down() now.
273          * Otherwise, drivers for some devices (e.g. interrupt controllers)
274          * become desynchronized with the actual state of the hardware
275          * at resume time, and evil weirdness ensues.
276          */
277         if ((error = device_power_down(PMSG_FREEZE))) {
278                 printk(KERN_ERR "Some devices failed to power down, aborting suspend\n");
279                 goto Enable_irqs;
280         }
281
282         save_processor_state();
283         if ((error = swsusp_arch_suspend()))
284                 printk(KERN_ERR "Error %d suspending\n", error);
285         /* Restore control flow magically appears here */
286         restore_processor_state();
287         /* NOTE:  device_power_up() is just a resume() for devices
288          * that suspended with irqs off ... no overall powerup.
289          */
290         device_power_up();
291  Enable_irqs:
292         local_irq_enable();
293         return error;
294 }
295
296 int swsusp_resume(void)
297 {
298         int error;
299
300         local_irq_disable();
301         /* NOTE:  device_power_down() is just a suspend() with irqs off;
302          * it has no special "power things down" semantics
303          */
304         if (device_power_down(PMSG_PRETHAW))
305                 printk(KERN_ERR "Some devices failed to power down, very bad\n");
306         /* We'll ignore saved state, but this gets preempt count (etc) right */
307         save_processor_state();
308         error = restore_highmem();
309         if (!error) {
310                 error = swsusp_arch_resume();
311                 /* The code below is only ever reached in case of a failure.
312                  * Otherwise execution continues at place where
313                  * swsusp_arch_suspend() was called
314                  */
315                 BUG_ON(!error);
316                 /* This call to restore_highmem() undos the previous one */
317                 restore_highmem();
318         }
319         /* The only reason why swsusp_arch_resume() can fail is memory being
320          * very tight, so we have to free it as soon as we can to avoid
321          * subsequent failures
322          */
323         swsusp_free();
324         restore_processor_state();
325         touch_softlockup_watchdog();
326         device_power_up();
327         local_irq_enable();
328         return error;
329 }