Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | KERNEL THREADS |
2 | ||
3 | ||
4 | Freezer | |
5 | ||
6 | Upon entering a suspended state the system will freeze all | |
7 | tasks. This is done by delivering pseudosignals. This affects | |
8 | kernel threads, too. To successfully freeze a kernel thread | |
9 | the thread has to check for the pseudosignal and enter the | |
10 | refrigerator. Code to do this looks like this: | |
11 | ||
12 | do { | |
13 | hub_events(); | |
14 | wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list)); | |
3e1d1d28 | 15 | try_to_freeze(); |
1da177e4 LT |
16 | } while (!signal_pending(current)); |
17 | ||
18 | from drivers/usb/core/hub.c::hub_thread() | |
19 | ||
20 | ||
21 | The Unfreezable | |
22 | ||
23 | Some kernel threads however, must not be frozen. The kernel must | |
24 | be able to finish pending IO operations and later on be able to | |
25 | write the memory image to disk. Kernel threads needed to do IO | |
26 | must stay awake. Such threads must mark themselves unfreezable | |
27 | like this: | |
28 | ||
29 | /* | |
30 | * This thread doesn't need any user-level access, | |
31 | * so get rid of all our resources. | |
32 | */ | |
33 | daemonize("usb-storage"); | |
34 | ||
35 | current->flags |= PF_NOFREEZE; | |
36 | ||
37 | from drivers/usb/storage/usb.c::usb_stor_control_thread() | |
38 | ||
39 | Such drivers are themselves responsible for staying quiet during | |
40 | the actual snapshotting. |