extern bool __refrigerator(bool check_kthr_stop);
extern int freeze_processes(void);
+extern int freeze_processes_ignore_wakeup(void);
extern int freeze_kernel_threads(void);
extern void thaw_processes(void);
extern void thaw_kernel_threads(void);
static inline bool __refrigerator(bool check_kthr_stop) { return false; }
static inline int freeze_processes(void) { return -ENOSYS; }
+static inline int freeze_processes_ignore_wakeup(void) { return -ENOSYS; }
static inline int freeze_kernel_threads(void) { return -ENOSYS; }
static inline void thaw_processes(void) {}
static inline void thaw_kernel_threads(void) {}
*/
unsigned int __read_mostly freeze_timeout_msecs = 20 * MSEC_PER_SEC;
-static int try_to_freeze_tasks(bool user_only)
+static int try_to_freeze_tasks(bool user_only, bool ignore_wakeup)
{
struct task_struct *g, *p;
unsigned long end_time;
if (!todo || time_after(jiffies, end_time))
break;
- if (pm_wakeup_pending()) {
+ if (!ignore_wakeup && pm_wakeup_pending()) {
#ifdef CONFIG_PM_SLEEP
pm_get_active_wakeup_sources(suspend_abort,
MAX_SUSPEND_ABORT_LEN);
*
* On success, returns 0. On failure, -errno and system is fully thawed.
*/
-int freeze_processes(void)
+static int __freeze_processes(bool ignore_wakeup)
{
int error;
int oom_kills_saved;
printk("Freezing user space processes ... ");
pm_freezing = true;
oom_kills_saved = oom_kills_count();
- error = try_to_freeze_tasks(true);
+ error = try_to_freeze_tasks(true, ignore_wakeup);
if (!error) {
__usermodehelper_set_disable_depth(UMH_DISABLED);
oom_killer_disable();
return error;
}
+int freeze_processes(void)
+{
+ return __freeze_processes(false);
+}
+
+int freeze_processes_ignore_wakeup(void)
+{
+ return __freeze_processes(true);
+}
+
/**
* freeze_kernel_threads - Make freezable kernel threads go to the refrigerator.
*
printk("Freezing remaining freezable tasks ... ");
pm_nosig_freezing = true;
- error = try_to_freeze_tasks(false);
+ error = try_to_freeze_tasks(false, false);
if (!error)
printk("done.");
#include <linux/syscalls.h>
#include <linux/syscore_ops.h>
#include <linux/uaccess.h>
+#include <linux/freezer.h>
/*
* this indicates whether you can reboot with ctrl-alt-del: the default is yes
*/
void kernel_restart(char *cmd)
{
+ freeze_processes_ignore_wakeup();
kernel_restart_prepare(cmd);
migrate_to_reboot_cpu();
syscore_shutdown();
*/
void kernel_power_off(void)
{
+ freeze_processes_ignore_wakeup();
kernel_shutdown_prepare(SYSTEM_POWER_OFF);
if (pm_power_off_prepare)
pm_power_off_prepare();