generic: swconfig: reduce lock duration on sysfs files
authorKevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
Tue, 13 Feb 2018 13:53:50 +0000 (13:53 +0000)
committerJohn Crispin <john@phrozen.org>
Wed, 14 Feb 2018 06:54:24 +0000 (07:54 +0100)
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@darbyshire-bryant.me.uk>
target/linux/generic/files/drivers/net/phy/swconfig_leds.c

index 92be3c7501ff6a9ee7df2f2a2e2857164a338a1f..91824b7cf6b614ba333aa5d849a24531b3e29bd7 100644 (file)
@@ -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;
 }