Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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)); |
| 15 | if (current->flags & PF_FREEZE) |
| 16 | refrigerator(PF_FREEZE); |
| 17 | } while (!signal_pending(current)); |
| 18 | |
| 19 | from drivers/usb/core/hub.c::hub_thread() |
| 20 | |
| 21 | |
| 22 | The Unfreezable |
| 23 | |
| 24 | Some kernel threads however, must not be frozen. The kernel must |
| 25 | be able to finish pending IO operations and later on be able to |
| 26 | write the memory image to disk. Kernel threads needed to do IO |
| 27 | must stay awake. Such threads must mark themselves unfreezable |
| 28 | like this: |
| 29 | |
| 30 | /* |
| 31 | * This thread doesn't need any user-level access, |
| 32 | * so get rid of all our resources. |
| 33 | */ |
| 34 | daemonize("usb-storage"); |
| 35 | |
| 36 | current->flags |= PF_NOFREEZE; |
| 37 | |
| 38 | from drivers/usb/storage/usb.c::usb_stor_control_thread() |
| 39 | |
| 40 | Such drivers are themselves responsible for staying quiet during |
| 41 | the actual snapshotting. |