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

PM / Freezer / Docs: Update documentation about freezing of tasks

The file Documentation/power/freezing-of-tasks.txt was still referencing
the TIF_FREEZE flag, that was removed by the commit
d88e4cb67197d007fb778d62fe17360e970d5bfa(freezer: remove now unused
TIF_FREEZE).

This patch removes all the references of TIF_FREEZE that were left
behind.

Signed-off-by: Marcos Paulo de Souza <marcos.souza.org@gmail.com>
Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>

authored by

Marcos Paulo de Souza and committed by
Rafael J. Wysocki
26e0f90f f8262d47

+19 -18
+19 -18
Documentation/power/freezing-of-tasks.txt
··· 9 9 10 10 II. How does it work? 11 11 12 - There are four per-task flags used for that, PF_NOFREEZE, PF_FROZEN, TIF_FREEZE 12 + There are three per-task flags used for that, PF_NOFREEZE, PF_FROZEN 13 13 and PF_FREEZER_SKIP (the last one is auxiliary). The tasks that have 14 14 PF_NOFREEZE unset (all user space processes and some kernel threads) are 15 15 regarded as 'freezable' and treated in a special way before the system enters a ··· 17 17 we only consider hibernation, but the description also applies to suspend). 18 18 19 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 - either wakes them up, if they are kernel threads, or sends fake signals to them, 23 - if they are user space processes. A task that has TIF_FREEZE set, should react 24 - to it by calling the function called __refrigerator() (defined in 25 - kernel/freezer.c), which sets the task's PF_FROZEN flag, changes its state 26 - to TASK_UNINTERRUPTIBLE and makes it loop until PF_FROZEN is cleared for it. 27 - Then, we say that the task is 'frozen' and therefore the set of functions 28 - handling this mechanism is referred to as 'the freezer' (these functions are 29 - defined in kernel/power/process.c, kernel/freezer.c & include/linux/freezer.h). 30 - User space processes are generally frozen before kernel threads. 20 + freeze_processes() (defined in kernel/power/process.c) is called. A system-wide 21 + variable system_freezing_cnt (as opposed to a per-task flag) is used to indicate 22 + whether the system is to undergo a freezing operation. And freeze_processes() 23 + sets this variable. After this, it executes try_to_freeze_tasks() that sends a 24 + fake signal to all user space processes, and wakes up all the kernel threads. 25 + All freezable tasks must react to that by calling try_to_freeze(), which 26 + results in a call to __refrigerator() (defined in kernel/freezer.c), which sets 27 + the task's PF_FROZEN flag, changes its state to TASK_UNINTERRUPTIBLE and makes 28 + it loop until PF_FROZEN is cleared for it. Then, we say that the task is 29 + 'frozen' and therefore the set of functions handling this mechanism is referred 30 + to as 'the freezer' (these functions are defined in kernel/power/process.c, 31 + kernel/freezer.c & include/linux/freezer.h). User space processes are generally 32 + frozen before kernel threads. 31 33 32 34 __refrigerator() must not be called directly. Instead, use the 33 35 try_to_freeze() function (defined in include/linux/freezer.h), that checks 34 - the task's TIF_FREEZE flag and makes the task enter __refrigerator() if the 35 - flag is set. 36 + if the task is to be frozen and makes the task enter __refrigerator(). 36 37 37 38 For user space processes try_to_freeze() is called automatically from the 38 39 signal-handling code, but the freezable kernel threads need to call it 39 40 explicitly in suitable places or use the wait_event_freezable() or 40 41 wait_event_freezable_timeout() macros (defined in include/linux/freezer.h) 41 - that combine interruptible sleep with checking if TIF_FREEZE is set and calling 42 - try_to_freeze(). The main loop of a freezable kernel thread may look like the 43 - following one: 42 + that combine interruptible sleep with checking if the task is to be frozen and 43 + calling try_to_freeze(). The main loop of a freezable kernel thread may look 44 + like the following one: 44 45 45 46 set_freezable(); 46 47 do { ··· 54 53 (from drivers/usb/core/hub.c::hub_thread()). 55 54 56 55 If a freezable kernel thread fails to call try_to_freeze() after the freezer has 57 - set TIF_FREEZE for it, the freezing of tasks will fail and the entire 56 + initiated a freezing operation, the freezing of tasks will fail and the entire 58 57 hibernation operation will be cancelled. For this reason, freezable kernel 59 58 threads must call try_to_freeze() somewhere or use one of the 60 59 wait_event_freezable() and wait_event_freezable_timeout() macros.