Skip to content

Commit

Permalink
PM / Sleep: Move disabling of usermode helpers to the freezer
Browse files Browse the repository at this point in the history
The core suspend/hibernation code calls usermodehelper_disable() to
avoid race conditions between the freezer and the starting of
usermode helpers and each code path has to do that on its own.
However, it is always called right before freeze_processes()
and usermodehelper_enable() is always called right after
thaw_processes().  For this reason, to avoid code duplication and
to make the connection between usermodehelper_disable() and the
freezer more visible, make freeze_processes() call it and remove the
direct usermodehelper_disable() and usermodehelper_enable() calls
from all suspend/hibernation code paths.

Signed-off-by: Rafael J. Wysocki <[email protected]>
Acked-by: Greg Kroah-Hartman <[email protected]>
Cc: [email protected]
  • Loading branch information
rjwysocki committed Mar 28, 2012
1 parent 7b5179a commit 1e73203
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 27 deletions.
11 changes: 0 additions & 11 deletions kernel/power/hibernate.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
#include <linux/string.h>
#include <linux/device.h>
#include <linux/async.h>
#include <linux/kmod.h>
#include <linux/delay.h>
#include <linux/fs.h>
#include <linux/mount.h>
Expand Down Expand Up @@ -620,10 +619,6 @@ int hibernate(void)
sys_sync();
printk("done.\n");

error = usermodehelper_disable();
if (error)
goto Exit;

error = freeze_processes();
if (error)
goto Free_bitmaps;
Expand Down Expand Up @@ -660,7 +655,6 @@ int hibernate(void)
freezer_test_done = false;

Free_bitmaps:
usermodehelper_enable();
free_basic_memory_bitmaps();
Exit:
pm_notifier_call_chain(PM_POST_HIBERNATION);
Expand Down Expand Up @@ -780,10 +774,6 @@ static int software_resume(void)
if (error)
goto close_finish;

error = usermodehelper_disable();
if (error)
goto close_finish;

pr_debug("PM: Preparing processes for restore.\n");
error = freeze_processes();
if (error) {
Expand All @@ -802,7 +792,6 @@ static int software_resume(void)
swsusp_free();
thaw_processes();
Done:
usermodehelper_enable();
free_basic_memory_bitmaps();
Finish:
pm_notifier_call_chain(PM_POST_RESTORE);
Expand Down
7 changes: 7 additions & 0 deletions kernel/power/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <linux/freezer.h>
#include <linux/delay.h>
#include <linux/workqueue.h>
#include <linux/kmod.h>

/*
* Timeout for stopping processes
Expand Down Expand Up @@ -122,6 +123,10 @@ int freeze_processes(void)
{
int error;

error = usermodehelper_disable();
if (error)
return error;

if (!pm_freezing)
atomic_inc(&system_freezing_cnt);

Expand Down Expand Up @@ -187,6 +192,8 @@ void thaw_processes(void)
} while_each_thread(g, p);
read_unlock(&tasklist_lock);

usermodehelper_enable();

schedule();
printk("done.\n");
}
Expand Down
7 changes: 0 additions & 7 deletions kernel/power/suspend.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/kmod.h>
#include <linux/console.h>
#include <linux/cpu.h>
#include <linux/syscalls.h>
Expand Down Expand Up @@ -102,17 +101,12 @@ static int suspend_prepare(void)
if (error)
goto Finish;

error = usermodehelper_disable();
if (error)
goto Finish;

error = suspend_freeze_processes();
if (!error)
return 0;

suspend_stats.failed_freeze++;
dpm_save_failed_step(SUSPEND_FREEZE);
usermodehelper_enable();
Finish:
pm_notifier_call_chain(PM_POST_SUSPEND);
pm_restore_console();
Expand Down Expand Up @@ -259,7 +253,6 @@ int suspend_devices_and_enter(suspend_state_t state)
static void suspend_finish(void)
{
suspend_thaw_processes();
usermodehelper_enable();
pm_notifier_call_chain(PM_POST_SUSPEND);
pm_restore_console();
}
Expand Down
10 changes: 1 addition & 9 deletions kernel/power/user.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#include <linux/suspend.h>
#include <linux/syscalls.h>
#include <linux/reboot.h>
#include <linux/kmod.h>
#include <linux/string.h>
#include <linux/device.h>
#include <linux/miscdevice.h>
Expand Down Expand Up @@ -222,14 +221,8 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
sys_sync();
printk("done.\n");

error = usermodehelper_disable();
if (error)
break;

error = freeze_processes();
if (error)
usermodehelper_enable();
else
if (!error)
data->frozen = 1;
break;

Expand All @@ -238,7 +231,6 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
break;
pm_restore_gfp_mask();
thaw_processes();
usermodehelper_enable();
data->frozen = 0;
break;

Expand Down

0 comments on commit 1e73203

Please sign in to comment.