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