All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jacek Anaszewski <j.anaszewski@samsung.com>
To: Sakari Ailus <sakari.ailus@iki.fi>
Cc: linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org,
	cooloney@gmail.com, rpurdie@rpsys.net,
	stsp@users.sourceforge.net, pavel@ucw.cz,
	sakari.ailus@linux.intel.com, andreas.werner@men.de,
	andrew@lunn.ch, ospite@studenti.unina.it, anemo@mba.ocn.ne.jp,
	ben@simtec.co.uk, bootc@bootc.net, dmurphy@ti.com,
	daniel.jeong@ti.com, daniel@zonque.org, davem@davemloft.net,
	fabio.baltieri@gmail.com, balbi@ti.com, florian@openwrt.org,
	gshark.jeong@gmail.com, g.liakhovetski@gmx.de,
	ingi2.kim@samsung.com, dl9pf@gmx.de, johan@kernel.org,
	lenz@cs.wisc.edu, jogo@openwrt.org, q1.kim@samsung.com,
	kris@krisk.org, kristoffer.ericson@gmail.com,
	linus.walleij@linaro.org, broonie@kernel.org,
	michael.hennerich@analog.com, milo.kim@ti.com, nm127@freemail.hu,
	ncase@xes-inc.com, neilb@suse.de, nick.forbes@incepta.com,
	lost.distance@yahoo.com, p.meerwald@bct-electronic.com,
	n0-1@freewrt.org, phil
Subject: Re: [PATCH/RFC v2 1/5] leds: Use set_brightness_work for brightness_set ops that can sleep
Date: Fri, 03 Jul 2015 15:16:19 +0200	[thread overview]
Message-ID: <55968B23.6000109@samsung.com> (raw)
In-Reply-To: <20150701214456.GU5904@valkosipuli.retiisi.org.uk>

Hi Sakari,

On 07/01/2015 11:44 PM, Sakari Ailus wrote:
> Hi Jacek,
>
> On Wed, Jul 01, 2015 at 02:01:54PM +0200, Jacek Anaszewski wrote:
>> On 07/01/2015 11:52 AM, Jacek Anaszewski wrote:
>>> Hi Sakari,
>>>
>>> On 07/01/2015 12:24 AM, Sakari Ailus wrote:
>>>> Hi Jacek,
>>>>
>>>> On Tue, Jun 30, 2015 at 03:59:26PM +0200, Jacek Anaszewski wrote:
>>>>> This patch rearranges the core LED subsystem code, so that it
>>>>> now shifts the responsibility for using work queues from drivers,
>>>>> in case their brightness_set ops can sleep, onto the LED core
>>>>> Addition of two flags: LED_BRIGHTNESS_FAST and LED_BLINK_DISABLE
>>>>> as well as new_brightness_value property to the struct led_classdev
>>>>> allows for employing existing set_brightness_work to do the job.
>>>>> The modifications allows also to get rid of brightness_set_sync op,
>>>>> as flash LED devices can now be handled properly only basing on the
>>>>> SET_BRIGHTNESS_SYNC flag.
>>>>
>>>> Nice patch! Thanks!
>>>>
>>>> Looks like this is the favourite topic nowadays. ;-)
>>>
>>> Yeah, this allows to believe that we will manage to tackle the issue
>>> finally :)
>>>
>>>> The documentation should be improved to tell how the API is expected
>>>> to be
>>>> have, e.g. which functions may block. I think this is out of scope for
>>>> this
>>>> patch though.
>>>
>>> Yes, I planned to cover this after the patch is accepted.
>>>
>>>> I think all the existing drivers that implement the set_brightness()
>>>> callback have a fast (and non-blocking) implementation, and some of these
>>>> drivers use a work queue. In order to avoid modifying those drivers right
>>>> now, how about adding a flag for slow devices instead? "Slow" handlers
>>>> should be those that do at least one of the following: 1) sleep and 2)
>>>> take
>>>> excessive amount of time to run.
>>>
>>> As Andrew Lunn mentioned, he was also working on this issue and he did
>>> the vast majority of work [1] needed to remove work queues from existing
>>> drivers. Only new flags would have to be added.
>>>
>>>> How about splitting the patch as follows:
>>>>
>>>> - set_brightness()/set_brightness_sync() -> set_brightness() +
>>>>    LED_BRIGHTNESS_FAST + slow handlers in a work queue,
>>>> - add LED_BLINK_DISABLE flag,
>>>> - fix the heartbeat trigger (it's sleeping in a timer if
>>>> LED_BRIGHTNESS_SYNC
>>>>    is set).
>>>
>>> With my solution heartbeat trigger is not sleeping even if
>>> LED_BRIGHTNESS_SYNC is set as all triggers use the new function -
>>> led_set_brightness_nosleep.
>>>
>>>> I'd propose to drop led_set_brightness_async() and just make
>>>> led_set_brightness() asynchronous (or non-blocking if you wish) as it was
>>>> before the LED flash class patches. Considering the nature and
>>>> tradition of
>>>> the framework, that's probably how most users want it to be. One can
>>>> always
>>>> use led_set_brightness_sync() if needed.
>>
>> led_set_brightness called brightness_set op in a synchronous way
>> before LED flash class patches. It was up to driver how it implemented
>> the op - blocking or non-blocking. API was not async by default then.
>
> The framework did not implement it but the drivers did.

