All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jacek Anaszewski <j.anaszewski@samsung.com>
To: Hans de Goede <hdegoede@redhat.com>,
	Jacek Anaszewski <jacek.anaszewski@gmail.com>,
	Tony Lindgren <tony@atomide.com>
Cc: linux-leds@vger.kernel.org, linux-omap@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, Darren Hart <dvhart@infradead.org>,
	Pavel Machek <pavel@ucw.cz>
Subject: Re: PM regression with LED changes in next-20161109
Date: Thu, 10 Nov 2016 13:56:27 +0100	[thread overview]
Message-ID: <5bd5333e-0dbb-6333-0a48-ca4d3a990f9c@samsung.com> (raw)
In-Reply-To: <f627c778-4378-e5da-09dd-3e0fb2ea4aba@redhat.com>

Hi,

On 11/10/2016 09:49 AM, Hans de Goede wrote:
> Hi,
>
> On 09-11-16 21:45, Jacek Anaszewski wrote:
>> Hi Tony,
>>
>> On 11/09/2016 08:23 PM, Tony Lindgren wrote:
>>> Hi,
>>>
>>> Looks like commit 883d32ce3385 ("leds: core: Add support for poll()ing
>>> the sysfs brightness attr for changes.") breaks runtime PM for me.
>>>
>>> On my omap dm3730 based test system, idle power consumption is over 70
>>> times higher now with this patch! It goes from about 6mW for the core
>>> system to over 440mW during idle meaning there's some busy timer now
>>> active.
>>>
>>> Reverting this patch fixes the issue. Any ideas?
>>
>> Thanks for the report. This is probably caused by sysfs_notify_dirent().
>> I'm afraid that we can't keep this feature in the current shape.
>> Hans, I'm dropping the patch. We probably will have to delegate this
>> call to a workqueue task. Think about use cases when the LED is blinked
>> with high frequency e.g. from ledtrig-disk.c.
>
> sysfs_notify_dirent() already uses a workqueue, here is the actual
> implementation of it (from fs/kernfs/file.c) :
>
> void kernfs_notify(struct kernfs_node *kn)
> {
>         static DECLARE_WORK(kernfs_notify_work, kernfs_notify_workfn);
>         unsigned long flags;
>
>         if (WARN_ON(kernfs_type(kn) != KERNFS_FILE))
>                 return;
>
>         spin_lock_irqsave(&kernfs_notify_lock, flags);
>         if (!kn->attr.notify_next) {
>                 kernfs_get(kn);
>                 kn->attr.notify_next = kernfs_notify_list;
>                 kernfs_notify_list = kn;
>                 schedule_work(&kernfs_notify_work);
>         }
>         spin_unlock_irqrestore(&kernfs_notify_lock, flags);
> }

Indeed. As a next step of this investigation Tony could disable
particular calls made in kernfs_notify_workfn to check what
exactly causes excessive power consumption.

> So using a workqueue is not going to help. Note that I already
> feared this, which is why my initial implementation only called
> sysfs_notify_dirent() for user initiated changes and not for
> triggers / blinking.

AFAIR there were no calls to led_notify_brightness_change() in
the initial implementation and it was entirely predestined for
being called by LED class drivers on brightness changes made
by firmware.

> I think we may need to reconsider what getting the brightness
> sysfs atrribute actually returns. Currently when a LED is
> blinking it will return 0 resp. the actual brightness depending
> on when in the blink cycle the user reads the brightness
> sysfs atrribute.
>
> So a user can do "echo 128 > brightness && cat brightness" and
> get out 0, or 128, depending purely on timing.
>
> This seems to contradict what Documentation/ABI/testing/sysfs-class-led
> has to say:
>
> What:           /sys/class/leds/<led>/brightness
> Date:           March 2006
> KernelVersion:  2.6.17
> Contact:        Richard Purdie <rpurdie@rpsys.net>
> Description:
>                 Set the brightness of the LED. Most LEDs don't
>                 have hardware brightness support, so will just be turned
> on for
>                 non-zero brightness settings. The value is between 0 and
>                 /sys/class/leds/<led>/max_brightness.
>
>                 Writing 0 to this file clears active trigger.
>
>                 Writing non-zero to this file while trigger is active
> changes the
>                 top brightness trigger is going to use.
>
> Even though it only talks about writing, the logical thing would be for
> reading to be the exact opposite of writing, so we would get:
>
>                 Reading from this file while a trigger is active returns
> the
>                 top brightness trigger is going to use.
>
> The current docs say not about (sw) blinking, but that should be treated
> just
> like a trigger IMHO.

You'r right, we should describe the semantics on reading, but it would
have to be as follows:

Reading from this file returns LED brightness at given moment, i.e.
even though LED class device brightness setting is greater than 0, the
momentary brightness can be 0 if the readout occurred during low phase
of blink cycle.

> If we can get consensus on what the read behavior for the brightness
> attribute
> should be, then I think that a better poll() behavior will automatically
> follow
> from that.

It seems that we should get back to your initial approach. i.e. only
brightness changes caused by hardware should be reported.

-- 
Best regards,
Jacek Anaszewski

WARNING: multiple messages have this Message-ID (diff)
From: j.anaszewski@samsung.com (Jacek Anaszewski)
To: linux-arm-kernel@lists.infradead.org
Subject: PM regression with LED changes in next-20161109
Date: Thu, 10 Nov 2016 13:56:27 +0100	[thread overview]
Message-ID: <5bd5333e-0dbb-6333-0a48-ca4d3a990f9c@samsung.com> (raw)
In-Reply-To: <f627c778-4378-e5da-09dd-3e0fb2ea4aba@redhat.com>

Hi,

On 11/10/2016 09:49 AM, Hans de Goede wrote:
> Hi,
>
> On 09-11-16 21:45, Jacek Anaszewski wrote:
>> Hi Tony,
>>
>> On 11/09/2016 08:23 PM, Tony Lindgren wrote:
>>> Hi,
>>>
>>> Looks like commit 883d32ce3385 ("leds: core: Add support for poll()ing
>>> the sysfs brightness attr for changes.") breaks runtime PM for me.
>>>
>>> On my omap dm3730 based test system, idle power consumption is over 70
>>> times higher now with this patch! It goes from about 6mW for the core
>>> system to over 440mW during idle meaning there's some busy timer now
>>> active.
>>>
>>> Reverting this patch fixes the issue. Any ideas?
>>
>> Thanks for the report. This is probably caused by sysfs_notify_dirent().
>> I'm afraid that we can't keep this feature in the current shape.
>> Hans, I'm dropping the patch. We probably will have to delegate this
>> call to a workqueue task. Think about use cases when the LED is blinked
>> with high frequency e.g. from ledtrig-disk.c.
>
> sysfs_notify_dirent() already uses a workqueue, here is the actual
> implementation of it (from fs/kernfs/file.c) :
>
> void kernfs_notify(struct kernfs_node *kn)
> {
>         static DECLARE_WORK(kernfs_notify_work, kernfs_notify_workfn);
>         unsigned long flags;
>
>         if (WARN_ON(kernfs_type(kn) != KERNFS_FILE))
>                 return;
>
>         spin_lock_irqsave(&kernfs_notify_lock, flags);
>         if (!kn->attr.notify_next) {
>                 kernfs_get(kn);
>                 kn->attr.notify_next = kernfs_notify_list;
>                 kernfs_notify_list = kn;
>                 schedule_work(&kernfs_notify_work);
>         }
>         spin_unlock_irqrestore(&kernfs_notify_lock, flags);
> }

Indeed. As a next step of this investigation Tony could disable
particular calls made in kernfs_notify_workfn to check what
exactly causes excessive power consumption.

> So using a workqueue is not going to help. Note that I already
> feared this, which is why my initial implementation only called
> sysfs_notify_dirent() for user initiated changes and not for
> triggers / blinking.

AFAIR there were no calls to led_notify_brightness_change() in
the initial implementation and it was entirely predestined for
being called by LED class drivers on brightness changes made
by firmware.

> I think we may need to reconsider what getting the brightness
> sysfs atrribute actually returns. Currently when a LED is
> blinking it will return 0 resp. the actual brightness depending
> on when in the blink cycle the user reads the brightness
> sysfs atrribute.
>
> So a user can do "echo 128 > brightness && cat brightness" and
> get out 0, or 128, depending purely on timing.
>
> This seems to contradict what Documentation/ABI/testing/sysfs-class-led
> has to say:
>
> What:           /sys/class/leds/<led>/brightness
> Date:           March 2006
> KernelVersion:  2.6.17
> Contact:        Richard Purdie <rpurdie@rpsys.net>
> Description:
>                 Set the brightness of the LED. Most LEDs don't
>                 have hardware brightness support, so will just be turned
> on for
>                 non-zero brightness settings. The value is between 0 and
>                 /sys/class/leds/<led>/max_brightness.
>
>                 Writing 0 to this file clears active trigger.
>
>                 Writing non-zero to this file while trigger is active
> changes the
>                 top brightness trigger is going to use.
>
> Even though it only talks about writing, the logical thing would be for
> reading to be the exact opposite of writing, so we would get:
>
>                 Reading from this file while a trigger is active returns
> the
>                 top brightness trigger is going to use.
>
> The current docs say not about (sw) blinking, but that should be treated
> just
> like a trigger IMHO.

You'r right, we should describe the semantics on reading, but it would
have to be as follows:

Reading from this file returns LED brightness at given moment, i.e.
even though LED class device brightness setting is greater than 0, the
momentary brightness can be 0 if the readout occurred during low phase
of blink cycle.

> If we can get consensus on what the read behavior for the brightness
> attribute
> should be, then I think that a better poll() behavior will automatically
> follow
> from that.

It seems that we should get back to your initial approach. i.e. only
brightness changes caused by hardware should be reported.

-- 
Best regards,
Jacek Anaszewski

  reply	other threads:[~2016-11-10 12:56 UTC|newest]

Thread overview: 102+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-09 19:23 PM regression with LED changes in next-20161109 Tony Lindgren
2016-11-09 19:23 ` Tony Lindgren
2016-11-09 20:45 ` Jacek Anaszewski
2016-11-09 20:45   ` Jacek Anaszewski
2016-11-10  8:49   ` Hans de Goede
2016-11-10  8:49     ` Hans de Goede
2016-11-10 12:56     ` Jacek Anaszewski [this message]
2016-11-10 12:56       ` Jacek Anaszewski
2016-11-10 13:04       ` Hans de Goede
2016-11-10 13:04         ` Hans de Goede
2016-11-10 13:55         ` Jacek Anaszewski
2016-11-10 13:55           ` Jacek Anaszewski
2016-11-10 16:36           ` Pavel Machek
2016-11-10 16:36             ` Pavel Machek
2016-11-10 16:29       ` Pavel Machek
2016-11-10 16:29         ` Pavel Machek
2016-11-10 16:44         ` Hans de Goede
2016-11-10 16:44           ` Hans de Goede
2016-11-10 20:48           ` Pavel Machek
2016-11-10 20:48             ` Pavel Machek
2016-11-11  8:25             ` Hans de Goede
2016-11-11  8:25               ` Hans de Goede
2016-11-10 17:55         ` Tony Lindgren
2016-11-10 17:55           ` Tony Lindgren
2016-11-10 20:29           ` Pavel Machek
2016-11-10 20:29             ` Pavel Machek
2016-11-10 21:34             ` Jacek Anaszewski
2016-11-10 21:34               ` Jacek Anaszewski
2016-11-11 12:01               ` Pavel Machek
2016-11-11 12:01                 ` Pavel Machek
2016-11-11 17:03                 ` Jacek Anaszewski
2016-11-11 17:03                   ` Jacek Anaszewski
2016-11-11 19:28                   ` Hans de Goede
2016-11-11 19:28                     ` Hans de Goede
2016-11-11 22:12                     ` Pavel Machek
2016-11-11 22:12                       ` Pavel Machek
2016-11-12  8:03                       ` Hans de Goede
2016-11-12  8:03                         ` Hans de Goede
2016-11-13  9:10                         ` Three different LED brightnesses (was Re: PM regression with LED changes in next-20161109) Pavel Machek
2016-11-13  9:10                           ` Pavel Machek
2016-11-13  9:44                           ` Hans de Goede
2016-11-13  9:44                             ` Hans de Goede
2016-11-13 20:45                             ` Pavel Machek
2016-11-13 20:45                               ` Pavel Machek
2016-11-12 10:24                     ` PM regression with LED changes in next-20161109 Jacek Anaszewski
2016-11-12 10:24                       ` Jacek Anaszewski
2016-11-12 10:33                       ` Hans de Goede
2016-11-12 10:33                         ` Hans de Goede
2016-11-12 10:33                         ` Hans de Goede
2016-11-12 19:14                         ` Jacek Anaszewski
2016-11-12 19:14                           ` Jacek Anaszewski
2016-11-12 21:14                           ` Hans de Goede
2016-11-12 21:14                             ` Hans de Goede
2016-11-13 11:44                             ` Jacek Anaszewski
2016-11-13 11:44                               ` Jacek Anaszewski
2016-11-13 13:52                               ` Hans de Goede
2016-11-13 13:52                                 ` Hans de Goede
2016-11-14  9:12                                 ` Jacek Anaszewski
2016-11-14  9:12                                   ` Jacek Anaszewski
2016-11-14  9:12                                   ` Jacek Anaszewski
2016-11-14 12:51                                   ` Hans de Goede
2016-11-14 12:51                                     ` Hans de Goede
2016-11-15 10:01                                     ` Jacek Anaszewski
2016-11-15 10:01                                       ` Jacek Anaszewski
2016-11-15 10:09                                       ` Hans de Goede
2016-11-15 10:09                                         ` Hans de Goede
2016-11-15 10:31                                     ` LEDs that change brightness "itself" -- that's a trigger. " Pavel Machek
2016-11-15 10:31                                       ` Pavel Machek
2016-11-15 10:58                                       ` Jacek Anaszewski
2016-11-15 10:58                                         ` Jacek Anaszewski
2016-11-15 11:11                                         ` Pavel Machek
2016-11-15 11:11                                           ` Pavel Machek
2016-11-15 11:21                                           ` Hans de Goede
2016-11-15 11:21                                             ` Hans de Goede
2016-11-15 11:48                                             ` Pavel Machek
2016-11-15 11:48                                               ` Pavel Machek
2016-11-15 12:06                                               ` Hans de Goede
2016-11-15 12:06                                                 ` Hans de Goede
2016-11-15 12:11                                                 ` Pavel Machek
2016-11-15 12:11                                                   ` Pavel Machek
2016-11-15 13:28                                                 ` Jacek Anaszewski
2016-11-15 13:28                                                   ` Jacek Anaszewski
2016-11-15 13:48                                                   ` Hans de Goede
2016-11-15 13:48                                                     ` Hans de Goede
2016-11-15 14:04                                                     ` Jacek Anaszewski
2016-11-15 14:04                                                       ` Jacek Anaszewski
2016-11-15 14:30                                                       ` Hans de Goede
2016-11-15 14:30                                                         ` Hans de Goede
2016-11-15 14:41                                                         ` Jacek Anaszewski
2016-11-15 14:41                                                           ` Jacek Anaszewski
2016-11-17 22:12                                                 ` Hans de Goede
2016-11-17 22:12                                                   ` Hans de Goede
2016-11-15 11:17                                         ` Hans de Goede
2016-11-15 11:17                                           ` Hans de Goede
2016-11-14  8:31                             ` Pavel Machek
2016-11-14  8:31                               ` Pavel Machek
2016-11-11 22:06                   ` Pavel Machek
2016-11-11 22:06                     ` Pavel Machek
2016-11-10  8:34 ` Hans de Goede
2016-11-10  8:34   ` Hans de Goede
2016-11-10 15:11   ` Tony Lindgren
2016-11-10 15:11     ` Tony Lindgren

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=5bd5333e-0dbb-6333-0a48-ca4d3a990f9c@samsung.com \
    --to=j.anaszewski@samsung.com \
    --cc=dvhart@infradead.org \
    --cc=hdegoede@redhat.com \
    --cc=jacek.anaszewski@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-leds@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=pavel@ucw.cz \
    --cc=tony@atomide.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.