| 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)); |
| if (current->flags & PF_FREEZE) |
| refrigerator(PF_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. |