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)); |
Christoph Lameter | 3e1d1d2 | 2005-06-24 23:13:50 -0700 | [diff] [blame] | 15 | try_to_freeze(); |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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. |