Re: [RFC][PATCH 6/8] PM / Sleep: Implement opportunistic sleep

Arve Hjønnevåg
2012-05-03T22:16:57Z

On Thu, May 3, 2012 at 3:20 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> On Thursday, May 03, 2012, Arve Hjønnevåg wrote:
>> On Thu, May 3, 2012 at 6:28 AM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
>> > On Thursday, May 03, 2012, Arve Hjønnevåg wrote:
>> >> On Thu, Apr 26, 2012 at 2:52 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
>> >> ...
>> >> > From: Rafael J. Wysocki <rjw@sisk.pl>
>> >> > Subject: PM / Sleep: Implement opportunistic sleep, v2
>> >> >
>> >> > 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.
>> >> >
>> >> > It consists of a new sysfs attribute, /sys/power/autosleep, that
>> >> > can be written one of the strings returned by reads from
>> >> > /sys/power/state, an ordered workqueue and a work item carrying out
>> >> > the "suspend" operations.  If a string representing the system's
>> >> > sleep state is written to /sys/power/autosleep, the work item
>> >> > triggering transitions to that state is queued up and it requeues
>> >> > itself after every execution until user space writes "off" to
>> >> > /sys/power/autosleep.
>> >> >
>> >>
>> >> This does not work. Writing something other than "off" disabled auto
>> >> suspend for me.
>> >
>> > My bad, sorry about that.
>> >
>> >> ...
>> >> > +static ssize_t autosleep_store(struct kobject *kobj,
>> >> > +                              struct kobj_attribute *attr,
>> >> > +                              const char *buf, size_t n)
>> >> > +{
>> >> > +       suspend_state_t state = decode_state(buf, n);
>> >> > +       int error;
>> >> > +
>> >> > +       if (state == PM_SUSPEND_ON
>> >> > +           && !(strncmp(buf, "off", 3) && strncmp(buf, "off\n", 4)))
>> >> > +               return -EINVAL;
>> >>
>> >> Did you mean:
>> >>       if (state == PM_SUSPEND_ON
>> >>           && strcmp(buf, "off") && strcmp(buf, "off\n"))
>> >>               return -EINVAL;
>> >
>> >
>> > Yes, I did.
>> >
>> > I'll add the following as an incremental patch on top of the series.
>> >
>> > Thanks,
>> > Rafael
>> >
>> > ---
>> >  kernel/power/main.c |    2 +-
>> >  1 file changed, 1 insertion(+), 1 deletion(-)
>> >
>> > Index: linux/kernel/power/main.c
>> > ===================================================================
>> > --- linux.orig/kernel/power/main.c
>> > +++ linux/kernel/power/main.c
>> > @@ -422,7 +422,7 @@ static ssize_t autosleep_store(struct ko
>> >        int error;
>> >
>> >        if (state == PM_SUSPEND_ON
>> > -           && !(strncmp(buf, "off", 3) && strncmp(buf, "off\n", 4)))
>> > +           && strncmp(buf, "off", 3) && strncmp(buf, "off\n", 4))
>> >                return -EINVAL;
>> >
>> >        error = pm_autosleep_set_state(state);
>>
>> You still use strncmp here, so anything that starts with "off" is
>> allowed (and the second strncmp is redundant).
>
> Good point.  So I'm going to add the patch below after all.
> OK to add your sign-off to it?
>

Yes.

--
Arve Hjønnevåg