Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Freezer: make kernel threads nonfreezable by default

Currently, the freezer treats all tasks as freezable, except for the kernel
threads that explicitly set the PF_NOFREEZE flag for themselves. This
approach is problematic, since it requires every kernel thread to either
set PF_NOFREEZE explicitly, or call try_to_freeze(), even if it doesn't
care for the freezing of tasks at all.

It seems better to only require the kernel threads that want to or need to
be frozen to use some freezer-related code and to remove any
freezer-related code from the other (nonfreezable) kernel threads, which is
done in this patch.

The patch causes all kernel threads to be nonfreezable by default (ie. to
have PF_NOFREEZE set by default) and introduces the set_freezable()
function that should be called by the freezable kernel threads in order to
unset PF_NOFREEZE. It also makes all of the currently freezable kernel
threads call set_freezable(), so it shouldn't cause any (intentional)
change of behaviour to appear. Additionally, it updates documentation to
describe the freezing of tasks more accurately.

[akpm@linux-foundation.org: build fixes]
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Nigel Cunningham <nigel@nigel.suspend2.net>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Gautham R Shenoy <ego@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Rafael J. Wysocki and committed by
Linus Torvalds
83144186 787d2214

+256 -113
+160
Documentation/power/freezing-of-tasks.txt
··· 1 + Freezing of tasks 2 + (C) 2007 Rafael J. Wysocki <rjw@sisk.pl>, GPL 3 + 4 + I. What is the freezing of tasks? 5 + 6 + The freezing of tasks is a mechanism by which user space processes and some 7 + kernel threads are controlled during hibernation or system-wide suspend (on some 8 + architectures). 9 + 10 + II. How does it work? 11 + 12 + There are four per-task flags used for that, PF_NOFREEZE, PF_FROZEN, TIF_FREEZE 13 + and PF_FREEZER_SKIP (the last one is auxiliary). The tasks that have 14 + PF_NOFREEZE unset (all user space processes and some kernel threads) are 15 + regarded as 'freezable' and treated in a special way before the system enters a 16 + suspend state as well as before a hibernation image is created (in what follows 17 + we only consider hibernation, but the description also applies to suspend). 18 + 19 + Namely, as the first step of the hibernation procedure the function 20 + freeze_processes() (defined in kernel/power/process.c) is called. It executes 21 + try_to_freeze_tasks() that sets TIF_FREEZE for all of the freezable tasks and 22 + sends a fake signal to each of them. A task that receives such a signal and has 23 + TIF_FREEZE set, should react to it by calling the refrigerator() function 24 + (defined in kernel/power/process.c), which sets the task's PF_FROZEN flag, 25 + changes its state to TASK_UNINTERRUPTIBLE and makes it loop until PF_FROZEN is 26 + cleared for it. Then, we say that the task is 'frozen' and therefore the set of 27 + functions handling this mechanism is called 'the freezer' (these functions are 28 + defined in kernel/power/process.c and include/linux/freezer.h). User space 29 + processes are generally frozen before kernel threads. 30 + 31 + It is not recommended to call refrigerator() directly. Instead, it is 32 + recommended to use the try_to_freeze() function (defined in 33 + include/linux/freezer.h), that checks the task's TIF_FREEZE flag and makes the 34 + task enter refrigerator() if the flag is set. 35 + 36 + For user space processes try_to_freeze() is called automatically from the 37 + signal-handling code, but the freezable kernel threads need to call it 38 + explicitly in suitable places. The code to do this may look like the following: 39 + 40 + do { 41 + hub_events(); 42 + wait_event_interruptible(khubd_wait, 43 + !list_empty(&hub_event_list)); 44 + try_to_freeze(); 45 + } while (!signal_pending(current)); 46 + 47 + (from drivers/usb/core/hub.c::hub_thread()). 48 + 49 + If a freezable kernel thread fails to call try_to_freeze() after the freezer has 50 + set TIF_FREEZE for it, the freezing of tasks will fail and the entire 51 + hibernation operation will be cancelled. For this reason, freezable kernel 52 + threads must call try_to_freeze() somewhere. 53 + 54 + After the system memory state has been restored from a hibernation image and 55 + devices have been reinitialized, the function thaw_processes() is called in 56 + order to clear the PF_FROZEN flag for each frozen task. Then, the tasks that 57 + have been frozen leave refrigerator() and continue running. 58 + 59 + III. Which kernel threads are freezable? 60 + 61 + Kernel threads are not freezable by default. However, a kernel thread may clear 62 + PF_NOFREEZE for itself by calling set_freezable() (the resetting of PF_NOFREEZE 63 + directly is strongly discouraged). From this point it is regarded as freezable 64 + and must call try_to_freeze() in a suitable place. 65 + 66 + IV. Why do we do that? 67 + 68 + Generally speaking, there is a couple of reasons to use the freezing of tasks: 69 + 70 + 1. The principal reason is to prevent filesystems from being damaged after 71 + hibernation. At the moment we have no simple means of checkpointing 72 + filesystems, so if there are any modifications made to filesystem data and/or 73 + metadata on disks, we cannot bring them back to the state from before the 74 + modifications. At the same time each hibernation image contains some 75 + filesystem-related information that must be consistent with the state of the 76 + on-disk data and metadata after the system memory state has been restored from 77 + the image (otherwise the filesystems will be damaged in a nasty way, usually 78 + making them almost impossible to repair). We therefore freeze tasks that might 79 + cause the on-disk filesystems' data and metadata to be modified after the 80 + hibernation image has been created and before the system is finally powered off. 81 + The majority of these are user space processes, but if any of the kernel threads 82 + may cause something like this to happen, they have to be freezable. 83 + 84 + 2. The second reason is to prevent user space processes and some kernel threads 85 + from interfering with the suspending and resuming of devices. A user space 86 + process running on a second CPU while we are suspending devices may, for 87 + example, be troublesome and without the freezing of tasks we would need some 88 + safeguards against race conditions that might occur in such a case. 89 + 90 + Although Linus Torvalds doesn't like the freezing of tasks, he said this in one 91 + of the discussions on LKML (http://lkml.org/lkml/2007/4/27/608): 92 + 93 + "RJW:> Why we freeze tasks at all or why we freeze kernel threads? 94 + 95 + Linus: In many ways, 'at all'. 96 + 97 + I _do_ realize the IO request queue issues, and that we cannot actually do 98 + s2ram with some devices in the middle of a DMA. So we want to be able to 99 + avoid *that*, there's no question about that. And I suspect that stopping 100 + user threads and then waiting for a sync is practically one of the easier 101 + ways to do so. 102 + 103 + So in practice, the 'at all' may become a 'why freeze kernel threads?' and 104 + freezing user threads I don't find really objectionable." 105 + 106 + Still, there are kernel threads that may want to be freezable. For example, if 107 + a kernel that belongs to a device driver accesses the device directly, it in 108 + principle needs to know when the device is suspended, so that it doesn't try to 109 + access it at that time. However, if the kernel thread is freezable, it will be 110 + frozen before the driver's .suspend() callback is executed and it will be 111 + thawed after the driver's .resume() callback has run, so it won't be accessing 112 + the device while it's suspended. 113 + 114 + 3. Another reason for freezing tasks is to prevent user space processes from 115 + realizing that hibernation (or suspend) operation takes place. Ideally, user 116 + space processes should not notice that such a system-wide operation has occurred 117 + and should continue running without any problems after the restore (or resume 118 + from suspend). Unfortunately, in the most general case this is quite difficult 119 + to achieve without the freezing of tasks. Consider, for example, a process 120 + that depends on all CPUs being online while it's running. Since we need to 121 + disable nonboot CPUs during the hibernation, if this process is not frozen, it 122 + may notice that the number of CPUs has changed and may start to work incorrectly 123 + because of that. 124 + 125 + V. Are there any problems related to the freezing of tasks? 126 + 127 + Yes, there are. 128 + 129 + First of all, the freezing of kernel threads may be tricky if they depend one 130 + on another. For example, if kernel thread A waits for a completion (in the 131 + TASK_UNINTERRUPTIBLE state) that needs to be done by freezable kernel thread B 132 + and B is frozen in the meantime, then A will be blocked until B is thawed, which 133 + may be undesirable. That's why kernel threads are not freezable by default. 134 + 135 + Second, there are the following two problems related to the freezing of user 136 + space processes: 137 + 1. Putting processes into an uninterruptible sleep distorts the load average. 138 + 2. Now that we have FUSE, plus the framework for doing device drivers in 139 + userspace, it gets even more complicated because some userspace processes are 140 + now doing the sorts of things that kernel threads do 141 + (https://lists.linux-foundation.org/pipermail/linux-pm/2007-May/012309.html). 142 + 143 + The problem 1. seems to be fixable, although it hasn't been fixed so far. The 144 + other one is more serious, but it seems that we can work around it by using 145 + hibernation (and suspend) notifiers (in that case, though, we won't be able to 146 + avoid the realization by the user space processes that the hibernation is taking 147 + place). 148 + 149 + There are also problems that the freezing of tasks tends to expose, although 150 + they are not directly related to it. For example, if request_firmware() is 151 + called from a device driver's .resume() routine, it will timeout and eventually 152 + fail, because the user land process that should respond to the request is frozen 153 + at this point. So, seemingly, the failure is due to the freezing of tasks. 154 + Suppose, however, that the firmware file is located on a filesystem accessible 155 + only through another device that hasn't been resumed yet. In that case, 156 + request_firmware() will fail regardless of whether or not the freezing of tasks 157 + is used. Consequently, the problem is not really related to the freezing of 158 + tasks, since it generally exists anyway. [The solution to this particular 159 + problem is to keep the firmware in memory after it's loaded for the first time 160 + and upload if from memory to the device whenever necessary.]
-40
Documentation/power/kernel_threads.txt
··· 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)); 15 - try_to_freeze(); 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.
+4 -14
Documentation/power/swsusp.txt
··· 140 140 website, and not to the Linux Kernel Mailing List. We are working 141 141 toward merging suspend2 into the mainline kernel. 142 142 143 - Q: A kernel thread must voluntarily freeze itself (call 'refrigerator'). 144 - I found some kernel threads that don't do it, and they don't freeze 145 - so the system can't sleep. Is this a known behavior? 143 + Q: What is the freezing of tasks and why are we using it? 146 144 147 - A: All such kernel threads need to be fixed, one by one. Select the 148 - place where the thread is safe to be frozen (no kernel semaphores 149 - should be held at that point and it must be safe to sleep there), and 150 - add: 151 - 152 - try_to_freeze(); 153 - 154 - If the thread is needed for writing the image to storage, you should 155 - instead set the PF_NOFREEZE process flag when creating the thread (and 156 - be very careful). 157 - 145 + A: The freezing of tasks is a mechanism by which user space processes and some 146 + kernel threads are controlled during hibernation or system-wide suspend (on some 147 + architectures). See freezing-of-tasks.txt for details. 158 148 159 149 Q: What is the difference between "platform" and "shutdown"? 160 150
+1 -1
arch/i386/kernel/apm.c
··· 222 222 #include <linux/capability.h> 223 223 #include <linux/device.h> 224 224 #include <linux/kernel.h> 225 + #include <linux/freezer.h> 225 226 #include <linux/smp.h> 226 227 #include <linux/dmi.h> 227 228 #include <linux/suspend.h> ··· 2312 2311 remove_proc_entry("apm", NULL); 2313 2312 return err; 2314 2313 } 2315 - kapmd_task->flags |= PF_NOFREEZE; 2316 2314 wake_up_process(kapmd_task); 2317 2315 2318 2316 if (num_online_cpus() > 1 && !smp ) {
+1
arch/i386/kernel/io_apic.c
··· 667 667 set_pending_irq(i, cpumask_of_cpu(0)); 668 668 } 669 669 670 + set_freezable(); 670 671 for ( ; ; ) { 671 672 time_remaining = schedule_timeout_interruptible(time_remaining); 672 673 try_to_freeze();
+1 -7
drivers/block/loop.c
··· 68 68 #include <linux/loop.h> 69 69 #include <linux/compat.h> 70 70 #include <linux/suspend.h> 71 + #include <linux/freezer.h> 71 72 #include <linux/writeback.h> 72 73 #include <linux/buffer_head.h> /* for invalidate_bdev() */ 73 74 #include <linux/completion.h> ··· 600 599 { 601 600 struct loop_device *lo = data; 602 601 struct bio *bio; 603 - 604 - /* 605 - * loop can be used in an encrypted device, 606 - * hence, it mustn't be stopped at all 607 - * because it could be indirectly used during suspension 608 - */ 609 - current->flags |= PF_NOFREEZE; 610 602 611 603 set_user_nice(current, -20); 612 604
+1
drivers/block/pktcdvd.c
··· 1593 1593 long min_sleep_time, residue; 1594 1594 1595 1595 set_user_nice(current, -20); 1596 + set_freezable(); 1596 1597 1597 1598 for (;;) { 1598 1599 DECLARE_WAITQUEUE(wait, current);
+1 -11
drivers/char/apm-emulation.c
··· 20 20 #include <linux/sched.h> 21 21 #include <linux/pm.h> 22 22 #include <linux/apm-emulation.h> 23 + #include <linux/freezer.h> 23 24 #include <linux/device.h> 24 25 #include <linux/kernel.h> 25 26 #include <linux/list.h> ··· 330 329 /* 331 330 * Wait for the suspend/resume to complete. If there 332 331 * are pending acknowledges, we wait here for them. 333 - * 334 - * Note: we need to ensure that the PM subsystem does 335 - * not kick us out of the wait when it suspends the 336 - * threads. 337 332 */ 338 333 flags = current->flags; 339 - current->flags |= PF_NOFREEZE; 340 334 341 335 wait_event(apm_suspend_waitqueue, 342 336 as->suspend_state == SUSPEND_DONE); ··· 361 365 /* 362 366 * Wait for the suspend/resume to complete. If there 363 367 * are pending acknowledges, we wait here for them. 364 - * 365 - * Note: we need to ensure that the PM subsystem does 366 - * not kick us out of the wait when it suspends the 367 - * threads. 368 368 */ 369 369 flags = current->flags; 370 - current->flags |= PF_NOFREEZE; 371 370 372 371 wait_event_interruptible(apm_suspend_waitqueue, 373 372 as->suspend_state == SUSPEND_DONE); ··· 589 598 kapmd_tsk = NULL; 590 599 return ret; 591 600 } 592 - kapmd_tsk->flags |= PF_NOFREEZE; 593 601 wake_up_process(kapmd_tsk); 594 602 595 603 #ifdef CONFIG_PROC_FS
+1
drivers/char/hvc_console.c
··· 679 679 int poll_mask; 680 680 struct hvc_struct *hp; 681 681 682 + set_freezable(); 682 683 __set_current_state(TASK_RUNNING); 683 684 do { 684 685 poll_mask = 0;
+1
drivers/edac/edac_mc.c
··· 1906 1906 1907 1907 static int edac_kernel_thread(void *arg) 1908 1908 { 1909 + set_freezable(); 1909 1910 while (!kthread_should_stop()) { 1910 1911 do_edac_check(); 1911 1912
+1 -2
drivers/ieee1394/ieee1394_core.c
··· 30 30 #include <linux/moduleparam.h> 31 31 #include <linux/bitops.h> 32 32 #include <linux/kdev_t.h> 33 + #include <linux/freezer.h> 33 34 #include <linux/suspend.h> 34 35 #include <linux/kthread.h> 35 36 #include <linux/preempt.h> ··· 1128 1127 struct hpsb_packet *packet, *p; 1129 1128 struct list_head tmp; 1130 1129 int may_schedule; 1131 - 1132 - current->flags |= PF_NOFREEZE; 1133 1130 1134 1131 while (!kthread_should_stop()) { 1135 1132
+1
drivers/ieee1394/nodemgr.c
··· 1699 1699 unsigned int g, generation = 0; 1700 1700 int i, reset_cycles = 0; 1701 1701 1702 + set_freezable(); 1702 1703 /* Setup our device-model entries */ 1703 1704 nodemgr_create_host_dev_files(host); 1704 1705
+1
drivers/input/gameport/gameport.c
··· 445 445 446 446 static int gameport_thread(void *nothing) 447 447 { 448 + set_freezable(); 448 449 do { 449 450 gameport_handle_event(); 450 451 wait_event_interruptible(gameport_wait,
+1
drivers/input/serio/serio.c
··· 384 384 385 385 static int serio_thread(void *nothing) 386 386 { 387 + set_freezable(); 387 388 do { 388 389 serio_handle_event(); 389 390 wait_event_interruptible(serio_wait,
+1
drivers/input/touchscreen/ucb1400_ts.c
··· 292 292 293 293 sched_setscheduler(tsk, SCHED_FIFO, &param); 294 294 295 + set_freezable(); 295 296 while (!kthread_should_stop()) { 296 297 unsigned int x, y, p; 297 298 long timeout;
+1
drivers/macintosh/therm_adt746x.c
··· 335 335 { 336 336 struct thermostat* th = arg; 337 337 338 + set_freezable(); 338 339 while(!kthread_should_stop()) { 339 340 try_to_freeze(); 340 341 msleep_interruptible(2000);
+1
drivers/macintosh/windfarm_core.c
··· 92 92 93 93 DBG("wf: thread started\n"); 94 94 95 + set_freezable(); 95 96 while(!kthread_should_stop()) { 96 97 if (time_after_eq(jiffies, next)) { 97 98 wf_notify(WF_EVENT_TICK, NULL);
-1
drivers/md/md.c
··· 4642 4642 * many dirty RAID5 blocks. 4643 4643 */ 4644 4644 4645 - current->flags |= PF_NOFREEZE; 4646 4645 allow_signal(SIGKILL); 4647 4646 while (!kthread_should_stop()) { 4648 4647
+1
drivers/media/dvb/dvb-core/dvb_frontend.c
··· 523 523 524 524 dvb_frontend_init(fe); 525 525 526 + set_freezable(); 526 527 while (1) { 527 528 up(&fepriv->sem); /* is locked when we enter the thread... */ 528 529 restart:
+1
drivers/media/video/cx88/cx88-tvaudio.c
··· 906 906 u32 mode = 0; 907 907 908 908 dprintk("cx88: tvaudio thread started\n"); 909 + set_freezable(); 909 910 for (;;) { 910 911 msleep_interruptible(1000); 911 912 if (kthread_should_stop())
+4 -2
drivers/media/video/msp3400-kthreads.c
··· 23 23 #include <linux/module.h> 24 24 #include <linux/slab.h> 25 25 #include <linux/i2c.h> 26 + #include <linux/freezer.h> 26 27 #include <linux/videodev.h> 27 28 #include <linux/videodev2.h> 28 29 #include <media/v4l2-common.h> ··· 469 468 470 469 471 470 v4l_dbg(1, msp_debug, client, "msp3400 daemon started\n"); 471 + set_freezable(); 472 472 for (;;) { 473 473 v4l_dbg(2, msp_debug, client, "msp3400 thread: sleep\n"); 474 474 msp_sleep(state, -1); ··· 648 646 int val, i, std, count; 649 647 650 648 v4l_dbg(1, msp_debug, client, "msp3410 daemon started\n"); 651 - 649 + set_freezable(); 652 650 for (;;) { 653 651 v4l_dbg(2, msp_debug, client, "msp3410 thread: sleep\n"); 654 652 msp_sleep(state,-1); ··· 942 940 int val, i; 943 941 944 942 v4l_dbg(1, msp_debug, client, "msp34xxg daemon started\n"); 945 - 943 + set_freezable(); 946 944 for (;;) { 947 945 v4l_dbg(2, msp_debug, client, "msp34xxg thread: sleep\n"); 948 946 msp_sleep(state, -1);
+1 -1
drivers/media/video/tvaudio.c
··· 271 271 struct CHIPDESC *desc = chiplist + chip->type; 272 272 273 273 v4l_dbg(1, debug, &chip->c, "%s: thread started\n", chip->c.name); 274 - 274 + set_freezable(); 275 275 for (;;) { 276 276 set_current_state(TASK_INTERRUPTIBLE); 277 277 if (!kthread_should_stop())
+1
drivers/media/video/video-buf-dvb.c
··· 47 47 int err; 48 48 49 49 dprintk("dvb thread started\n"); 50 + set_freezable(); 50 51 videobuf_read_start(&dvb->dvbq); 51 52 52 53 for (;;) {
+1
drivers/media/video/vivi.c
··· 573 573 dprintk(1,"thread started\n"); 574 574 575 575 mod_timer(&dma_q->timeout, jiffies+BUFFER_TIMEOUT); 576 + set_freezable(); 576 577 577 578 for (;;) { 578 579 vivi_sleep(dma_q);
+1
drivers/mfd/ucb1x00-ts.c
··· 209 209 DECLARE_WAITQUEUE(wait, tsk); 210 210 int valid = 0; 211 211 212 + set_freezable(); 212 213 add_wait_queue(&ts->irq_wait, &wait); 213 214 while (!kthread_should_stop()) { 214 215 unsigned int x, y, p;
+2 -5
drivers/mmc/card/queue.c
··· 11 11 */ 12 12 #include <linux/module.h> 13 13 #include <linux/blkdev.h> 14 + #include <linux/freezer.h> 14 15 #include <linux/kthread.h> 15 16 16 17 #include <linux/mmc/card.h> ··· 45 44 struct mmc_queue *mq = d; 46 45 struct request_queue *q = mq->queue; 47 46 48 - /* 49 - * Set iothread to ensure that we aren't put to sleep by 50 - * the process freezing. We handle suspension ourselves. 51 - */ 52 - current->flags |= PF_MEMALLOC|PF_NOFREEZE; 47 + current->flags |= PF_MEMALLOC; 53 48 54 49 down(&mq->thread_sem); 55 50 do {
+2 -1
drivers/mtd/mtd_blkdevs.c
··· 16 16 #include <linux/mtd/mtd.h> 17 17 #include <linux/blkdev.h> 18 18 #include <linux/blkpg.h> 19 + #include <linux/freezer.h> 19 20 #include <linux/spinlock.h> 20 21 #include <linux/hdreg.h> 21 22 #include <linux/init.h> ··· 81 80 struct request_queue *rq = tr->blkcore_priv->rq; 82 81 83 82 /* we might get involved when memory gets low, so use PF_MEMALLOC */ 84 - current->flags |= PF_MEMALLOC | PF_NOFREEZE; 83 + current->flags |= PF_MEMALLOC; 85 84 86 85 spin_lock_irq(rq->queue_lock); 87 86 while (!kthread_should_stop()) {
+1
drivers/mtd/ubi/wl.c
··· 1346 1346 ubi_msg("background thread \"%s\" started, PID %d", 1347 1347 ubi->bgt_name, current->pid); 1348 1348 1349 + set_freezable(); 1349 1350 for (;;) { 1350 1351 int err; 1351 1352
+2 -1
drivers/net/wireless/airo.c
··· 3086 3086 struct net_device *dev = data; 3087 3087 struct airo_info *ai = dev->priv; 3088 3088 int locked; 3089 - 3089 + 3090 + set_freezable(); 3090 3091 while(1) { 3091 3092 /* make swsusp happy with our thread */ 3092 3093 try_to_freeze();
+1
drivers/net/wireless/libertas/main.c
··· 613 613 614 614 init_waitqueue_entry(&wait, current); 615 615 616 + set_freezable(); 616 617 for (;;) { 617 618 lbs_deb_thread( "main-thread 111: intcounter=%d " 618 619 "currenttxskb=%p dnld_sent=%d\n",
+1
drivers/pcmcia/cs.c
··· 651 651 add_wait_queue(&skt->thread_wait, &wait); 652 652 complete(&skt->thread_done); 653 653 654 + set_freezable(); 654 655 for (;;) { 655 656 unsigned long flags; 656 657 unsigned int events;
+1
drivers/pnp/pnpbios/core.c
··· 160 160 { 161 161 static struct pnp_docking_station_info now; 162 162 int docked = -1, d = 0; 163 + set_freezable(); 163 164 while (!unloading) 164 165 { 165 166 int status;
+1 -2
drivers/scsi/libsas/sas_scsi_host.c
··· 40 40 41 41 #include <linux/err.h> 42 42 #include <linux/blkdev.h> 43 + #include <linux/freezer.h> 43 44 #include <linux/scatterlist.h> 44 45 45 46 /* ---------- SCSI Host glue ---------- */ ··· 868 867 static int sas_queue_thread(void *_sas_ha) 869 868 { 870 869 struct sas_ha_struct *sas_ha = _sas_ha; 871 - 872 - current->flags |= PF_NOFREEZE; 873 870 874 871 while (1) { 875 872 set_current_state(TASK_INTERRUPTIBLE);
+1 -2
drivers/scsi/scsi_error.c
··· 19 19 #include <linux/timer.h> 20 20 #include <linux/string.h> 21 21 #include <linux/kernel.h> 22 + #include <linux/freezer.h> 22 23 #include <linux/kthread.h> 23 24 #include <linux/interrupt.h> 24 25 #include <linux/blkdev.h> ··· 1516 1515 int scsi_error_handler(void *data) 1517 1516 { 1518 1517 struct Scsi_Host *shost = data; 1519 - 1520 - current->flags |= PF_NOFREEZE; 1521 1518 1522 1519 /* 1523 1520 * We use TASK_INTERRUPTIBLE so that the thread is not
+1
drivers/usb/atm/ueagle-atm.c
··· 1168 1168 struct uea_softc *sc = data; 1169 1169 int ret = -EAGAIN; 1170 1170 1171 + set_freezable(); 1171 1172 uea_enters(INS_TO_USBDEV(sc)); 1172 1173 while (!kthread_should_stop()) { 1173 1174 if (ret < 0 || sc->reset)
+1
drivers/usb/core/hub.c
··· 2728 2728 2729 2729 static int hub_thread(void *__unused) 2730 2730 { 2731 + set_freezable(); 2731 2732 do { 2732 2733 hub_events(); 2733 2734 wait_event_interruptible(khubd_wait,
+3
drivers/usb/gadget/file_storage.c
··· 3434 3434 allow_signal(SIGKILL); 3435 3435 allow_signal(SIGUSR1); 3436 3436 3437 + /* Allow the thread to be frozen */ 3438 + set_freezable(); 3439 + 3437 3440 /* Arrange for userspace references to be interpreted as kernel 3438 3441 * pointers. That way we can pass a kernel pointer to a routine 3439 3442 * that expects a __user pointer and it will work okay. */
+1 -2
drivers/usb/storage/usb.c
··· 311 311 struct Scsi_Host *host = us_to_host(us); 312 312 int autopm_rc; 313 313 314 - current->flags |= PF_NOFREEZE; 315 - 316 314 for(;;) { 317 315 US_DEBUGP("*** thread sleeping.\n"); 318 316 if(down_interruptible(&us->sema)) ··· 918 920 printk(KERN_DEBUG 919 921 "usb-storage: device found at %d\n", us->pusb_dev->devnum); 920 922 923 + set_freezable(); 921 924 /* Wait for the timeout to expire or for a disconnect */ 922 925 if (delay_use > 0) { 923 926 printk(KERN_DEBUG "usb-storage: waiting for device "
+1
drivers/video/ps3fb.c
··· 812 812 813 813 static int ps3fbd(void *arg) 814 814 { 815 + set_freezable(); 815 816 while (!kthread_should_stop()) { 816 817 try_to_freeze(); 817 818 set_current_state(TASK_INTERRUPTIBLE);
+1
drivers/w1/w1.c
··· 805 805 struct w1_master *dev, *n; 806 806 int have_to_wait = 0; 807 807 808 + set_freezable(); 808 809 while (!kthread_should_stop() || have_to_wait) { 809 810 have_to_wait = 0; 810 811
+1
fs/cifs/cifsfs.c
··· 849 849 __u16 netfid; 850 850 int rc; 851 851 852 + set_freezable(); 852 853 do { 853 854 if (try_to_freeze()) 854 855 continue;
+1
fs/cifs/connect.c
··· 363 363 GFP_KERNEL); 364 364 } 365 365 366 + set_freezable(); 366 367 while (!kthread_should_stop()) { 367 368 if (try_to_freeze()) 368 369 continue;
+1
fs/jffs2/background.c
··· 81 81 82 82 set_user_nice(current, 10); 83 83 84 + set_freezable(); 84 85 for (;;) { 85 86 allow_signal(SIGHUP); 86 87
+2
fs/lockd/svc.c
··· 25 25 #include <linux/smp.h> 26 26 #include <linux/smp_lock.h> 27 27 #include <linux/mutex.h> 28 + #include <linux/freezer.h> 28 29 29 30 #include <linux/sunrpc/types.h> 30 31 #include <linux/sunrpc/stats.h> ··· 120 119 complete(&lockd_start_done); 121 120 122 121 daemonize("lockd"); 122 + set_freezable(); 123 123 124 124 /* Process request with signals blocked, but allow SIGKILL. */ 125 125 allow_signal(SIGKILL);
+2
fs/nfs/callback.c
··· 14 14 #include <linux/sunrpc/svcsock.h> 15 15 #include <linux/nfs_fs.h> 16 16 #include <linux/mutex.h> 17 + #include <linux/freezer.h> 17 18 18 19 #include <net/inet_sock.h> 19 20 ··· 68 67 daemonize("nfsv4-svc"); 69 68 /* Process request with signals blocked, but allow SIGKILL. */ 70 69 allow_signal(SIGKILL); 70 + set_freezable(); 71 71 72 72 complete(&nfs_callback_info.started); 73 73
+2
fs/nfsd/nfssvc.c
··· 19 19 #include <linux/slab.h> 20 20 #include <linux/smp.h> 21 21 #include <linux/smp_lock.h> 22 + #include <linux/freezer.h> 22 23 #include <linux/fs_struct.h> 23 24 24 25 #include <linux/sunrpc/types.h> ··· 433 432 * dirty pages. 434 433 */ 435 434 current->flags |= PF_LESS_THROTTLE; 435 + set_freezable(); 436 436 437 437 /* 438 438 * The main request loop
+1
fs/xfs/linux-2.6/xfs_super.c
··· 562 562 bhv_vfs_sync_work_t *work, *n; 563 563 LIST_HEAD (tmp); 564 564 565 + set_freezable(); 565 566 timeleft = xfs_syncd_centisecs * msecs_to_jiffies(10); 566 567 for (;;) { 567 568 timeleft = schedule_timeout_interruptible(timeleft);
+14
include/linux/freezer.h
··· 1 1 /* Freezer declarations */ 2 2 3 + #ifndef FREEZER_H_INCLUDED 4 + #define FREEZER_H_INCLUDED 5 + 3 6 #include <linux/sched.h> 4 7 5 8 #ifdef CONFIG_PM ··· 118 115 return !!(p->flags & PF_FREEZER_SKIP); 119 116 } 120 117 118 + /* 119 + * Tell the freezer that the current task should be frozen by it 120 + */ 121 + static inline void set_freezable(void) 122 + { 123 + current->flags &= ~PF_NOFREEZE; 124 + } 125 + 121 126 #else 122 127 static inline int frozen(struct task_struct *p) { return 0; } 123 128 static inline int freezing(struct task_struct *p) { return 0; } ··· 141 130 static inline void freezer_do_not_count(void) {} 142 131 static inline void freezer_count(void) {} 143 132 static inline int freezer_should_skip(struct task_struct *p) { return 0; } 133 + static inline void set_freezable(void) {} 144 134 #endif 135 + 136 + #endif /* FREEZER_H_INCLUDED */
+2 -5
init/do_mounts_initrd.c
··· 56 56 sys_chroot("."); 57 57 58 58 pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD); 59 - if (pid > 0) { 60 - while (pid != sys_wait4(-1, NULL, 0, NULL)) { 61 - try_to_freeze(); 59 + if (pid > 0) 60 + while (pid != sys_wait4(-1, NULL, 0, NULL)) 62 61 yield(); 63 - } 64 - } 65 62 66 63 /* move initrd to rootfs' /old */ 67 64 sys_fchdir(old_fd);
+1
kernel/audit.c
··· 392 392 { 393 393 struct sk_buff *skb; 394 394 395 + set_freezable(); 395 396 while (!kthread_should_stop()) { 396 397 skb = skb_dequeue(&audit_skb_queue); 397 398 wake_up(&audit_backlog_wait);
+6
kernel/exit.c
··· 31 31 #include <linux/mempolicy.h> 32 32 #include <linux/taskstats_kern.h> 33 33 #include <linux/delayacct.h> 34 + #include <linux/freezer.h> 34 35 #include <linux/cpuset.h> 35 36 #include <linux/syscalls.h> 36 37 #include <linux/signal.h> ··· 388 387 * they would be locked into memory. 389 388 */ 390 389 exit_mm(current); 390 + /* 391 + * We don't want to have TIF_FREEZE set if the system-wide hibernation 392 + * or suspend transition begins right now. 393 + */ 394 + current->flags |= PF_NOFREEZE; 391 395 392 396 set_special_pids(1, 1); 393 397 proc_clear_tty(current);
+1 -1
kernel/fork.c
··· 923 923 { 924 924 unsigned long new_flags = p->flags; 925 925 926 - new_flags &= ~(PF_SUPERPRIV | PF_NOFREEZE); 926 + new_flags &= ~PF_SUPERPRIV; 927 927 new_flags |= PF_FORKNOEXEC; 928 928 if (!(clone_flags & CLONE_PTRACE)) 929 929 p->ptrace = 0;
+1 -3
kernel/rcutorture.c
··· 40 40 #include <linux/moduleparam.h> 41 41 #include <linux/percpu.h> 42 42 #include <linux/notifier.h> 43 + #include <linux/freezer.h> 43 44 #include <linux/cpu.h> 44 45 #include <linux/random.h> 45 46 #include <linux/delay.h> ··· 519 518 520 519 VERBOSE_PRINTK_STRING("rcu_torture_writer task started"); 521 520 set_user_nice(current, 19); 522 - current->flags |= PF_NOFREEZE; 523 521 524 522 do { 525 523 schedule_timeout_uninterruptible(1); ··· 558 558 559 559 VERBOSE_PRINTK_STRING("rcu_torture_fakewriter task started"); 560 560 set_user_nice(current, 19); 561 - current->flags |= PF_NOFREEZE; 562 561 563 562 do { 564 563 schedule_timeout_uninterruptible(1 + rcu_random(&rand)%10); ··· 588 589 589 590 VERBOSE_PRINTK_STRING("rcu_torture_reader task started"); 590 591 set_user_nice(current, 19); 591 - current->flags |= PF_NOFREEZE; 592 592 593 593 do { 594 594 idx = cur_ops->readlock();
+1
kernel/rtmutex-tester.c
··· 260 260 int ret; 261 261 262 262 current->flags |= PF_MUTEX_TESTER; 263 + set_freezable(); 263 264 allow_signal(SIGHUP); 264 265 265 266 for(;;) {
-3
kernel/sched.c
··· 4912 4912 struct migration_req *req; 4913 4913 struct list_head *head; 4914 4914 4915 - try_to_freeze(); 4916 - 4917 4915 spin_lock_irq(&rq->lock); 4918 4916 4919 4917 if (cpu_is_offline(cpu)) { ··· 5145 5147 p = kthread_create(migration_thread, hcpu, "migration/%d", cpu); 5146 5148 if (IS_ERR(p)) 5147 5149 return NOTIFY_BAD; 5148 - p->flags |= PF_NOFREEZE; 5149 5150 kthread_bind(p, cpu); 5150 5151 /* Must be high prio: stop_machine expects to yield to it. */ 5151 5152 rq = task_rq_lock(p, &flags);
+1 -2
kernel/softirq.c
··· 14 14 #include <linux/notifier.h> 15 15 #include <linux/percpu.h> 16 16 #include <linux/cpu.h> 17 + #include <linux/freezer.h> 17 18 #include <linux/kthread.h> 18 19 #include <linux/rcupdate.h> 19 20 #include <linux/smp.h> ··· 489 488 490 489 static int ksoftirqd(void * __bind_cpu) 491 490 { 492 - current->flags |= PF_NOFREEZE; 493 - 494 491 set_current_state(TASK_INTERRUPTIBLE); 495 492 496 493 while (!kthread_should_stop()) {
+1 -1
kernel/softlockup.c
··· 10 10 #include <linux/cpu.h> 11 11 #include <linux/init.h> 12 12 #include <linux/delay.h> 13 + #include <linux/freezer.h> 13 14 #include <linux/kthread.h> 14 15 #include <linux/notifier.h> 15 16 #include <linux/module.h> ··· 117 116 struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; 118 117 119 118 sched_setscheduler(current, SCHED_FIFO, &param); 120 - current->flags |= PF_NOFREEZE; 121 119 122 120 /* initialize timestamp */ 123 121 touch_softlockup_watchdog();
+2 -2
kernel/workqueue.c
··· 282 282 struct cpu_workqueue_struct *cwq = __cwq; 283 283 DEFINE_WAIT(wait); 284 284 285 - if (!cwq->wq->freezeable) 286 - current->flags |= PF_NOFREEZE; 285 + if (cwq->wq->freezeable) 286 + set_freezable(); 287 287 288 288 set_user_nice(current, -5); 289 289
+1
mm/pdflush.c
··· 92 92 static int __pdflush(struct pdflush_work *my_work) 93 93 { 94 94 current->flags |= PF_FLUSHER | PF_SWAPWRITE; 95 + set_freezable(); 95 96 my_work->fn = NULL; 96 97 my_work->who = current; 97 98 INIT_LIST_HEAD(&my_work->list);
+1
mm/vmscan.c
··· 1421 1421 * trying to free the first piece of memory in the first place). 1422 1422 */ 1423 1423 tsk->flags |= PF_MEMALLOC | PF_SWAPWRITE | PF_KSWAPD; 1424 + set_freezable(); 1424 1425 1425 1426 order = 0; 1426 1427 for ( ; ; ) {
+1 -1
net/bluetooth/bnep/core.c
··· 36 36 #include <linux/signal.h> 37 37 #include <linux/init.h> 38 38 #include <linux/wait.h> 39 + #include <linux/freezer.h> 39 40 #include <linux/errno.h> 40 41 #include <linux/net.h> 41 42 #include <net/sock.h> ··· 475 474 476 475 daemonize("kbnepd %s", dev->name); 477 476 set_user_nice(current, -15); 478 - current->flags |= PF_NOFREEZE; 479 477 480 478 init_waitqueue_entry(&wait, current); 481 479 add_wait_queue(sk->sk_sleep, &wait);
+1 -1
net/bluetooth/cmtp/core.c
··· 29 29 #include <linux/slab.h> 30 30 #include <linux/poll.h> 31 31 #include <linux/fcntl.h> 32 + #include <linux/freezer.h> 32 33 #include <linux/skbuff.h> 33 34 #include <linux/socket.h> 34 35 #include <linux/ioctl.h> ··· 288 287 289 288 daemonize("kcmtpd_ctr_%d", session->num); 290 289 set_user_nice(current, -15); 291 - current->flags |= PF_NOFREEZE; 292 290 293 291 init_waitqueue_entry(&wait, current); 294 292 add_wait_queue(sk->sk_sleep, &wait);
+1 -1
net/bluetooth/hidp/core.c
··· 28 28 #include <linux/sched.h> 29 29 #include <linux/slab.h> 30 30 #include <linux/poll.h> 31 + #include <linux/freezer.h> 31 32 #include <linux/fcntl.h> 32 33 #include <linux/skbuff.h> 33 34 #include <linux/socket.h> ··· 548 547 549 548 daemonize("khidpd_%04x%04x", vendor, product); 550 549 set_user_nice(current, -15); 551 - current->flags |= PF_NOFREEZE; 552 550 553 551 init_waitqueue_entry(&ctrl_wait, current); 554 552 init_waitqueue_entry(&intr_wait, current);
+1 -1
net/bluetooth/rfcomm/core.c
··· 33 33 #include <linux/sched.h> 34 34 #include <linux/signal.h> 35 35 #include <linux/init.h> 36 + #include <linux/freezer.h> 36 37 #include <linux/wait.h> 37 38 #include <linux/device.h> 38 39 #include <linux/net.h> ··· 1941 1940 1942 1941 daemonize("krfcommd"); 1943 1942 set_user_nice(current, -10); 1944 - current->flags |= PF_NOFREEZE; 1945 1943 1946 1944 BT_DBG(""); 1947 1945
+2
net/core/pktgen.c
··· 3465 3465 3466 3466 set_current_state(TASK_INTERRUPTIBLE); 3467 3467 3468 + set_freezable(); 3469 + 3468 3470 while (!kthread_should_stop()) { 3469 3471 pkt_dev = next_to_run(t); 3470 3472