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

Rafael J. Wysocki
2009-02-07T22:31:00Z

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@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
_______________________________________________
linux-pm mailing list
linux-pm@lists.linux-foundation.org