lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <CA+yUs=xXAWEbPTfriE7oMeUXjCgGi7A=paQ7OXOKhZ3LcKx-rA@mail.gmail.com>
Date:	Mon, 27 Apr 2015 11:01:20 -0700
From:	Jin Qian <jinqian@...roid.com>
To:	Pavel Machek <pavel@....cz>
Cc:	"Rafael J. Wysocki" <rjw@...ysocki.net>,
	Len Brown <len.brown@...el.com>,
	Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
	linux-pm@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH 2/3] power: increment wakeup_count when save_wakeup_count failed.

Sorry about duplicate email. Sent in text mode so that it's delivered
to mailing list.

write fails when there's any new wakeup event after previous read.

https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-power

What: /sys/power/wakeup_count
Date: July 2010
Contact: Rafael J. Wysocki <rjw@...ysocki.net>
Description:
The /sys/power/wakeup_count file allows user space to put the
system into a sleep state while taking into account the
concurrent arrival of wakeup events.  Reading from it returns
the current number of registered wakeup events and it blocks if
some wakeup events are being processed at the time the file is
read from.  Writing to it will only succeed if the current
number of wakeup events is equal to the written value and, if
successful, will make the kernel abort a subsequent transition
to a sleep state if any wakeup events are reported after the
write has returned.


Thanks,

jin

On Mon, Apr 27, 2015 at 10:53 AM, Jin Qian <jinqian@...roid.com> wrote:
> write fails when there's any new wakeup event after previous read.
>
> https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-power
>
> What:		/sys/power/wakeup_count
> Date:		July 2010
> Contact:	Rafael J. Wysocki <rjw@...ysocki.net>
> Description:
> 		The /sys/power/wakeup_count file allows user space to put the
> 		system into a sleep state while taking into account the
> 		concurrent arrival of wakeup events.  Reading from it returns
> 		the current number of registered wakeup events and it blocks if
> 		some wakeup events are being processed at the time the file is
> 		read from.  Writing to it will only succeed if the current
> 		number of wakeup events is equal to the written value and, if
> 		successful, will make the kernel abort a subsequent transition
> 		to a sleep state if any wakeup events are reported after the
> 		write has returned.
>
>
> Thanks,
>
> jin
>
>
> On Sat, Apr 25, 2015 at 1:10 PM, Pavel Machek <pavel@....cz> wrote:
>>
>> On Wed 2015-04-22 17:50:11, Jin Qian wrote:
>> > user-space aborts suspend attempt if writing wakeup_count failed.
>> > Count the write failure towards wakeup_count.
>>
>> Why should writing wakeup_count fail? Can you make sure it does not
>> happen, instead?
>>                                                                 Pavel
>>
>> > Signed-off-by: Jin Qian <jinqian@...roid.com>
>> > ---
>> >  drivers/base/power/wakeup.c | 17 +++++++++++++++++
>> >  1 file changed, 17 insertions(+)
>> >
>> > diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
>> > index f24c622..bdb45f3 100644
>> > --- a/drivers/base/power/wakeup.c
>> > +++ b/drivers/base/power/wakeup.c
>> > @@ -57,6 +57,8 @@ static LIST_HEAD(wakeup_sources);
>> >
>> >  static DECLARE_WAIT_QUEUE_HEAD(wakeup_count_wait_queue);
>> >
>> > +static ktime_t last_read_time;
>> > +
>> >  /**
>> >   * wakeup_source_prepare - Prepare a new wakeup source for
>> > initialization.
>> >   * @ws: Wakeup source to prepare.
>> > @@ -771,10 +773,15 @@ void pm_wakeup_clear(void)
>> >  bool pm_get_wakeup_count(unsigned int *count, bool block)
>> >  {
>> >       unsigned int cnt, inpr;
>> > +     unsigned long flags;
>> >
>> >       if (block) {
>> >               DEFINE_WAIT(wait);
>> >
>> > +             spin_lock_irqsave(&events_lock, flags);
>> > +             last_read_time = ktime_get();
>> > +             spin_unlock_irqrestore(&events_lock, flags);
>> > +
>> >               for (;;) {
>> >                       prepare_to_wait(&wakeup_count_wait_queue, &wait,
>> >                                       TASK_INTERRUPTIBLE);
>> > @@ -806,6 +813,7 @@ bool pm_save_wakeup_count(unsigned int count)
>> >  {
>> >       unsigned int cnt, inpr;
>> >       unsigned long flags;
>> > +     struct wakeup_source *ws;
>> >
>> >       events_check_enabled = false;
>> >       spin_lock_irqsave(&events_lock, flags);
>> > @@ -813,6 +821,15 @@ bool pm_save_wakeup_count(unsigned int count)
>> >       if (cnt == count && inpr == 0) {
>> >               saved_count = count;
>> >               events_check_enabled = true;
>> > +     } else {
>> > +             rcu_read_lock();
>> > +             list_for_each_entry_rcu(ws, &wakeup_sources, entry) {
>> > +                     if (ws->active ||
>> > +                         ktime_compare(ws->last_time, last_read_time) >
>> > 0) {
>> > +                             ws->wakeup_count++;
>> > +                     }
>> > +             }
>> > +             rcu_read_unlock();
>> >       }
>> >       spin_unlock_irqrestore(&events_lock, flags);
>> >       return events_check_enabled;
>>
>> --
>> (english) http://www.livejournal.com/~pavelmachek
>> (cesky, pictures)
>> http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