Roughly half of the total number of drivers use work queues.
The rest of them set the brightness synchronously.

When I run following command:

find drivers/leds -name "*.c" | xargs grep INIT_WORK | awk '{print $1}' 
| uniq | wc -l

it shows 31.

> Quite a few drivers
> actually change the LED state asynchronously, while the set_brightness()
> callback does not block.
 >
>>
>> Adding public API led_set_brightness_sync would introduce ambiguity, as
>> led_set_brightness also can be synchronous.
>
> Well, it could be synchronous, indeed. But synchronous operation is not
> guaranteed. The essence of this is that led_set_brightness() does not sleep.
> Whether the LED state is changed synchronously or not is not important.

I agree. I changed the approach in the new version of the patch set.

>>
>>>> The caller should indeed decide whether the operation is synchronous
>>>> or not,
>>>> that's not really a property of the LED. I requested that for the V4L2
>>>> framework due to the very different use cases that are typical for the
>>>> LED
>>>> class devices.
>>
>> I agree that caller should decide, but we would have to have unambiguous
>> API for this. I am wondering if renaming led_set_brightness to
>> led_set_brightness_async and making it always scheduling the work queue
>> would be harmless solution. This would modify only kernel internal API.
>
> We don't want to queue work if we just want to write to a register. The work
> queue should only be used for slow handlers that are better not called e.g.
> from interrupt context.

Right. Ignore this.

>> We could introduce led_set_brightness_sync API then, which would call
>> brightness_set op in a synchronous way.
>
> Considering the pre-flash LED use cases and what the V4L2 flash API
> requirements are, my understanding is that we should do with two LED class
> API functions for setting LED brightness:
>
> - led_set_brightness (which will not block and is very fast, but the LED
>    brightness change may happen asynchronously) and
>
> - led_set_brightness_sync (which is always synchronous).
>

Exactly.

-- 
Best Regards,
Jacek Anaszewski

WARNING: multiple messages have this Message-ID (diff)
From: Jacek Anaszewski <j.anaszewski@samsung.com>
To: Sakari Ailus <sakari.ailus@iki.fi>
Cc: linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org,
	cooloney@gmail.com, rpurdie@rpsys.net,
	stsp@users.sourceforge.net, pavel@ucw.cz,
	sakari.ailus@linux.intel.com, andreas.werner@men.de,
	andrew@lunn.ch, ospite@studenti.unina.it, anemo@mba.ocn.ne.jp,
	ben@simtec.co.uk, bootc@bootc.net, dmurphy@ti.com,
	daniel.jeong@ti.com, daniel@zonque.org, davem@davemloft.net,
	fabio.baltieri@gmail.com, balbi@ti.com, florian@openwrt.org,
	gshark.jeong@gmail.com, g.liakhovetski@gmx.de,
	ingi2.kim@samsung.com, dl9pf@gmx.de, johan@kernel.org,
	lenz@cs.wisc.edu, jogo@openwrt.org, q1.kim@samsung.com,
	kris@krisk.org, kristoffer.ericson@gmail.com,
	linus.walleij@linaro.org, broonie@kernel.org,
	michael.hennerich@analog.com, milo.kim@ti.com, nm127@freemail.hu,
	ncase@xes-inc.com, neilb@suse.de, nick.forbes@incepta.com,
	lost.distance@yahoo.com, p.meerwald@bct-electronic.com,
	n0-1@freewrt.org, philippe.retornaz@epfl.ch, raph@8d.com,
	rpurdie@openedhand.com, rod@whitby.id.au, dave@sr71.net,
	giometti@linux.it, bigeasy@linutronix.de, shuahkhan@gmail.com,
	sguinot@lacie.com
Subject: Re: [PATCH/RFC v2 1/5] leds: Use set_brightness_work for brightness_set ops that can sleep
Date: Fri, 03 Jul 2015 15:16:19 +0200	[thread overview]
Message-ID: <55968B23.6000109@samsung.com> (raw)
In-Reply-To: <20150701214456.GU5904@valkosipuli.retiisi.org.uk>

Hi Sakari,

