| KERNEL THREADS | |
| Freezer | |
| Upon entering a suspended state the system will freeze all | |
| tasks. This is done by delivering pseudosignals. This affects | |
| kernel threads, too. To successfully freeze a kernel thread | |
| the thread has to check for the pseudosignal and enter the | |
| refrigerator. Code to do this looks like this: | |
| do { | |
| hub_events(); | |
| wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list)); | |
| try_to_freeze(); | |
| } while (!signal_pending(current)); | |
| from drivers/usb/core/hub.c::hub_thread() | |
| The Unfreezable | |
| Some kernel threads however, must not be frozen. The kernel must | |
| be able to finish pending IO operations and later on be able to | |
| write the memory image to disk. Kernel threads needed to do IO | |
| must stay awake. Such threads must mark themselves unfreezable | |
| like this: | |
| /* | |
| * This thread doesn't need any user-level access, | |
| * so get rid of all our resources. | |
| */ | |
| daemonize("usb-storage"); | |
| current->flags |= PF_NOFREEZE; | |
| from drivers/usb/storage/usb.c::usb_stor_control_thread() | |
| Such drivers are themselves responsible for staying quiet during | |
| the actual snapshotting. |