[linux-pm] [PATCH 04/13] PM: wakelock: Override wakelocks when using /sys/power/state

Rafael J. Wysocki rjw at sisk.pl
Sat Feb 7 14:31:00 PST 2009


On Thursday 05 February 2009, Arve Hjønnevåg wrote:
> This preserves existing functionality when CONFIG_WAKELOCK is set.
> 
> Signed-off-by: Arve Hjønnevåg <arve at android.com>
> ---
>  kernel/power/main.c     |    7 +++++++
>  kernel/power/power.h    |    1 +
>  kernel/power/wakelock.c |    4 ++++
>  3 files changed, 12 insertions(+), 0 deletions(-)
> 
> diff --git a/kernel/power/main.c b/kernel/power/main.c
> index 2399888..ab9fc7f 100644
> --- a/kernel/power/main.c
> +++ b/kernel/power/main.c
> @@ -515,6 +515,10 @@ static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
>  	p = memchr(buf, '\n', n);
>  	len = p ? p - buf : n;
>  
> +#ifdef CONFIG_WAKELOCK
> +	ignore_suspend_wakelocks = 1;
> +#endif

Please replace that with a function call like

disable_wakelocks();

that will be defined as an empty static inline for !CONFIG_WAKELOCK .

> +
>  	/* First, check if we are requested to hibernate */
>  	if (len == 4 && !strncmp(buf, "disk", len)) {
>  		error = hibernate();
> @@ -531,6 +535,9 @@ static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
>  #endif
>  
>   Exit:
> +#ifdef CONFIG_WAKELOCK
> +	ignore_suspend_wakelocks = 0;
> +#endif

Again, please replace that with something like

enable_wakelocks();

>  	return error ? error : n;
>  }
>  
> diff --git a/kernel/power/power.h b/kernel/power/power.h
> index 1527174..ed1b7f4 100644
> --- a/kernel/power/power.h
> +++ b/kernel/power/power.h
> @@ -229,4 +229,5 @@ static inline void suspend_thaw_processes(void)
>  extern struct workqueue_struct *suspend_work_queue;
>  extern struct wake_lock main_wake_lock;
>  extern suspend_state_t requested_suspend_state;
> +extern bool ignore_suspend_wakelocks;
>  #endif
> diff --git a/kernel/power/wakelock.c b/kernel/power/wakelock.c
> index c9e22f9..8a8608e 100644
> --- a/kernel/power/wakelock.c
> +++ b/kernel/power/wakelock.c
> @@ -47,6 +47,7 @@ static int current_event_num;
>  struct workqueue_struct *suspend_work_queue;
>  struct wake_lock main_wake_lock;
>  suspend_state_t requested_suspend_state = PM_SUSPEND_MEM;
> +bool ignore_suspend_wakelocks;
>  static struct wake_lock unknown_wakeup;
>  
>  #ifdef CONFIG_WAKELOCK_STAT
> @@ -260,6 +261,9 @@ long has_wake_lock(int type)
>  {
>  	long ret;
>  	unsigned long irqflags;
> +	if (WARN_ONCE(type == WAKE_LOCK_SUSPEND && ignore_suspend_wakelocks,
> +							"ignoring wakelocks\n"))
> +		return 0;
>  	spin_lock_irqsave(&list_lock, irqflags);
>  	ret = has_wake_lock_locked(type);
>  	spin_unlock_irqrestore(&list_lock, irqflags);

Thanks,
Rafael


More information about the linux-pm mailing list