diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/power/hibernate.c | 12 | ||||
| -rw-r--r-- | kernel/power/power.h | 3 | ||||
| -rw-r--r-- | kernel/power/process.c | 30 | 
3 files changed, 30 insertions, 15 deletions
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 8f7b1db1ece..3a20466015f 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c @@ -334,13 +334,17 @@ int hibernation_snapshot(int platform_mode)  	if (error)  		goto Close; -	error = dpm_prepare(PMSG_FREEZE); -	if (error) -		goto Complete_devices; -  	/* Preallocate image memory before shutting down devices. */  	error = hibernate_preallocate_memory();  	if (error) +		goto Close; + +	error = freeze_kernel_threads(); +	if (error) +		goto Close; + +	error = dpm_prepare(PMSG_FREEZE); +	if (error)  		goto Complete_devices;  	suspend_console(); diff --git a/kernel/power/power.h b/kernel/power/power.h index 9a00a0a2628..e6206397ce6 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h @@ -228,7 +228,8 @@ extern int pm_test_level;  #ifdef CONFIG_SUSPEND_FREEZER  static inline int suspend_freeze_processes(void)  { -	return freeze_processes(); +	int error = freeze_processes(); +	return error ? : freeze_kernel_threads();  }  static inline void suspend_thaw_processes(void) diff --git a/kernel/power/process.c b/kernel/power/process.c index 0cf3a27a6c9..addbbe5531b 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c @@ -135,7 +135,7 @@ static int try_to_freeze_tasks(bool sig_only)  }  /** - *	freeze_processes - tell processes to enter the refrigerator + * freeze_processes - Signal user space processes to enter the refrigerator.   */  int freeze_processes(void)  { @@ -143,20 +143,30 @@ int freeze_processes(void)  	printk("Freezing user space processes ... ");  	error = try_to_freeze_tasks(true); -	if (error) -		goto Exit; -	printk("done.\n"); +	if (!error) { +		printk("done."); +		oom_killer_disable(); +	} +	printk("\n"); +	BUG_ON(in_atomic()); + +	return error; +} + +/** + * freeze_kernel_threads - Make freezable kernel threads go to the refrigerator. + */ +int freeze_kernel_threads(void) +{ +	int error;  	printk("Freezing remaining freezable tasks ... ");  	error = try_to_freeze_tasks(false); -	if (error) -		goto Exit; -	printk("done."); +	if (!error) +		printk("done."); -	oom_killer_disable(); - Exit: -	BUG_ON(in_atomic());  	printk("\n"); +	BUG_ON(in_atomic());  	return error;  }  |