[RFC PATCH v2 00/10] Add configurable block device LED triggers

From: Ian Pilcher
Date: Sun Aug 08 2021 - 23:32:53 EST


This is a significant rewrite of the patchset that I originally posted
back on 28 July. It incorporates almost all of the suggestions that I
received as feedback to my original patchset (largely because I was
finally able to wrap my head around how complex LED triggers work).

One thing that has not changed is that associations between block
devices and LEDs are still set via an attribute on the device, rather
than the LED. This is much simpler, as the device attribute only has
to handle a single value (the name of the associated LED), rather than
potentially handling multiple device names.

More importantly, it avoids the need to iterate through all of the
block devices on the system, searching by name. This was proposed
fairly recently, and the reaction was not positive.[1][2]

I have modeled the interface for the /sys/block/<DEVICE>/led
attribute on the sysfs interface used for selecting a trigger. All
available LEDs (all LEDs associated with the blkdev trigger) are
shown when the attribute is read, with the currently selected LED
enclosed in square brackets ([]).

As before, this is all very new to me (particularly the RCU stuff), so
I welcome feedback.

Thanks!

Changes from the original patchset:

* Use a single complex LED trigger ("blkdev"), rather than multiple
user-defined triggers.

* Configurable blink time and interval for each LED:

/sys/class/leds/<LED>/blink_{on,off}

* Associated block devices linked from LED subdirectory:

/sys/class/leds/<LED>/block_devices

(Avoids violating the "one value per entry" sysfs rule.)

* Device-LED associations set via /sys/block/<DEVICE>/led

* Document all sysfs attributes in Documentation/ABI/testing (but also kept
the overview doc)

* Removed unnecessary [un]likely macros

* Reduced number of "user error" log messages and changed level to INFO

* More detailed commit messages

* Add Kconfig option in final commit

* Use RCU-protected pointer (rather than mutex)

* No in-kernel APIs for now

[1] https://www.spinics.net/lists/linux-leds/msg18256.html
[2] https://www.spinics.net/lists/linux-leds/msg18261.html

Ian Pilcher (10):
docs: Add block device LED trigger documentation
block: Add file (blk-ledtrig.c) for block device LED trigger
implementation
block: Add block device LED trigger fields to gendisk structure
block: Add functions to set & clear block device LEDs
block: Add block device sysfs attribute to set/clear/show LED
block: Add activate and deactivate functions for block device LED
trigger
block: Add sysfs attributes to LEDs associated with blkdev trigger
block: Add init function for block device LED trigger
block: Blink device LED (if any) when request is sent to its driver
block: Add config option to enable block device LED triggers

Documentation/ABI/testing/sysfs-block | 16 +
.../testing/sysfs-class-led-trigger-blkdev | 28 ++
Documentation/block/blk-ledtrig.rst | 79 +++
Documentation/block/index.rst | 1 +
block/Kconfig | 8 +
block/Makefile | 1 +
block/blk-ledtrig.c | 469 ++++++++++++++++++
block/blk-ledtrig.h | 45 ++
block/blk-mq.c | 2 +
block/genhd.c | 11 +
include/linux/genhd.h | 4 +
11 files changed, 664 insertions(+)
create mode 100644 Documentation/ABI/testing/sysfs-class-led-trigger-blkdev
create mode 100644 Documentation/block/blk-ledtrig.rst
create mode 100644 block/blk-ledtrig.c
create mode 100644 block/blk-ledtrig.h

--
2.31.1