On 07/01/2015 11:44 PM, Sakari Ailus wrote:
> Hi Jacek,
>
> On Wed, Jul 01, 2015 at 02:01:54PM +0200, Jacek Anaszewski wrote:
>> On 07/01/2015 11:52 AM, Jacek Anaszewski wrote:
>>> Hi Sakari,
>>>
>>> On 07/01/2015 12:24 AM, Sakari Ailus wrote:
>>>> Hi Jacek,
>>>>
>>>> On Tue, Jun 30, 2015 at 03:59:26PM +0200, Jacek Anaszewski wrote:
>>>>> This patch rearranges the core LED subsystem code, so that it
>>>>> now shifts the responsibility for using work queues from drivers,
>>>>> in case their brightness_set ops can sleep, onto the LED core
>>>>> Addition of two flags: LED_BRIGHTNESS_FAST and LED_BLINK_DISABLE
>>>>> as well as new_brightness_value property to the struct led_classdev
>>>>> allows for employing existing set_brightness_work to do the job.
>>>>> The modifications allows also to get rid of brightness_set_sync op,
>>>>> as flash LED devices can now be handled properly only basing on the
>>>>> SET_BRIGHTNESS_SYNC flag.
>>>>
>>>> Nice patch! Thanks!
>>>>
>>>> Looks like this is the favourite topic nowadays. ;-)
>>>
>>> Yeah, this allows to believe that we will manage to tackle the issue
>>> finally :)
>>>
>>>> The documentation should be improved to tell how the API is expected
>>>> to be
>>>> have, e.g. which functions may block. I think this is out of scope for
>>>> this
>>>> patch though.
>>>
>>> Yes, I planned to cover this after the patch is accepted.
>>>
>>>> I think all the existing drivers that implement the set_brightness()
>>>> callback have a fast (and non-blocking) implementation, and some of these
>>>> drivers use a work queue. In order to avoid modifying those drivers right
>>>> now, how about adding a flag for slow devices instead? "Slow" handlers
>>>> should be those that do at least one of the following: 1) sleep and 2)
>>>> take
>>>> excessive amount of time to run.
>>>
>>> As Andrew Lunn mentioned, he was also working on this issue and he did
>>> the vast majority of work [1] needed to remove work queues from existing
>>> drivers. Only new flags would have to be added.
>>>
>>>> How about splitting the patch as follows:
>>>>
>>>> - set_brightness()/set_brightness_sync() -> set_brightness() +
>>>>    LED_BRIGHTNESS_FAST + slow handlers in a work queue,
>>>> - add LED_BLINK_DISABLE flag,
>>>> - fix the heartbeat trigger (it's sleeping in a timer if
>>>> LED_BRIGHTNESS_SYNC
>>>>    is set).
>>>
>>> With my solution heartbeat trigger is not sleeping even if
>>> LED_BRIGHTNESS_SYNC is set as all triggers use the new function -
>>> led_set_brightness_nosleep.
>>>
>>>> I'd propose to drop led_set_brightness_async() and just make
>>>> led_set_brightness() asynchronous (or non-blocking if you wish) as it was
>>>> before the LED flash class patches. Considering the nature and
>>>> tradition of
>>>> the framework, that's probably how most users want it to be. One can
>>>> always
>>>> use led_set_brightness_sync() if needed.
>>
>> led_set_brightness called brightness_set op in a synchronous way
>> before LED flash class patches. It was up to driver how it implemented
>> the op - blocking or non-blocking. API was not async by default then.
>
> The framework did not implement it but the drivers did.

Roughly half of the total number of drivers use work queues.
The rest of them set the brightness synchronously.

When I run following command:

find drivers/leds -name "*.c" | xargs grep INIT_WORK | awk '{print $1}' 
| uniq | wc -l

it shows 31.

> Quite a few drivers
> actually change the LED state asynchronously, while the set_brightness()
> callback does not block.
 >
>>
>> Adding public API led_set_brightness_sync would introduce ambiguity, as
>> led_set_brightness also can be synchronous.
>
> Well, it could be synchronous, indeed. But synchronous operation is not
> guaranteed. The essence of this is that led_set_brightness() does not sleep.
> Whether the LED state is changed synchronously or not is not important.

I agree. I changed the approach in the new version of the patch set.

>>
>>>> The caller should indeed decide whether the operation is synchronous
>>>> or not,
>>>> that's not really a property of the LED. I requested that for the V4L2
>>>> framework due to the very different use cases that are typical for the
>>>> LED
>>>> class devices.
>>
>> I agree that caller should decide, but we would have to have unambiguous
>> API for this. I am wondering if renaming led_set_brightness to
>> led_set_brightness_async and making it always scheduling the work queue
>> would be harmless solution. This would modify only kernel internal API.
>
> We don't want to queue work if we just want to write to a register. The work
> queue should only be used for slow handlers that are better not called e.g.
> from interrupt context.

