Skip to content

Commit e28747d

Browse files
andy-shevbrgl
authored andcommitted
gpiolib: sysfs: Move sysfs_emit() calls outside of the mutex lock
In a few places we perform sysfs_emit() operations under mutex that do not require any locking. Move them outside of the mutex locks. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
1 parent 4398693 commit e28747d

1 file changed

Lines changed: 14 additions & 15 deletions

File tree

drivers/gpio/gpiolib-sysfs.c

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,16 @@ static ssize_t direction_show(struct device *dev,
6161
{
6262
struct gpiod_data *data = dev_get_drvdata(dev);
6363
struct gpio_desc *desc = data->desc;
64-
ssize_t status;
64+
int value;
6565

6666
mutex_lock(&data->mutex);
6767

6868
gpiod_get_direction(desc);
69-
status = sysfs_emit(buf, "%s\n",
70-
test_bit(FLAG_IS_OUT, &desc->flags) ? "out" : "in");
69+
value = !!test_bit(FLAG_IS_OUT, &desc->flags);
7170

7271
mutex_unlock(&data->mutex);
7372

74-
return status;
73+
return sysfs_emit(buf, "%s\n", value ? "out" : "in");
7574
}
7675

7776
static ssize_t direction_store(struct device *dev,
@@ -108,12 +107,13 @@ static ssize_t value_show(struct device *dev,
108107
mutex_lock(&data->mutex);
109108

110109
status = gpiod_get_value_cansleep(desc);
111-
if (status >= 0)
112-
status = sysfs_emit(buf, "%zd\n", status);
113110

114111
mutex_unlock(&data->mutex);
115112

116-
return status;
113+
if (status < 0)
114+
return status;
115+
116+
return sysfs_emit(buf, "%zd\n", status);
117117
}
118118

119119
static ssize_t value_store(struct device *dev,
@@ -238,7 +238,6 @@ static ssize_t edge_show(struct device *dev,
238238
struct device_attribute *attr, char *buf)
239239
{
240240
struct gpiod_data *data = dev_get_drvdata(dev);
241-
ssize_t status = 0;
242241
int i;
243242

244243
mutex_lock(&data->mutex);
@@ -247,12 +246,13 @@ static ssize_t edge_show(struct device *dev,
247246
if (data->irq_flags == trigger_types[i].flags)
248247
break;
249248
}
250-
if (i < ARRAY_SIZE(trigger_types))
251-
status = sysfs_emit(buf, "%s\n", trigger_types[i].name);
252249

253250
mutex_unlock(&data->mutex);
254251

255-
return status;
252+
if (i >= ARRAY_SIZE(trigger_types))
253+
return 0;
254+
255+
return sysfs_emit(buf, "%s\n", trigger_types[i].name);
256256
}
257257

258258
static ssize_t edge_store(struct device *dev,
@@ -324,16 +324,15 @@ static ssize_t active_low_show(struct device *dev,
324324
{
325325
struct gpiod_data *data = dev_get_drvdata(dev);
326326
struct gpio_desc *desc = data->desc;
327-
ssize_t status;
327+
int value;
328328

329329
mutex_lock(&data->mutex);
330330

331-
status = sysfs_emit(buf, "%d\n",
332-
!!test_bit(FLAG_ACTIVE_LOW, &desc->flags));
331+
value = !!test_bit(FLAG_ACTIVE_LOW, &desc->flags);
333332

334333
mutex_unlock(&data->mutex);
335334

336-
return status;
335+
return sysfs_emit(buf, "%d\n", value);
337336
}
338337

339338
static ssize_t active_low_store(struct device *dev,

0 commit comments

Comments
 (0)