12345678910111213141516171819202122232425262728293031323334353637383940 |
- 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.
|