diff mbox

PM / Sleep: Print last wakeup source on failed wakeup_count write

Message ID 1369944137-30948-1-git-send-email-jwerner@chromium.org (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Julius Werner May 30, 2013, 8:02 p.m. UTC
Commit a938da06 introduced a useful little log message to tell
users/debuggers which wakeup source aborted a suspend. However, this
message is only printed if the abort happens during the in-kernel
suspend path (after writing /sys/power/state).

The full specification of the /sys/power/wakeup_count facility allows
user-space power managers to double-check if wakeups have already
happened before it actually tries to suspend (e.g. while it was running
user-space pre-suspend hooks), by writing the last known wakeup_count
value to /sys/power/wakeup_count. This patch changes the sysfs handler
for that node to also print said log message if that write fails, so
that we can figure out the offending wakeup source for both kinds of
suspend aborts.

Signed-off-by: Julius Werner <jwerner@chromium.org>
---
 drivers/base/power/wakeup.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Rafael Wysocki June 11, 2013, 10 p.m. UTC | #1
On Thursday, May 30, 2013 01:02:17 PM Julius Werner wrote:
> Commit a938da06 introduced a useful little log message to tell
> users/debuggers which wakeup source aborted a suspend. However, this
> message is only printed if the abort happens during the in-kernel
> suspend path (after writing /sys/power/state).
> 
> The full specification of the /sys/power/wakeup_count facility allows
> user-space power managers to double-check if wakeups have already
> happened before it actually tries to suspend (e.g. while it was running
> user-space pre-suspend hooks), by writing the last known wakeup_count
> value to /sys/power/wakeup_count. This patch changes the sysfs handler
> for that node to also print said log message if that write fails, so
> that we can figure out the offending wakeup source for both kinds of
> suspend aborts.
> 
> Signed-off-by: Julius Werner <jwerner@chromium.org>
> ---
>  drivers/base/power/wakeup.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
> index 79715e7..b0b7886 100644
> --- a/drivers/base/power/wakeup.c
> +++ b/drivers/base/power/wakeup.c
> @@ -772,6 +772,8 @@ bool pm_save_wakeup_count(unsigned int count)
>  		events_check_enabled = true;
>  	}
>  	spin_unlock_irqrestore(&events_lock, flags);
> +	if (!events_check_enabled)
> +		print_active_wakeup_sources();

This is going to be done in the autosleep case too, which I'm slightly
concerned about.

If you wanted to cover /sys/power/wakeup_count only, it would be better
to put that into wakeup_count_store(), but perhaps you wanted to cover
autosleep too?

>  	return events_check_enabled;
>  }

Thanks,
Rafael
Julius Werner June 11, 2013, 11:20 p.m. UTC | #2
Resending as plain text... sorry for the spam, Gmail just likes to
silently mess up my settings every once in a while.

On Tue, Jun 11, 2013 at 4:17 PM, Julius Werner <jwerner@chromium.org> wrote:
>
>> This is going to be done in the autosleep case too, which I'm slightly
>> concerned about.
>>
>> If you wanted to cover /sys/power/wakeup_count only, it would be better
>> to put that into wakeup_count_store(), but perhaps you wanted to cover
>> autosleep too?
>
>
> Hmm... no, I did not really take the autosleep case into account. I can't
> quite tell with what frequency the autosleep try_to_suspend() handler on an
> active system would run... do you think it might be a useful feature to have
> there, or would it lead to logspam?
>
> I can move it to wakeup_count_store() if you prefer, but then I will have to
> turn print_active_wakeup_sources() into an exported function, which is also
> a little inconvenient.
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rafael Wysocki June 12, 2013, 11:08 a.m. UTC | #3
On Tuesday, June 11, 2013 04:17:35 PM Julius Werner wrote:
> > This is going to be done in the autosleep case too, which I'm slightly
> > concerned about.
> >
> > If you wanted to cover /sys/power/wakeup_count only, it would be better
> > to put that into wakeup_count_store(), but perhaps you wanted to cover
> > autosleep too?
> >
> 
> Hmm... no, I did not really take the autosleep case into account. I can't
> quite tell with what frequency the autosleep try_to_suspend() handler on an
> active system would run... do you think it might be a useful feature to
> have there, or would it lead to logspam?

On Android systems it may be really frequent, because they try to suspend
very aggressively.  That's why I asked about it.

> I can move it to wakeup_count_store() if you prefer, but then I will have
> to turn print_active_wakeup_sources() into an exported function, which is
> also a little inconvenient.

That's OK.

Thanks,
Rafael
diff mbox

Patch

diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 79715e7..b0b7886 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -772,6 +772,8 @@  bool pm_save_wakeup_count(unsigned int count)
 		events_check_enabled = true;
 	}
 	spin_unlock_irqrestore(&events_lock, flags);
+	if (!events_check_enabled)
+		print_active_wakeup_sources();
 	return events_check_enabled;
 }