[openwrt/openwrt] generic: swconfig: reduce lock duration on sysfs files

LEDE Commits lede-commits at lists.infradead.org
Wed Feb 14 00:30:15 PST 2018


blogic pushed a commit to openwrt/openwrt.git, branch master:
https://git.lede-project.org/0b4e3b1bed6d0281cdad152724ba9224d5647437

commit 0b4e3b1bed6d0281cdad152724ba9224d5647437
Author: Kevin Darbyshire-Bryant <ldir at darbyshire-bryant.me.uk>
AuthorDate: Tue Feb 13 13:53:50 2018 +0000

    generic: swconfig: reduce lock duration on sysfs files
    
    sysfs attributes 'port_mask' & 'speed_mask' held locks whilst doing
    mundane tasks such as sprintf.  Refactor code to reduce length of time
    locks are held unnecessarily.
    
    Signed-off-by: Kevin Darbyshire-Bryant <ldir at darbyshire-bryant.me.uk>
---
 .../generic/files/drivers/net/phy/swconfig_leds.c    | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/target/linux/generic/files/drivers/net/phy/swconfig_leds.c b/target/linux/generic/files/drivers/net/phy/swconfig_leds.c
index 92be3c7..91824b7 100644
--- a/target/linux/generic/files/drivers/net/phy/swconfig_leds.c
+++ b/target/linux/generic/files/drivers/net/phy/swconfig_leds.c
@@ -124,18 +124,16 @@ swconfig_trig_port_mask_store(struct device *dev, struct device_attribute *attr,
 		return ret;
 
 	write_lock(&trig_data->lock);
-
 	changed = (trig_data->port_mask != port_mask);
+	trig_data->port_mask = port_mask;
+	write_unlock(&trig_data->lock);
+
 	if (changed) {
-		trig_data->port_mask = port_mask;
 		if (port_mask == 0)
 			swconfig_trig_set_brightness(trig_data, LED_OFF);
-	}
 
-	write_unlock(&trig_data->lock);
-
-	if (changed)
 		swconfig_trig_update_port_mask(led_cdev->trigger);
+	}
 
 	return size;
 }
@@ -146,11 +144,14 @@ swconfig_trig_port_mask_show(struct device *dev, struct device_attribute *attr,
 {
 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
 	struct swconfig_trig_data *trig_data = led_cdev->trigger_data;
+	u32 port_mask;
 
 	read_lock(&trig_data->lock);
-	sprintf(buf, "%#x\n", trig_data->port_mask);
+	port_mask = trig_data->port_mask;
 	read_unlock(&trig_data->lock);
 
+	sprintf(buf, "%#x\n", port_mask);
+
 	return strlen(buf) + 1;
 }
 
@@ -164,11 +165,14 @@ static ssize_t swconfig_trig_speed_mask_show(struct device *dev,
 {
 	struct led_classdev *led_cdev = dev_get_drvdata(dev);
 	struct swconfig_trig_data *trig_data = led_cdev->trigger_data;
+	u8 speed_mask;
 
 	read_lock(&trig_data->lock);
-	sprintf(buf, "%#x\n", trig_data->speed_mask);
+	speed_mask = trig_data->speed_mask;
 	read_unlock(&trig_data->lock);
 
+	sprintf(buf, "%#x\n", speed_mask);
+
 	return strlen(buf) + 1;
 }
 



More information about the lede-commits mailing list