Right. Ignore this.

>> We could introduce led_set_brightness_sync API then, which would call
>> brightness_set op in a synchronous way.
>
> Considering the pre-flash LED use cases and what the V4L2 flash API
> requirements are, my understanding is that we should do with two LED class
> API functions for setting LED brightness:
>
> - led_set_brightness (which will not block and is very fast, but the LED
>    brightness change may happen asynchronously) and
>
> - led_set_brightness_sync (which is always synchronous).
>

Exactly.

-- 
Best Regards,
Jacek Anaszewski

  reply	other threads:[~2015-07-03 13:16 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-30 13:59 [PATCH/RFC v2 1/5] leds: Use set_brightness_work for brightness_set ops that can sleep Jacek Anaszewski
2015-06-30 13:59 ` Jacek Anaszewski
2015-06-30 13:59 ` [PATCH/RFC v2 2/5] leds: pwm: remove work queue Jacek Anaszewski
2015-06-30 13:59   ` Jacek Anaszewski
2015-06-30 13:59 ` [PATCH/RFC v2 3/5] led: flash: remove check for brightness_set_sync op Jacek Anaszewski
2015-06-30 13:59   ` Jacek Anaszewski
2015-06-30 13:59 ` [PATCH/RFC v2 4/5] leds: max77693: remove work queue Jacek Anaszewski
2015-06-30 13:59   ` Jacek Anaszewski
2015-06-30 13:59 ` [PATCH/RFC v2 5/5] leds: aat1290: " Jacek Anaszewski
2015-06-30 13:59   ` Jacek Anaszewski
2015-06-30 18:30 ` [PATCH/RFC v2 1/5] leds: Use set_brightness_work for brightness_set ops that can sleep Pavel Machek
2015-06-30 18:30   ` Pavel Machek
2015-06-30 22:24 ` Sakari Ailus
2015-06-30 22:24   ` Sakari Ailus
2015-07-01  9:42   ` Mark Brown
2015-07-01  9:42     ` Mark Brown
2015-07-01  9:52   ` Jacek Anaszewski
2015-07-01  9:52     ` Jacek Anaszewski
2015-07-01 12:01     ` Jacek Anaszewski
2015-07-01 12:01       ` Jacek Anaszewski
2015-07-01 21:44       ` Sakari Ailus
2015-07-01 21:44         ` Sakari Ailus
2015-07-03 13:16         ` Jacek Anaszewski [this message]
2015-07-03 13:16           ` Jacek Anaszewski
2015-07-01 21:36     ` Sakari Ailus
2015-07-01 21:36       ` Sakari Ailus
2015-07-01 22:56       ` Andrew Lunn
2015-07-01 22:56         ` Andrew Lunn
2015-07-03 13:16       ` Jacek Anaszewski
2015-07-03 13:16         ` Jacek Anaszewski

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=55968B23.6000109@samsung.com \
    --to=j.anaszewski@samsung.com \
    --cc=andreas.werner@men.de \
    --cc=andrew@lunn.ch \
    --cc=anemo@mba.ocn.ne.jp \
    --cc=balbi@ti.com \
    --cc=ben@simtec.co.uk \
    --cc=bootc@bootc.net \
    --cc=broonie@kernel.org \
    --cc=cooloney@gmail.com \
    --cc=daniel.jeong@ti.com \
    --cc=daniel@zonque.org \
    --cc=davem@davemloft.net \
    --cc=dl9pf@gmx.de \
    --cc=dmurphy@ti.com \
    --cc=fabio.baltieri@gmail.com \
    --cc=florian@openwrt.org \
    --cc=g.liakhovetski@gmx.de \
    --cc=gshark.jeong@gmail.com \
    --cc=ingi2.kim@samsung.com \
    --cc=jogo@openwrt.org \
    --cc=johan@kernel.org \
    --cc=kris@krisk.org \
    --cc=kristoffer.ericson@gmail.com \
    --cc=lenz@cs.wisc.edu \
    --cc=linus.walleij@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-leds@vger.kernel.org \
    --cc=lost.distance@yahoo.com \
    --cc=michael.hennerich@analog.com \
    --cc=milo.kim@ti.com \
    --cc=n0-1@freewrt.org \
    --cc=ncase@xes-inc.com \
    --cc=neilb@suse.de \
    --cc=nick.forbes@incepta.com \
    --cc=nm127@freemail.hu \
    --cc=ospite@studenti.unina.it \
    --cc=p.meerwald@bct-electronic.com \
    --cc=pavel@ucw.cz \
    --cc=q1.kim@samsung.com \
    --cc=rpurdie@rpsys.net \
    --cc=sakari.ailus@iki.fi \
    --cc=sakari.ailus@linux.intel.com \
    --cc=stsp@users.sourceforge.net \
    /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.