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