diff options
Diffstat (limited to 'kernel/power')
| -rw-r--r-- | kernel/power/Makefile | 5 | ||||
| -rw-r--r-- | kernel/power/hibernate.c | 7 | ||||
| -rw-r--r-- | kernel/power/process.c | 8 | ||||
| -rw-r--r-- | kernel/power/suspend.c | 5 | 
4 files changed, 16 insertions, 9 deletions
diff --git a/kernel/power/Makefile b/kernel/power/Makefile index f9063c6b185..b75597235d8 100644 --- a/kernel/power/Makefile +++ b/kernel/power/Makefile @@ -1,7 +1,4 @@ - -ifeq ($(CONFIG_PM_DEBUG),y) -EXTRA_CFLAGS	+=	-DDEBUG -endif +ccflags-$(CONFIG_PM_DEBUG)	:=	-DDEBUG  obj-$(CONFIG_PM)		+= main.o  obj-$(CONFIG_PM_SLEEP)		+= console.o diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index b6279be691a..1832bd26421 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c @@ -62,7 +62,7 @@ void hibernation_set_ops(const struct platform_hibernation_ops *ops)  {  	if (ops && !(ops->begin && ops->end &&  ops->pre_snapshot  	    && ops->prepare && ops->finish && ops->enter && ops->pre_restore -	    && ops->restore_cleanup)) { +	    && ops->restore_cleanup && ops->leave)) {  		WARN_ON(1);  		return;  	} @@ -278,7 +278,7 @@ static int create_image(int platform_mode)  		goto Enable_irqs;  	} -	if (hibernation_test(TEST_CORE) || !pm_check_wakeup_events()) +	if (hibernation_test(TEST_CORE) || pm_wakeup_pending())  		goto Power_up;  	in_suspend = 1; @@ -516,7 +516,7 @@ int hibernation_platform_enter(void)  	local_irq_disable();  	sysdev_suspend(PMSG_HIBERNATE); -	if (!pm_check_wakeup_events()) { +	if (pm_wakeup_pending()) {  		error = -EAGAIN;  		goto Power_up;  	} @@ -647,6 +647,7 @@ int hibernate(void)  		swsusp_free();  		if (!error)  			power_down(); +		in_suspend = 0;  		pm_restore_gfp_mask();  	} else {  		pr_debug("PM: Image restored successfully.\n"); diff --git a/kernel/power/process.c b/kernel/power/process.c index e50b4c1b2a0..d6d2a10320e 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c @@ -64,6 +64,12 @@ static int try_to_freeze_tasks(bool sig_only)  			 * perturb a task in TASK_STOPPED or TASK_TRACED.  			 * It is "frozen enough".  If the task does wake  			 * up, it will immediately call try_to_freeze. +			 * +			 * Because freeze_task() goes through p's +			 * scheduler lock after setting TIF_FREEZE, it's +			 * guaranteed that either we see TASK_RUNNING or +			 * try_to_stop() after schedule() in ptrace/signal +			 * stop sees TIF_FREEZE.  			 */  			if (!task_is_stopped_or_traced(p) &&  			    !freezer_should_skip(p)) @@ -79,7 +85,7 @@ static int try_to_freeze_tasks(bool sig_only)  		if (!todo || time_after(jiffies, end_time))  			break; -		if (!pm_check_wakeup_events()) { +		if (pm_wakeup_pending()) {  			wakeup = true;  			break;  		} diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index ea64ece26d9..de6f86bfa30 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -22,6 +22,7 @@  #include <linux/mm.h>  #include <linux/slab.h>  #include <linux/suspend.h> +#include <trace/events/power.h>  #include "power.h" @@ -163,7 +164,7 @@ static int suspend_enter(suspend_state_t state)  	error = sysdev_suspend(PMSG_SUSPEND);  	if (!error) { -		if (!suspend_test(TEST_CORE) && pm_check_wakeup_events()) { +		if (!(suspend_test(TEST_CORE) || pm_wakeup_pending())) {  			error = suspend_ops->enter(state);  			events_check_enabled = false;  		} @@ -201,6 +202,7 @@ int suspend_devices_and_enter(suspend_state_t state)  	if (!suspend_ops)  		return -ENOSYS; +	trace_machine_suspend(state);  	if (suspend_ops->begin) {  		error = suspend_ops->begin(state);  		if (error) @@ -229,6 +231,7 @@ int suspend_devices_and_enter(suspend_state_t state)   Close:  	if (suspend_ops->end)  		suspend_ops->end(); +	trace_machine_suspend(PWR_EVENT_EXIT);  	return error;   Recover_platform:  |