123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- From d1b9e1391ab2dc80e9db87fe8b2de015c651e4c9 Mon Sep 17 00:00:00 2001
- From: Christian Marangi <[email protected]>
- Date: Wed, 19 Apr 2023 23:07:43 +0200
- Subject: [PATCH 5/5] leds: trigger: netdev: Use mutex instead of spinlocks
- Some LEDs may require to sleep while doing some operation like setting
- brightness and other cleanup.
- For this reason, using a spinlock will cause a sleep under spinlock
- warning.
- It should be safe to convert this to a sleepable lock since:
- - sysfs read/write can sleep
- - netdev_trig_work is a work queue and can sleep
- - netdev _trig_notify can sleep
- The spinlock was used when brightness didn't support sleeping, but this
- changed and now it supported with brightness_set_blocking().
- Convert to mutex lock to permit sleeping using brightness_set_blocking().
- Signed-off-by: Christian Marangi <[email protected]>
- Reviewed-by: Andrew Lunn <[email protected]>
- Signed-off-by: Lee Jones <[email protected]>
- Link: https://lore.kernel.org/r/[email protected]
- ---
- drivers/leds/trigger/ledtrig-netdev.c | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
- --- a/drivers/leds/trigger/ledtrig-netdev.c
- +++ b/drivers/leds/trigger/ledtrig-netdev.c
- @@ -20,7 +20,7 @@
- #include <linux/list.h>
- #include <linux/module.h>
- #include <linux/netdevice.h>
- -#include <linux/spinlock.h>
- +#include <linux/mutex.h>
- #include <linux/timer.h>
- #include "../leds.h"
-
- @@ -37,7 +37,7 @@
- */
-
- struct led_netdev_data {
- - spinlock_t lock;
- + struct mutex lock;
-
- struct delayed_work work;
- struct notifier_block notifier;
- @@ -97,9 +97,9 @@ static ssize_t device_name_show(struct d
- struct led_netdev_data *trigger_data = led_trigger_get_drvdata(dev);
- ssize_t len;
-
- - spin_lock_bh(&trigger_data->lock);
- + mutex_lock(&trigger_data->lock);
- len = sprintf(buf, "%s\n", trigger_data->device_name);
- - spin_unlock_bh(&trigger_data->lock);
- + mutex_unlock(&trigger_data->lock);
-
- return len;
- }
- @@ -115,7 +115,7 @@ static ssize_t device_name_store(struct
-
- cancel_delayed_work_sync(&trigger_data->work);
-
- - spin_lock_bh(&trigger_data->lock);
- + mutex_lock(&trigger_data->lock);
-
- if (trigger_data->net_dev) {
- dev_put(trigger_data->net_dev);
- @@ -138,7 +138,7 @@ static ssize_t device_name_store(struct
- trigger_data->last_activity = 0;
-
- set_baseline_state(trigger_data);
- - spin_unlock_bh(&trigger_data->lock);
- + mutex_unlock(&trigger_data->lock);
-
- return size;
- }
- @@ -279,7 +279,7 @@ static int netdev_trig_notify(struct not
-
- cancel_delayed_work_sync(&trigger_data->work);
-
- - spin_lock_bh(&trigger_data->lock);
- + mutex_lock(&trigger_data->lock);
-
- trigger_data->carrier_link_up = false;
- switch (evt) {
- @@ -304,7 +304,7 @@ static int netdev_trig_notify(struct not
-
- set_baseline_state(trigger_data);
-
- - spin_unlock_bh(&trigger_data->lock);
- + mutex_unlock(&trigger_data->lock);
-
- return NOTIFY_DONE;
- }
- @@ -365,7 +365,7 @@ static int netdev_trig_activate(struct l
- if (!trigger_data)
- return -ENOMEM;
-
- - spin_lock_init(&trigger_data->lock);
- + mutex_init(&trigger_data->lock);
-
- trigger_data->notifier.notifier_call = netdev_trig_notify;
- trigger_data->notifier.priority = 10;
|