From: Greg KH <gregkh@linuxfoundation.org>
To: Ian Pilcher <arequipeno@gmail.com>
Cc: axboe@kernel.dk, pavel@ucw.cz, linux-leds@vger.kernel.org,
linux-block@vger.kernel.org, linux@vger.kernel.org,
kabel@kernel.org
Subject: Re: [PATCH 09/18] ledtrig-blkdev: Periodically check devices for activity & blink LEDs
Date: Sat, 4 Sep 2021 08:01:41 +0200 [thread overview]
Message-ID: <YTMLxdQ3TFKPN+WH@kroah.com> (raw)
In-Reply-To: <20210903204548.2745354-10-arequipeno@gmail.com>
On Fri, Sep 03, 2021 at 03:45:39PM -0500, Ian Pilcher wrote:
> Use a delayed workqueue to periodically check configured block devices for
> activity since the last check. Blink LEDs associated with devices on which
> the configured type of activity (read/write) has occurred.
>
> Signed-off-by: Ian Pilcher <arequipeno@gmail.com>
> ---
> drivers/leds/trigger/ledtrig-blkdev.c | 88 +++++++++++++++++++++++++++
> 1 file changed, 88 insertions(+)
>
> diff --git a/drivers/leds/trigger/ledtrig-blkdev.c b/drivers/leds/trigger/ledtrig-blkdev.c
> index 1f319529c3be..37ba9bb3542e 100644
> --- a/drivers/leds/trigger/ledtrig-blkdev.c
> +++ b/drivers/leds/trigger/ledtrig-blkdev.c
> @@ -7,7 +7,9 @@
> */
>
> #include <linux/ctype.h>
> +#include <linux/leds.h>
> #include <linux/module.h>
> +#include <linux/part_stat.h>
>
> #include "ledtrig-blkdev.h"
>
> @@ -68,6 +70,10 @@ static unsigned int ledtrig_blkdev_count;
> /* How often to check for drive activity - in jiffies */
> static unsigned int ledtrig_blkdev_interval;
>
> +/* Delayed work used to periodically check for activity & blink LEDs */
> +static void blkdev_process(struct work_struct *const work);
> +static DECLARE_DELAYED_WORK(ledtrig_blkdev_work, blkdev_process);
> +
>
> /*
> *
> @@ -110,3 +116,85 @@ static bool blkdev_write_mode(const enum ledtrig_blkdev_mode mode)
> {
> return mode != LEDTRIG_BLKDEV_MODE_RO;
> }
> +
> +
> +/*
> + *
> + * Periodically check for device acitivity and blink LEDs
> + *
> + */
> +
> +static void blkdev_blink(const struct ledtrig_blkdev_led *const led)
> +{
> + unsigned long delay_on = READ_ONCE(led->blink_msec);
> + unsigned long delay_off = 1; /* 0 leaves LED turned on */
> +
> + led_blink_set_oneshot(led->led_dev, &delay_on, &delay_off, 0);
> +}
> +
> +static void blkdev_update_disk(struct ledtrig_blkdev_disk *const disk,
> + const unsigned int generation)
> +{
> + const struct block_device *const part0 = disk->gd->part0;
> + const unsigned long read_ios = part_stat_read(part0, ios[STAT_READ]);
> + const unsigned long write_ios = part_stat_read(part0, ios[STAT_WRITE])
> + + part_stat_read(part0, ios[STAT_DISCARD])
> + + part_stat_read(part0, ios[STAT_FLUSH]);
> +
> + if (disk->read_ios != read_ios) {
> + disk->read_act = true;
> + disk->read_ios = read_ios;
> + } else {
> + disk->read_act = false;
> + }
> +
> + if (disk->write_ios != write_ios) {
> + disk->write_act = true;
> + disk->write_ios = write_ios;
> + } else {
> + disk->write_act = false;
> + }
> +
> + disk->generation = generation;
> +}
> +
> +static void blkdev_process(struct work_struct *const work)
> +{
> + static unsigned int generation;
> +
> + struct ledtrig_blkdev_led *led;
> + struct ledtrig_blkdev_link *link;
> + unsigned long delay;
> +
> + if (!mutex_trylock(&ledtrig_blkdev_mutex))
> + goto exit_reschedule;
> +
> + hlist_for_each_entry(led, &ledtrig_blkdev_leds, leds_node) {
> +
> + hlist_for_each_entry(link, &led->disks, led_disks_node) {
> +
> + struct ledtrig_blkdev_disk *const disk = link->disk;
> +
> + if (disk->generation != generation)
> + blkdev_update_disk(disk, generation);
> +
> + if (disk->read_act && blkdev_read_mode(led->mode)) {
> + blkdev_blink(led);
> + break;
> + }
> +
> + if (disk->write_act && blkdev_write_mode(led->mode)) {
> + blkdev_blink(led);
> + break;
> + }
> + }
> + }
> +
> + ++generation;
> +
> + mutex_unlock(&ledtrig_blkdev_mutex);
> +
> +exit_reschedule:
> + delay = READ_ONCE(ledtrig_blkdev_interval);
> + WARN_ON_ONCE(!schedule_delayed_work(&ledtrig_blkdev_work, delay));
You just rebooted a machine if it hit this :(
Please never use WARN_ON() in new code unless the machine is really
broken and you can not do anything else here.
thanks,
greg k-h
next prev parent reply other threads:[~2021-09-04 6:01 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-03 20:45 [PATCH 00/18] Introduce block device LED trigger Ian Pilcher
2021-09-03 20:45 ` [PATCH 01/18] docs: Add block device (blkdev) LED trigger documentation Ian Pilcher
2021-09-04 6:29 ` Pavel Machek
2021-09-05 14:49 ` Ian Pilcher
2021-09-05 18:42 ` Pavel Machek
2021-09-05 23:13 ` Ian Pilcher
2021-09-03 20:45 ` [PATCH 02/18] ledtrig-blkdev: Add build infra for block device LED trigger Ian Pilcher
2021-09-03 20:45 ` [PATCH 03/18] ledtrig-blkdev: Add function placeholders needed by block changes Ian Pilcher
2021-09-04 16:57 ` kernel test robot
2021-09-04 16:57 ` kernel test robot
2021-09-03 20:45 ` [PATCH 04/18] block: Add block device LED trigger integrations Ian Pilcher
2021-09-03 20:45 ` [PATCH 05/18] ledtrig-blkdev: Implement functions called from block subsystem Ian Pilcher
2021-09-03 20:45 ` [PATCH 06/18] ledtrig-blkdev: Add function to get gendisk by name Ian Pilcher
2021-09-03 20:45 ` [PATCH 07/18] ledtrig-blkdev: Add constants, data types, and global variables Ian Pilcher
2021-09-03 20:45 ` [PATCH 08/18] ledtrig-blkdev: Add miscellaneous helper functions Ian Pilcher
2021-09-04 6:00 ` Greg KH
2021-09-04 22:43 ` Ian Pilcher
2021-09-03 20:45 ` [PATCH 09/18] ledtrig-blkdev: Periodically check devices for activity & blink LEDs Ian Pilcher
2021-09-04 6:01 ` Greg KH [this message]
2021-09-05 14:39 ` Ian Pilcher
2021-09-05 14:51 ` Greg KH
2021-09-05 14:56 ` Ian Pilcher
2021-09-05 15:12 ` Greg KH
2021-09-05 16:55 ` Eric Biggers
2021-09-03 20:45 ` [PATCH 10/18] ledtrig-blkdev: Add function to associate the trigger with an LED Ian Pilcher
2021-09-03 20:45 ` [PATCH 11/18] ledtrig-blkdev: Add function to associate a device " Ian Pilcher
2021-09-03 20:45 ` [PATCH 12/18] ledtrig-blkdev: Add function to remove LED/device association Ian Pilcher
2021-09-03 20:45 ` [PATCH 13/18] ledtrig-blkdev: Add function to disassociate a device from all LEDs Ian Pilcher
2021-09-03 20:45 ` [PATCH 14/18] ledtrig-blkdev: Add function to disassociate an LED from the trigger Ian Pilcher
2021-09-03 20:45 ` [PATCH 15/18] ledtrig-blkdev: Add sysfs attributes to [un]link LEDs & devices Ian Pilcher
2021-09-04 5:57 ` Greg KH
2021-09-04 21:28 ` Ian Pilcher
2021-09-04 5:59 ` Greg KH
2021-09-04 22:35 ` Ian Pilcher
2021-09-05 14:51 ` Greg KH
2021-09-05 15:33 ` Ian Pilcher
2021-09-05 16:43 ` Greg KH
2021-09-03 20:45 ` [PATCH 16/18] ledtrig-blkdev: Add blink_time & interval sysfs attributes Ian Pilcher
2021-09-03 20:45 ` [PATCH 17/18] ledtrig-blkdev: Add mode (read/write/rw) sysfs attributue Ian Pilcher
2021-09-04 5:57 ` Greg KH
2021-09-04 21:01 ` Ian Pilcher
2021-09-05 14:50 ` Greg KH
2021-09-03 20:45 ` [PATCH 18/18] ledtrig-blkdev: Add initialization & exit functions Ian Pilcher
2021-09-04 6:35 ` [PATCH 00/18] Introduce block device LED trigger Pavel Machek
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=YTMLxdQ3TFKPN+WH@kroah.com \
--to=gregkh@linuxfoundation.org \
--cc=arequipeno@gmail.com \
--cc=axboe@kernel.dk \
--cc=kabel@kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=linux@vger.kernel.org \
--cc=pavel@ucw.cz \
/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.