From: NeilBrown <neilb@suse.de>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: "Linux PM list" <linux-pm@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
"Magnus Damm" <magnus.damm@gmail.com>,
markgross@thegnar.org, "Matthew Garrett" <mjg@redhat.com>,
"Greg KH" <gregkh@linuxfoundation.org>,
"Arve Hjønnevåg" <arve@android.com>,
"John Stultz" <john.stultz@linaro.org>,
"Brian Swetland" <swetland@google.com>,
"Alan Stern" <stern@rowland.harvard.edu>,
"Dmitry Torokhov" <dmitry.torokhov@gmail.com>,
"Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
Subject: Re: [RFC][PATCH 6/8] PM / Sleep: Implement opportunistic sleep
Date: Thu, 26 Apr 2012 13:05:03 +1000 [thread overview]
Message-ID: <20120426130503.7f55415d@notabene.brown> (raw)
In-Reply-To: <201204222323.23685.rjw@sisk.pl>
[-- Attachment #1: Type: text/plain, Size: 8109 bytes --]
On Sun, 22 Apr 2012 23:23:23 +0200 "Rafael J. Wysocki" <rjw@sisk.pl> wrote:
> From: "Rafael J. Wysocki" <rjw@sisk.pl>
> To: Linux PM list <linux-pm@vger.kernel.org>
> Cc: LKML <linux-kernel@vger.kernel.org>, Magnus Damm <magnus.damm@gmail.com>, markgross@thegnar.org, Matthew Garrett <mjg@redhat.com>, Greg KH <gregkh@linuxfoundation.org>, Arve Hjønnevåg <arve@android.com>, John Stultz <john.stultz@linaro.org>, Brian Swetland <swetland@google.com>, Neil Brown <neilb@suse.de>, Alan Stern <stern@rowland.harvard.edu>, Dmitry Torokhov <dmitry.torokhov@gmail.com>, "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
> Subject: [RFC][PATCH 6/8] PM / Sleep: Implement opportunistic sleep
> Date: Sun, 22 Apr 2012 23:23:23 +0200
> Sender: linux-kernel-owner@vger.kernel.org
> User-Agent: KMail/1.13.6 (Linux/3.4.0-rc3+; KDE/4.6.0; x86_64; ; )
>
> From: Rafael J. Wysocki <rjw@sisk.pl>
>
> Introduce a mechanism by which the kernel can trigger global
> transitions to a sleep state chosen by user space if there are no
> active wakeup sources.
Hi Rafael,
just a few little issues below. Over all I think that if we have to have
auto-sleep in the kernel, then this is a good way to do it.
> +static void try_to_suspend(struct work_struct *work)
> +{
> + unsigned int initial_count, final_count;
> +
> + if (!pm_get_wakeup_count(&initial_count, true))
> + goto out;
> +
> + mutex_lock(&autosleep_lock);
> +
> + if (!pm_save_wakeup_count(initial_count)) {
> + mutex_unlock(&autosleep_lock);
> + goto out;
> + }
> +
> + if (autosleep_state == PM_SUSPEND_ON) {
> + mutex_unlock(&autosleep_lock);
> + return;
> + }
> + if (autosleep_state >= PM_SUSPEND_MAX)
> + hibernate();
> + else
> + pm_suspend(autosleep_state);
> +
> + mutex_unlock(&autosleep_lock);
> +
> + if (!pm_get_wakeup_count(&final_count, false))
> + goto out;
> +
> + if (final_count == initial_count)
> + schedule_timeout(HZ / 2);
This doesn't do what you seem to expect it to do.
You need to set current->state to something like TASK_UNINTERRUPTIBLE
before calling schedule_timeout, otherwise it is effectily a no-op.
schedule_timeout_uninterruptible(), for example, will do this for you.
However the value of this isn't clear to me, so a comment would probably be a
good thing.
This continue presumably fires if we wake up without any wakeup sources
being activated. In that case you want to delay for 500ms - presumably to
avoid a tight suspend/resume loop if something goes wrong?
I have occasionally seen a stray/uninteresting interrupt wake from suspend
immediately after entering suspend and the next attempt succeeds. Maybe this
is a bug in some driver somewhere, but not a big one. I think I would rather
in that case that we attempt to re-enter suspend immediately. Maybe after a
few failed attempts it makes sense to back off.
The other question is: if we want to back-off, is 500ms really enough? What
will be gained by, or could be achieved in, that time? An exponential
back-off might be defensible, but I can't see the value of a 500ms fixed
back-off.
However if you can, I'd love to see a comment in there explaining it.
> +
> + out:
> + queue_up_suspend_work();
> +}
> +
> +
> +int pm_autosleep_set_state(suspend_state_t state)
> +{
> +
> +#ifndef CONFIG_HIBERNATION
> + if (state >= PM_SUSPEND_MAX)
> + return -EINVAL;
> +#endif
> +
> + __pm_stay_awake(autosleep_ws);
> +
> + mutex_lock(&autosleep_lock);
> +
> + autosleep_state = state;
> +
> + __pm_relax(autosleep_ws);
I'm struggling to see the point of the autosleep_ws.
A suspend cannot actually happen while this code is running (can it?) because
it will wait for the process to enter the freezer.
So the only effect of this is:
1/ cause the current auto-sleep cycle to abort and
2/ maybe add some accounting number is the autosleep_ws.
Is that right?
Which of these is needed?
I would imagine that any process writing to /sys/power/autosleep would be
holding a wakelock, and if it didn't it should expect things to be racy...
Am I missing something?
> +
> + if (state > PM_SUSPEND_ON)
> + queue_up_suspend_work();
The test here is superfluous as queue_up_suspend_work() itself tests that
'state' is > PM_SUSPEND_ON. However maybe it is more readable this way, so I
won't object it you like it.
> +
> + mutex_unlock(&autosleep_lock);
> + return 0;
> +}
> @@ -339,7 +359,8 @@ static ssize_t wakeup_count_show(struct
> {
> unsigned int val;
>
> - return pm_get_wakeup_count(&val) ? sprintf(buf, "%u\n", val) : -EINTR;
> + return pm_get_wakeup_count(&val, true) ?
> + sprintf(buf, "%u\n", val) : -EINTR;
> }
I think it would be really nice for user-space auto-suspend if the 'block'
flag to be settable from the O_NONBLOCK setting. And for poll() to work
on /sys/power/wakeup-count. However this would require a bit of surgery on
sysfs. So that is a "maybe later", but having the 'block' flag in there is
a step in the right direction.
>
> static ssize_t wakeup_count_store(struct kobject *kobj,
> @@ -347,15 +368,69 @@ static ssize_t wakeup_count_store(struct
> const char *buf, size_t n)
> {
> unsigned int val;
> + int error;
> +
> + error = pm_autosleep_lock();
> + if (error)
> + return error;
> +
> + if (pm_autosleep_state() > PM_SUSPEND_ON) {
> + error = -EBUSY;
> + goto out;
> + }
>
> if (sscanf(buf, "%u", &val) == 1) {
> if (pm_save_wakeup_count(val))
> return n;
You need a 'pm_autosleep_unlock() in there - or possibly
error = n; goto out;
> }
> - return -EINVAL;
> + error = -EINVAL;
> +
> + out:
> + pm_autosleep_unlock();
> + return error;
> }
> core_initcall(pm_init);
> Index: linux/drivers/base/power/wakeup.c
> ===================================================================
> --- linux.orig/drivers/base/power/wakeup.c
> +++ linux/drivers/base/power/wakeup.c
> @@ -498,8 +498,10 @@ static void wakeup_source_deactivate(str
> trace_wakeup_source_deactivate(ws->name, cec);
>
> split_counters(&cnt, &inpr);
> - if (!inpr && waitqueue_active(&wakeup_count_wait_queue))
> + if (!inpr && waitqueue_active(&wakeup_count_wait_queue)) {
> wake_up(&wakeup_count_wait_queue);
> + queue_up_suspend_work();
> + }
This doesn't look right. suspend_work always requeues itself unless
autosleep_state == PM_SUSPEND_ON, and whenver autosleep_state is set we
already call queue_up_suspend_work(). So there is no need to call it here.
> Index: linux/Documentation/ABI/testing/sysfs-power
> ===================================================================
> --- linux.orig/Documentation/ABI/testing/sysfs-power
> +++ linux/Documentation/ABI/testing/sysfs-power
> @@ -172,3 +172,20 @@ Description:
>
> Reading from this file will display the current value, which is
> set to 1 MB by default.
> +
> +What: /sys/power/autosleep
> +Date: February 2012
> +Contact: Rafael J. Wysocki <rjw@sisk.pl>
> +Description:
> + The /sys/power/autosleep file can be written one of the strings
"To the .. file can be written..." or
"The .. file can have written ..." or
"One of the strings returned by (reads from) /sys/power/state can be written
to the file ..."
??
> + returned by reads from /sys/power/state. If that happens, a
> + work item attempting to trigger a transition of the system to
> + the sleep state represented by that string is queued up. This
> + attempt will only succeed if there are no active wakeup sources
> + in the system at that time. After evey execution, regardless
^^^^
"every"
> + of whether or not the attempt to put the system to sleep has
> + succeeded, the work item requeues itself until user space
> + writes "off" to /sys/power/autosleep.
> +
> + Reading from this file causes the last string successfully
> + written to it to be displayed.
^^^^^^^^^ "returned".
Thanks,
NeilBrown
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 828 bytes --]
next prev parent reply other threads:[~2012-04-26 3:05 UTC|newest]
Thread overview: 129+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-07 1:00 [RFC][PATCH 0/8] PM: Implement autosleep and "wake locks" Rafael J. Wysocki
2012-02-07 1:01 ` [PATCH 1/8] PM / Sleep: Initialize wakeup source locks in wakeup_source_add() Rafael J. Wysocki
2012-02-07 22:29 ` John Stultz
2012-02-07 22:41 ` Rafael J. Wysocki
2012-02-07 1:03 ` [PATCH 2/8] PM / Sleep: Do not check wakeup too often in try_to_freeze_tasks() Rafael J. Wysocki
2012-02-07 1:03 ` [PATCH 3/8] PM / Sleep: Look for wakeup events in later stages of device suspend Rafael J. Wysocki
2012-02-07 1:04 ` [PATCH 4/8] PM / Sleep: Use wait queue to signal "no wakeup events in progress" Rafael J. Wysocki
2012-02-08 23:10 ` NeilBrown
2012-02-09 0:05 ` Rafael J. Wysocki
2012-02-12 1:27 ` mark gross
2012-02-07 1:05 ` [RFC][PATCH 5/8] PM / Sleep: Change wakeup statistics Rafael J. Wysocki
2012-02-15 6:15 ` Arve Hjønnevåg
2012-02-15 22:37 ` Rafael J. Wysocki
2012-02-17 2:11 ` Arve Hjønnevåg
2012-02-07 1:06 ` [RFC][PATCH 6/8] PM / Sleep: Implement opportunistic sleep Rafael J. Wysocki
2012-02-07 22:49 ` [Update][RFC][PATCH " Rafael J. Wysocki
2012-02-07 1:06 ` [RFC][PATCH 7/8] PM / Sleep: Add "prevent autosleep time" statistics to wakeup sources Rafael J. Wysocki
2012-02-07 1:07 ` [RFC][PATCH 8/8] PM / Sleep: Add user space interface for manipulating " Rafael J. Wysocki
2012-02-07 1:13 ` [RFC][PATCH 0/8] PM: Implement autosleep and "wake locks" Rafael J. Wysocki
2012-02-08 23:57 ` NeilBrown
2012-02-10 0:44 ` Rafael J. Wysocki
2012-02-12 2:05 ` mark gross
2012-02-12 21:32 ` Rafael J. Wysocki
2012-02-14 0:11 ` Arve Hjønnevåg
2012-02-15 15:28 ` mark gross
2012-02-12 1:54 ` mark gross
2012-02-12 1:19 ` mark gross
2012-02-14 2:07 ` Arve Hjønnevåg
2012-02-14 23:22 ` Rafael J. Wysocki
2012-02-15 5:57 ` Arve Hjønnevåg
2012-02-15 23:07 ` Rafael J. Wysocki
2012-02-16 22:22 ` Rafael J. Wysocki
2012-02-17 3:56 ` Arve Hjønnevåg
2012-02-17 23:02 ` [PATCH] PM / Sleep: Add more wakeup source initialization routines Rafael J. Wysocki
2012-02-18 23:50 ` [Update][PATCH] " Rafael J. Wysocki
2012-02-20 23:04 ` [Update 2x][PATCH] " Rafael J. Wysocki
2012-02-17 3:55 ` [RFC][PATCH 0/8] PM: Implement autosleep and "wake locks" Arve Hjønnevåg
2012-02-17 20:57 ` Rafael J. Wysocki
2012-02-21 23:31 ` [RFC][PATCH 0/7] PM: Implement autosleep and "wake locks", take 2 Rafael J. Wysocki
2012-02-21 23:32 ` [RFC][PATCH 1/7] PM / Sleep: Look for wakeup events in later stages of device suspend Rafael J. Wysocki
2012-02-21 23:33 ` [RFC][PATCH 2/7] PM / Sleep: Use wait queue to signal "no wakeup events in progress" Rafael J. Wysocki
2012-02-21 23:34 ` [RFC][PATCH 3/7] PM / Sleep: Change wakeup source statistics to follow Android Rafael J. Wysocki
2012-02-21 23:34 ` [RFC][PATCH 4/7] Input / PM: Add ioctl to block suspend while event queue is not empty Rafael J. Wysocki
2012-02-24 5:16 ` Matt Helsley
2012-02-25 4:25 ` Arve Hjønnevåg
2012-02-25 23:33 ` Rafael J. Wysocki
2012-02-28 0:19 ` Matt Helsley
2012-02-26 20:57 ` Rafael J. Wysocki
2012-02-27 22:18 ` Matt Helsley
2012-02-28 1:17 ` Rafael J. Wysocki
2012-02-28 5:58 ` Arve Hjønnevåg
2012-03-04 22:56 ` Rafael J. Wysocki
2012-03-06 1:04 ` [PATCH 1/2] epoll: Add a flag, EPOLLWAKEUP, to prevent suspend while epoll events are ready Arve Hjønnevåg
2012-03-06 1:04 ` [PATCH 2/2] PM / Sleep: Add wakeup_source_activate and wakeup_source_deactivate tracepoints Arve Hjønnevåg
2012-02-21 23:35 ` [RFC][PATCH 5/7] PM / Sleep: Implement opportunistic sleep Rafael J. Wysocki
2012-02-22 8:45 ` Srivatsa S. Bhat
2012-02-22 22:10 ` Rafael J. Wysocki
2012-02-23 5:35 ` Srivatsa S. Bhat
2012-02-21 23:36 ` [RFC][PATCH 6/7] PM / Sleep: Add "prevent autosleep time" statistics to wakeup sources Rafael J. Wysocki
2012-02-21 23:37 ` [RFC][PATCH 7/7] PM / Sleep: Add user space interface for manipulating " Rafael J. Wysocki
2012-02-22 4:49 ` [RFC][PATCH 0/7] PM: Implement autosleep and "wake locks", take 2 John Stultz
2012-02-22 8:44 ` Srivatsa S. Bhat
2012-02-22 22:10 ` [RFC][PATCH 0/7] PM: Implement autosleep and "wake locks", take2 Rafael J. Wysocki
2012-02-23 6:25 ` Srivatsa S. Bhat
2012-02-23 21:26 ` Rafael J. Wysocki
2012-02-23 21:32 ` Rafael J. Wysocki
2012-02-24 4:44 ` Srivatsa S. Bhat
2012-02-24 23:21 ` Rafael J. Wysocki
2012-02-25 4:43 ` Arve Hjønnevåg
2012-02-25 20:43 ` Rafael J. Wysocki
2012-02-25 19:20 ` Srivatsa S. Bhat
2012-02-25 21:01 ` Rafael J. Wysocki
2012-02-28 10:24 ` Srivatsa S. Bhat
2012-04-22 21:19 ` [RFC][PATCH 0/8] PM: Implement autosleep and "wake locks", take 3 Rafael J. Wysocki
2012-04-22 21:19 ` [PATCH 1/8] PM / Sleep: Look for wakeup events in later stages of device suspend Rafael J. Wysocki
2012-04-22 21:20 ` [PATCH 2/8] PM / Sleep: Use wait queue to signal "no wakeup events in progress" Rafael J. Wysocki
2012-04-23 4:01 ` mark gross
2012-04-22 21:21 ` [PATCH 3/8] PM / Sleep: Change wakeup source statistics to follow Android Rafael J. Wysocki
2012-04-22 21:21 ` [PATCH 4/8] PM / Sleep: Add wakeup_source_activate and wakeup_source_deactivate tracepoints Rafael J. Wysocki
2012-04-22 21:22 ` [RFC][PATCH 5/8] epoll: Add a flag, EPOLLWAKEUP, to prevent suspend while epoll events are ready Rafael J. Wysocki
2012-04-26 4:03 ` NeilBrown
2012-04-26 20:40 ` Rafael J. Wysocki
2012-04-27 3:49 ` Arve Hjønnevåg
2012-04-27 21:18 ` Rafael J. Wysocki
2012-04-27 23:26 ` [PATCH] " Arve Hjønnevåg
2012-04-30 1:58 ` [RFC][PATCH 5/8] " NeilBrown
2012-05-01 0:52 ` Arve Hjønnevåg
2012-05-01 2:18 ` NeilBrown
2012-05-01 5:33 ` [PATCH] " Arve Hjønnevåg
2012-05-01 6:28 ` NeilBrown
2012-05-01 13:51 ` Rafael J. Wysocki
2012-07-16 6:38 ` Michael Kerrisk
2012-07-16 11:00 ` Rafael J. Wysocki
2012-07-16 22:04 ` Arve Hjønnevåg
2012-07-17 5:14 ` Michael Kerrisk
2012-07-17 19:22 ` Rafael J. Wysocki
2012-07-17 19:36 ` Greg KH
2012-07-17 19:55 ` Rafael J. Wysocki
2012-07-18 6:41 ` Michael Kerrisk (man-pages)
2012-04-22 21:23 ` [RFC][PATCH 6/8] PM / Sleep: Implement opportunistic sleep Rafael J. Wysocki
2012-04-26 3:05 ` NeilBrown [this message]
2012-04-26 21:52 ` Rafael J. Wysocki
2012-04-27 0:39 ` NeilBrown
2012-04-27 21:22 ` Rafael J. Wysocki
2012-05-03 0:23 ` Arve Hjønnevåg
2012-05-03 13:28 ` Rafael J. Wysocki
2012-05-03 21:27 ` Arve Hjønnevåg
2012-05-03 22:20 ` Rafael J. Wysocki
2012-05-03 22:16 ` Arve Hjønnevåg
2012-05-03 22:24 ` Rafael J. Wysocki
2012-04-22 21:24 ` [RFC][PATCH 7/8] PM / Sleep: Add "prevent autosleep time" statistics to wakeup sources Rafael J. Wysocki
2012-04-22 21:24 ` [RFC][PATCH 8/8] PM / Sleep: Add user space interface for manipulating " Rafael J. Wysocki
2012-04-24 1:35 ` John Stultz
2012-04-24 21:27 ` Rafael J. Wysocki
2012-04-26 6:31 ` NeilBrown
2012-04-26 22:04 ` Rafael J. Wysocki
2012-04-27 0:07 ` NeilBrown
2012-04-27 21:15 ` Rafael J. Wysocki
2012-04-27 3:57 ` Arve Hjønnevåg
2012-04-27 21:14 ` Rafael J. Wysocki
2012-04-27 21:17 ` Arve Hjønnevåg
2012-04-27 21:34 ` Rafael J. Wysocki
2012-05-03 19:29 ` [PATCH 0/2]: Kconfig options for wakelocks limit and gc (was: Re: [RFC][PATCH 8/8] PM / Sleep: Add user space ...) Rafael J. Wysocki
2012-05-03 19:30 ` [PATCH 1/2] PM / Sleep: Make the limit of user space wakeup sources configurable Rafael J. Wysocki
2012-05-03 19:34 ` [PATCH 2/2] PM / Sleep: User space wakeup sources garbage collector Kconfig option Rafael J. Wysocki
2012-05-03 22:14 ` [PATCH 0/2]: Kconfig options for wakelocks limit and gc (was: Re: [RFC][PATCH 8/8] PM / Sleep: Add user space ...) Arve Hjønnevåg
2012-05-03 22:20 ` Rafael J. Wysocki
2012-04-23 16:49 ` [RFC][PATCH 0/8] PM: Implement autosleep and "wake locks", take 3 Greg KH
2012-04-23 19:51 ` Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120426130503.7f55415d@notabene.brown \
--to=neilb@suse.de \
--cc=arve@android.com \
--cc=dmitry.torokhov@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=magnus.damm@gmail.com \
--cc=markgross@thegnar.org \
--cc=mjg@redhat.com \
--cc=rjw@sisk.pl \
--cc=srivatsa.bhat@linux.vnet.ibm.com \
--cc=stern@rowland.harvard.edu \
--cc=swetland@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).