Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a0acae0e authored by Tejun Heo's avatar Tejun Heo
Browse files

freezer: unexport refrigerator() and update try_to_freeze() slightly



There is no reason to export two functions for entering the
refrigerator.  Calling refrigerator() instead of try_to_freeze()
doesn't save anything noticeable or removes any race condition.

* Rename refrigerator() to __refrigerator() and make it return bool
  indicating whether it scheduled out for freezing.

* Update try_to_freeze() to return bool and relay the return value of
  __refrigerator() if freezing().

* Convert all refrigerator() users to try_to_freeze().

* Update documentation accordingly.

* While at it, add might_sleep() to try_to_freeze().

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Samuel Ortiz <samuel@sortiz.org>
Cc: Chris Mason <chris.mason@oracle.com>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Steven Whitehouse <swhiteho@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jan Kara <jack@suse.cz>
Cc: KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp>
Cc: Christoph Hellwig <hch@infradead.org>
parent 3a7cbd50
Loading
Loading
Loading
Loading
+6 −6
Original line number Original line Diff line number Diff line
@@ -21,7 +21,7 @@ freeze_processes() (defined in kernel/power/process.c) is called. It executes
try_to_freeze_tasks() that sets TIF_FREEZE for all of the freezable tasks and
try_to_freeze_tasks() that sets TIF_FREEZE for all of the freezable tasks and
either wakes them up, if they are kernel threads, or sends fake signals to them,
either wakes them up, if they are kernel threads, or sends fake signals to them,
if they are user space processes.  A task that has TIF_FREEZE set, should react
if they are user space processes.  A task that has TIF_FREEZE set, should react
to it by calling the function called refrigerator() (defined in
to it by calling the function called __refrigerator() (defined in
kernel/freezer.c), which sets the task's PF_FROZEN flag, changes its state
kernel/freezer.c), which sets the task's PF_FROZEN flag, changes its state
to TASK_UNINTERRUPTIBLE and makes it loop until PF_FROZEN is cleared for it.
to TASK_UNINTERRUPTIBLE and makes it loop until PF_FROZEN is cleared for it.
Then, we say that the task is 'frozen' and therefore the set of functions
Then, we say that the task is 'frozen' and therefore the set of functions
@@ -29,10 +29,10 @@ handling this mechanism is referred to as 'the freezer' (these functions are
defined in kernel/power/process.c, kernel/freezer.c & include/linux/freezer.h).
defined in kernel/power/process.c, kernel/freezer.c & include/linux/freezer.h).
User space processes are generally frozen before kernel threads.
User space processes are generally frozen before kernel threads.


It is not recommended to call refrigerator() directly.  Instead, it is
__refrigerator() must not be called directly.  Instead, use the
recommended to use the try_to_freeze() function (defined in
try_to_freeze() function (defined in include/linux/freezer.h), that checks
include/linux/freezer.h), that checks the task's TIF_FREEZE flag and makes the
the task's TIF_FREEZE flag and makes the task enter __refrigerator() if the
task enter refrigerator() if the flag is set.
flag is set.


For user space processes try_to_freeze() is called automatically from the
For user space processes try_to_freeze() is called automatically from the
signal-handling code, but the freezable kernel threads need to call it
signal-handling code, but the freezable kernel threads need to call it
@@ -61,7 +61,7 @@ wait_event_freezable() and wait_event_freezable_timeout() macros.
After the system memory state has been restored from a hibernation image and
After the system memory state has been restored from a hibernation image and
devices have been reinitialized, the function thaw_processes() is called in
devices have been reinitialized, the function thaw_processes() is called in
order to clear the PF_FROZEN flag for each frozen task.  Then, the tasks that
order to clear the PF_FROZEN flag for each frozen task.  Then, the tasks that
have been frozen leave refrigerator() and continue running.
have been frozen leave __refrigerator() and continue running.


III. Which kernel threads are freezable?
III. Which kernel threads are freezable?


+1 −1
Original line number Original line Diff line number Diff line
@@ -750,7 +750,7 @@ static int stir_transmit_thread(void *arg)


			write_reg(stir, REG_CTRL1, CTRL1_TXPWD|CTRL1_RXPWD);
			write_reg(stir, REG_CTRL1, CTRL1_TXPWD|CTRL1_RXPWD);


			refrigerator();
			try_to_freeze();


			if (change_speed(stir, stir->speed))
			if (change_speed(stir, stir->speed))
				break;
				break;
+1 −1
Original line number Original line Diff line number Diff line
@@ -340,7 +340,7 @@ static int worker_loop(void *arg)
		if (freezing(current)) {
		if (freezing(current)) {
			worker->working = 0;
			worker->working = 0;
			spin_unlock_irq(&worker->lock);
			spin_unlock_irq(&worker->lock);
			refrigerator();
			try_to_freeze();
		} else {
		} else {
			spin_unlock_irq(&worker->lock);
			spin_unlock_irq(&worker->lock);
			if (!kthread_should_stop()) {
			if (!kthread_should_stop()) {
+2 −6
Original line number Original line Diff line number Diff line
@@ -1579,9 +1579,7 @@ static int cleaner_kthread(void *arg)
			btrfs_run_defrag_inodes(root->fs_info);
			btrfs_run_defrag_inodes(root->fs_info);
		}
		}


		if (freezing(current)) {
		if (!try_to_freeze()) {
			refrigerator();
		} else {
			set_current_state(TASK_INTERRUPTIBLE);
			set_current_state(TASK_INTERRUPTIBLE);
			if (!kthread_should_stop())
			if (!kthread_should_stop())
				schedule();
				schedule();
@@ -1635,9 +1633,7 @@ static int transaction_kthread(void *arg)
		wake_up_process(root->fs_info->cleaner_kthread);
		wake_up_process(root->fs_info->cleaner_kthread);
		mutex_unlock(&root->fs_info->transaction_kthread_mutex);
		mutex_unlock(&root->fs_info->transaction_kthread_mutex);


		if (freezing(current)) {
		if (!try_to_freeze()) {
			refrigerator();
		} else {
			set_current_state(TASK_INTERRUPTIBLE);
			set_current_state(TASK_INTERRUPTIBLE);
			if (!kthread_should_stop() &&
			if (!kthread_should_stop() &&
			    !btrfs_transaction_blocked(root->fs_info))
			    !btrfs_transaction_blocked(root->fs_info))
+1 −2
Original line number Original line Diff line number Diff line
@@ -2882,8 +2882,7 @@ static int ext4_lazyinit_thread(void *arg)
		}
		}
		mutex_unlock(&eli->li_list_mtx);
		mutex_unlock(&eli->li_list_mtx);


		if (freezing(current))
		try_to_freeze();
			refrigerator();


		cur = jiffies;
		cur = jiffies;
		if ((time_after_eq(cur, next_wakeup)) ||
		if ((time_after_eq(cur, next_wakeup)) ||
Loading