* [PATCH v3 0/5] gpio: sysfs: send character device notifications for sysfs class events
@ 2024-10-26 12:58 Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 1/5] gpio: sysfs: use cleanup guards for gpiod_data::mutex Bartosz Golaszewski
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Bartosz Golaszewski @ 2024-10-26 12:58 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Kent Gibson
Cc: linux-gpio, linux-kernel, Bartosz Golaszewski
This may be a total corner-case but for consistency and completeness I
think it makes sense to also send out line state change events on actions
triggered from the GPIO sysfs class.
The first two patches use cleanup helpers in sysfs code. The next three
change the code to emit notifications on line export (unexport is
already handled) and active_low & edge changes.
One last thing I considered was also notifying user-space whenever
gpiochip_un/lock_as_irq() is called but that doesn't make much sense as
it's largely independent from the GPIO core and can be called for both
requested and available lines whenever someone requests an interrupt
from a GPIO controller.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
Changes in v3:
- Keep the unusual order of operations in value_store()
- Link to v2: https://lore.kernel.org/r/20241025-gpio-notify-sysfs-v2-0-5bd1b1b0b3e6@linaro.org
Changes in v2:
- Streamline the code even more by dropping unnecessary return code
assignments
- use normal guards where scoped ones are overkill
- Link to v1: https://lore.kernel.org/r/20241024-gpio-notify-sysfs-v1-0-981f2773e785@linaro.org
---
Bartosz Golaszewski (5):
gpio: sysfs: use cleanup guards for gpiod_data::mutex
gpio: sysfs: use cleanup guards for the sysfs_lock mutex
gpio: sysfs: emit chardev line-state events on GPIO export
gpio: sysfs: emit chardev line-state events on active-low changes
gpio: sysfs: emit chardev line-state events on edge store
drivers/gpio/gpiolib-sysfs.c | 170 +++++++++++++++++++------------------------
1 file changed, 76 insertions(+), 94 deletions(-)
---
base-commit: a39230ecf6b3057f5897bc4744a790070cfbe7a8
change-id: 20241022-gpio-notify-sysfs-3bddf9ecca9f
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 1/5] gpio: sysfs: use cleanup guards for gpiod_data::mutex
2024-10-26 12:58 [PATCH v3 0/5] gpio: sysfs: send character device notifications for sysfs class events Bartosz Golaszewski
@ 2024-10-26 12:58 ` Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 2/5] gpio: sysfs: use cleanup guards for the sysfs_lock mutex Bartosz Golaszewski
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Bartosz Golaszewski @ 2024-10-26 12:58 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Kent Gibson
Cc: linux-gpio, linux-kernel, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Shrink the code and drop some goto labels by using lock guards around
gpiod_data::mutex.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpiolib-sysfs.c | 82 ++++++++++++++++----------------------------
1 file changed, 30 insertions(+), 52 deletions(-)
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
index 0c713baa7784..a0926a1061ae 100644
--- a/drivers/gpio/gpiolib-sysfs.c
+++ b/drivers/gpio/gpiolib-sysfs.c
@@ -77,12 +77,10 @@ static ssize_t direction_show(struct device *dev,
struct gpio_desc *desc = data->desc;
int value;
- mutex_lock(&data->mutex);
-
- gpiod_get_direction(desc);
- value = !!test_bit(FLAG_IS_OUT, &desc->flags);
-
- mutex_unlock(&data->mutex);
+ scoped_guard(mutex, &data->mutex) {
+ gpiod_get_direction(desc);
+ value = !!test_bit(FLAG_IS_OUT, &desc->flags);
+ }
return sysfs_emit(buf, "%s\n", value ? "out" : "in");
}
@@ -94,7 +92,7 @@ static ssize_t direction_store(struct device *dev,
struct gpio_desc *desc = data->desc;
ssize_t status;
- mutex_lock(&data->mutex);
+ guard(mutex)(&data->mutex);
if (sysfs_streq(buf, "high"))
status = gpiod_direction_output_raw(desc, 1);
@@ -105,8 +103,6 @@ static ssize_t direction_store(struct device *dev,
else
status = -EINVAL;
- mutex_unlock(&data->mutex);
-
return status ? : size;
}
static DEVICE_ATTR_RW(direction);
@@ -118,11 +114,8 @@ static ssize_t value_show(struct device *dev,
struct gpio_desc *desc = data->desc;
ssize_t status;
- mutex_lock(&data->mutex);
-
- status = gpiod_get_value_cansleep(desc);
-
- mutex_unlock(&data->mutex);
+ scoped_guard(mutex, &data->mutex)
+ status = gpiod_get_value_cansleep(desc);
if (status < 0)
return status;
@@ -140,18 +133,17 @@ static ssize_t value_store(struct device *dev,
status = kstrtol(buf, 0, &value);
- mutex_lock(&data->mutex);
+ guard(mutex)(&data->mutex);
- if (!test_bit(FLAG_IS_OUT, &desc->flags)) {
- status = -EPERM;
- } else if (status == 0) {
- gpiod_set_value_cansleep(desc, value);
- status = size;
- }
+ if (!test_bit(FLAG_IS_OUT, &desc->flags))
+ return -EPERM;
- mutex_unlock(&data->mutex);
+ if (status)
+ return status;
- return status;
+ gpiod_set_value_cansleep(desc, value);
+
+ return size;
}
static DEVICE_ATTR_PREALLOC(value, S_IWUSR | S_IRUGO, value_show, value_store);
@@ -253,11 +245,8 @@ static ssize_t edge_show(struct device *dev,
struct gpiod_data *data = dev_get_drvdata(dev);
int flags;
- mutex_lock(&data->mutex);
-
- flags = data->irq_flags;
-
- mutex_unlock(&data->mutex);
+ scoped_guard(mutex, &data->mutex)
+ flags = data->irq_flags;
if (flags >= ARRAY_SIZE(trigger_names))
return 0;
@@ -276,26 +265,22 @@ static ssize_t edge_store(struct device *dev,
if (flags < 0)
return flags;
- mutex_lock(&data->mutex);
+ guard(mutex)(&data->mutex);
- if (flags == data->irq_flags) {
- status = size;
- goto out_unlock;
- }
+ if (flags == data->irq_flags)
+ return size;
if (data->irq_flags)
gpio_sysfs_free_irq(dev);
- if (flags) {
- status = gpio_sysfs_request_irq(dev, flags);
- if (!status)
- status = size;
- }
+ if (!flags)
+ return size;
-out_unlock:
- mutex_unlock(&data->mutex);
+ status = gpio_sysfs_request_irq(dev, flags);
+ if (status)
+ return status;
- return status;
+ return size;
}
static DEVICE_ATTR_RW(edge);
@@ -330,11 +315,8 @@ static ssize_t active_low_show(struct device *dev,
struct gpio_desc *desc = data->desc;
int value;
- mutex_lock(&data->mutex);
-
- value = !!test_bit(FLAG_ACTIVE_LOW, &desc->flags);
-
- mutex_unlock(&data->mutex);
+ scoped_guard(mutex, &data->mutex)
+ value = !!test_bit(FLAG_ACTIVE_LOW, &desc->flags);
return sysfs_emit(buf, "%d\n", value);
}
@@ -350,13 +332,9 @@ static ssize_t active_low_store(struct device *dev,
if (status)
return status;
- mutex_lock(&data->mutex);
+ guard(mutex)(&data->mutex);
- status = gpio_sysfs_set_active_low(dev, value);
-
- mutex_unlock(&data->mutex);
-
- return status ? : size;
+ return gpio_sysfs_set_active_low(dev, value) ?: size;
}
static DEVICE_ATTR_RW(active_low);
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 2/5] gpio: sysfs: use cleanup guards for the sysfs_lock mutex
2024-10-26 12:58 [PATCH v3 0/5] gpio: sysfs: send character device notifications for sysfs class events Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 1/5] gpio: sysfs: use cleanup guards for gpiod_data::mutex Bartosz Golaszewski
@ 2024-10-26 12:58 ` Bartosz Golaszewski
2024-10-27 22:21 ` kernel test robot
2024-10-26 12:58 ` [PATCH v3 3/5] gpio: sysfs: emit chardev line-state events on GPIO export Bartosz Golaszewski
` (2 subsequent siblings)
4 siblings, 1 reply; 7+ messages in thread
From: Bartosz Golaszewski @ 2024-10-26 12:58 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Kent Gibson
Cc: linux-gpio, linux-kernel, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Shrink the code and remove some goto labels by using guards around the
sysfs_lock mutex. While at it: use __free(kfree) when allocating sysfs
callback data.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpiolib-sysfs.c | 64 ++++++++++++++++++--------------------------
1 file changed, 26 insertions(+), 38 deletions(-)
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
index a0926a1061ae..72617f929a2d 100644
--- a/drivers/gpio/gpiolib-sysfs.c
+++ b/drivers/gpio/gpiolib-sysfs.c
@@ -551,7 +551,6 @@ static const struct class gpio_class = {
int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
{
struct gpio_device *gdev;
- struct gpiod_data *data;
struct device *dev;
int status;
@@ -575,24 +574,25 @@ int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
gdev = desc->gdev;
- mutex_lock(&sysfs_lock);
+ guard(mutex)(&sysfs_lock);
/* check if chip is being removed */
if (!gdev->mockdev) {
status = -ENODEV;
- goto err_unlock;
+ goto err_clear_bit;
}
if (!test_bit(FLAG_REQUESTED, &desc->flags)) {
gpiod_dbg(desc, "%s: unavailable (not requested)\n", __func__);
status = -EPERM;
- goto err_unlock;
+ goto err_clear_bit;
}
- data = kzalloc(sizeof(*data), GFP_KERNEL);
+ struct gpiod_data *data __free(kfree) = kzalloc(sizeof(*data),
+ GFP_KERNEL);
if (!data) {
status = -ENOMEM;
- goto err_unlock;
+ goto err_clear_bit;
}
data->desc = desc;
@@ -607,16 +607,13 @@ int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
"gpio%u", desc_to_gpio(desc));
if (IS_ERR(dev)) {
status = PTR_ERR(dev);
- goto err_free_data;
+ goto err_clear_bit;
}
- mutex_unlock(&sysfs_lock);
+ data = NULL;
return 0;
-err_free_data:
- kfree(data);
-err_unlock:
- mutex_unlock(&sysfs_lock);
+err_clear_bit:
clear_bit(FLAG_EXPORT, &desc->flags);
gpiod_dbg(desc, "%s: status %d\n", __func__, status);
return status;
@@ -680,36 +677,28 @@ void gpiod_unexport(struct gpio_desc *desc)
return;
}
- mutex_lock(&sysfs_lock);
+ scoped_guard(mutex, &sysfs_lock) {
+ if (!test_bit(FLAG_EXPORT, &desc->flags))
+ return;
- if (!test_bit(FLAG_EXPORT, &desc->flags))
- goto err_unlock;
+ dev = class_find_device(&gpio_class, NULL, desc, match_export);
+ if (!dev)
+ return;
- dev = class_find_device(&gpio_class, NULL, desc, match_export);
- if (!dev)
- goto err_unlock;
+ data = dev_get_drvdata(dev);
+ clear_bit(FLAG_EXPORT, &desc->flags);
+ device_unregister(dev);
- data = dev_get_drvdata(dev);
-
- clear_bit(FLAG_EXPORT, &desc->flags);
-
- device_unregister(dev);
-
- /*
- * Release irq after deregistration to prevent race with edge_store.
- */
- if (data->irq_flags)
- gpio_sysfs_free_irq(dev);
-
- mutex_unlock(&sysfs_lock);
+ /*
+ * Release irq after deregistration to prevent race with
+ * edge_store.
+ */
+ if (data->irq_flags)
+ gpio_sysfs_free_irq(dev);
+ }
put_device(dev);
kfree(data);
-
- return;
-
-err_unlock:
- mutex_unlock(&sysfs_lock);
}
EXPORT_SYMBOL_GPL(gpiod_unexport);
@@ -750,9 +739,8 @@ int gpiochip_sysfs_register(struct gpio_device *gdev)
if (IS_ERR(dev))
return PTR_ERR(dev);
- mutex_lock(&sysfs_lock);
+ guard(mutex)(&sysfs_lock);
gdev->mockdev = dev;
- mutex_unlock(&sysfs_lock);
return 0;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 3/5] gpio: sysfs: emit chardev line-state events on GPIO export
2024-10-26 12:58 [PATCH v3 0/5] gpio: sysfs: send character device notifications for sysfs class events Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 1/5] gpio: sysfs: use cleanup guards for gpiod_data::mutex Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 2/5] gpio: sysfs: use cleanup guards for the sysfs_lock mutex Bartosz Golaszewski
@ 2024-10-26 12:58 ` Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 4/5] gpio: sysfs: emit chardev line-state events on active-low changes Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 5/5] gpio: sysfs: emit chardev line-state events on edge store Bartosz Golaszewski
4 siblings, 0 replies; 7+ messages in thread
From: Bartosz Golaszewski @ 2024-10-26 12:58 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Kent Gibson
Cc: linux-gpio, linux-kernel, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
We already emit a CONFIG_RELEASED event when a line is unexported over
sysfs (this is handled by gpiod_free()) but we don't do the opposite
when it's exported. This adds the missing call to
gpiod_line_state_notify().
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpiolib-sysfs.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
index 72617f929a2d..e1144d3c7645 100644
--- a/drivers/gpio/gpiolib-sysfs.c
+++ b/drivers/gpio/gpiolib-sysfs.c
@@ -21,6 +21,8 @@
#include <linux/gpio/consumer.h>
#include <linux/gpio/driver.h>
+#include <uapi/linux/gpio.h>
+
#include "gpiolib.h"
#include "gpiolib-sysfs.h"
@@ -471,10 +473,12 @@ static ssize_t export_store(const struct class *class,
}
status = gpiod_export(desc, true);
- if (status < 0)
+ if (status < 0) {
gpiod_free(desc);
- else
+ } else {
set_bit(FLAG_SYSFS, &desc->flags);
+ gpiod_line_state_notify(desc, GPIO_V2_LINE_CHANGED_REQUESTED);
+ }
done:
if (status)
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 4/5] gpio: sysfs: emit chardev line-state events on active-low changes
2024-10-26 12:58 [PATCH v3 0/5] gpio: sysfs: send character device notifications for sysfs class events Bartosz Golaszewski
` (2 preceding siblings ...)
2024-10-26 12:58 ` [PATCH v3 3/5] gpio: sysfs: emit chardev line-state events on GPIO export Bartosz Golaszewski
@ 2024-10-26 12:58 ` Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 5/5] gpio: sysfs: emit chardev line-state events on edge store Bartosz Golaszewski
4 siblings, 0 replies; 7+ messages in thread
From: Bartosz Golaszewski @ 2024-10-26 12:58 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Kent Gibson
Cc: linux-gpio, linux-kernel, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
The sysfs active_low attribute doesn't go through the usual paths so it
doesn't emit the line-state event. Add the missing call to
gpiod_line_state_notify() to gpio_sysfs_set_active_low().
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpiolib-sysfs.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
index e1144d3c7645..c0b7f42a0860 100644
--- a/drivers/gpio/gpiolib-sysfs.c
+++ b/drivers/gpio/gpiolib-sysfs.c
@@ -307,6 +307,8 @@ static int gpio_sysfs_set_active_low(struct device *dev, int value)
status = gpio_sysfs_request_irq(dev, flags);
}
+ gpiod_line_state_notify(desc, GPIO_V2_LINE_CHANGED_CONFIG);
+
return status;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 5/5] gpio: sysfs: emit chardev line-state events on edge store
2024-10-26 12:58 [PATCH v3 0/5] gpio: sysfs: send character device notifications for sysfs class events Bartosz Golaszewski
` (3 preceding siblings ...)
2024-10-26 12:58 ` [PATCH v3 4/5] gpio: sysfs: emit chardev line-state events on active-low changes Bartosz Golaszewski
@ 2024-10-26 12:58 ` Bartosz Golaszewski
4 siblings, 0 replies; 7+ messages in thread
From: Bartosz Golaszewski @ 2024-10-26 12:58 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, Kent Gibson
Cc: linux-gpio, linux-kernel, Bartosz Golaszewski
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
In order to emit line-state events on edge changes in sysfs, update the
EDGE flags in the descriptor in gpio_sysfs_request_irq() and emit the
event on a successful store.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpiolib-sysfs.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
index c0b7f42a0860..a7aa9fbb226e 100644
--- a/drivers/gpio/gpiolib-sysfs.c
+++ b/drivers/gpio/gpiolib-sysfs.c
@@ -179,12 +179,16 @@ static int gpio_sysfs_request_irq(struct device *dev, unsigned char flags)
return -ENODEV;
irq_flags = IRQF_SHARED;
- if (flags & GPIO_IRQF_TRIGGER_FALLING)
+ if (flags & GPIO_IRQF_TRIGGER_FALLING) {
irq_flags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ?
IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING;
- if (flags & GPIO_IRQF_TRIGGER_RISING)
+ set_bit(FLAG_EDGE_FALLING, &desc->flags);
+ }
+ if (flags & GPIO_IRQF_TRIGGER_RISING) {
irq_flags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ?
IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;
+ set_bit(FLAG_EDGE_RISING, &desc->flags);
+ }
/*
* FIXME: This should be done in the irq_request_resources callback
@@ -210,6 +214,8 @@ static int gpio_sysfs_request_irq(struct device *dev, unsigned char flags)
err_unlock:
gpiochip_unlock_as_irq(guard.gc, gpio_chip_hwgpio(desc));
err_put_kn:
+ clear_bit(FLAG_EDGE_RISING, &desc->flags);
+ clear_bit(FLAG_EDGE_FALLING, &desc->flags);
sysfs_put(data->value_kn);
return ret;
@@ -231,6 +237,8 @@ static void gpio_sysfs_free_irq(struct device *dev)
data->irq_flags = 0;
free_irq(data->irq, data);
gpiochip_unlock_as_irq(guard.gc, gpio_chip_hwgpio(desc));
+ clear_bit(FLAG_EDGE_RISING, &desc->flags);
+ clear_bit(FLAG_EDGE_FALLING, &desc->flags);
sysfs_put(data->value_kn);
}
@@ -282,6 +290,8 @@ static ssize_t edge_store(struct device *dev,
if (status)
return status;
+ gpiod_line_state_notify(data->desc, GPIO_V2_LINE_CHANGED_CONFIG);
+
return size;
}
static DEVICE_ATTR_RW(edge);
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 2/5] gpio: sysfs: use cleanup guards for the sysfs_lock mutex
2024-10-26 12:58 ` [PATCH v3 2/5] gpio: sysfs: use cleanup guards for the sysfs_lock mutex Bartosz Golaszewski
@ 2024-10-27 22:21 ` kernel test robot
0 siblings, 0 replies; 7+ messages in thread
From: kernel test robot @ 2024-10-27 22:21 UTC (permalink / raw)
To: Bartosz Golaszewski, Linus Walleij, Kent Gibson
Cc: llvm, oe-kbuild-all, linux-gpio, linux-kernel
Hi Bartosz,
kernel test robot noticed the following build errors:
[auto build test ERROR on a39230ecf6b3057f5897bc4744a790070cfbe7a8]
url: https://github.com/intel-lab-lkp/linux/commits/Bartosz-Golaszewski/gpio-sysfs-use-cleanup-guards-for-gpiod_data-mutex/20241026-210033
base: a39230ecf6b3057f5897bc4744a790070cfbe7a8
patch link: https://lore.kernel.org/r/20241026-gpio-notify-sysfs-v3-2-ad8f127d12f5%40linaro.org
patch subject: [PATCH v3 2/5] gpio: sysfs: use cleanup guards for the sysfs_lock mutex
config: i386-buildonly-randconfig-004-20241028 (https://download.01.org/0day-ci/archive/20241028/202410280514.EkyQpKfw-lkp@intel.com/config)
compiler: clang version 19.1.2 (https://github.com/llvm/llvm-project 7ba7d8e2f7b6445b60679da826210cdde29eaf8b)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241028/202410280514.EkyQpKfw-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202410280514.EkyQpKfw-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/gpio/gpiolib-sysfs.c:588:3: error: cannot jump from this goto statement to its label
588 | goto err_clear_bit;
| ^
drivers/gpio/gpiolib-sysfs.c:591:21: note: jump bypasses initialization of variable with __attribute__((cleanup))
591 | struct gpiod_data *data __free(kfree) = kzalloc(sizeof(*data),
| ^
drivers/gpio/gpiolib-sysfs.c:582:3: error: cannot jump from this goto statement to its label
582 | goto err_clear_bit;
| ^
drivers/gpio/gpiolib-sysfs.c:591:21: note: jump bypasses initialization of variable with __attribute__((cleanup))
591 | struct gpiod_data *data __free(kfree) = kzalloc(sizeof(*data),
| ^
2 errors generated.
vim +588 drivers/gpio/gpiolib-sysfs.c
534
535 /**
536 * gpiod_export - export a GPIO through sysfs
537 * @desc: GPIO to make available, already requested
538 * @direction_may_change: true if userspace may change GPIO direction
539 * Context: arch_initcall or later
540 *
541 * When drivers want to make a GPIO accessible to userspace after they
542 * have requested it -- perhaps while debugging, or as part of their
543 * public interface -- they may use this routine. If the GPIO can
544 * change direction (some can't) and the caller allows it, userspace
545 * will see "direction" sysfs attribute which may be used to change
546 * the gpio's direction. A "value" attribute will always be provided.
547 *
548 * Returns:
549 * 0 on success, or negative errno on failure.
550 */
551 int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
552 {
553 struct gpio_device *gdev;
554 struct device *dev;
555 int status;
556
557 /* can't export until sysfs is available ... */
558 if (!class_is_registered(&gpio_class)) {
559 pr_debug("%s: called too early!\n", __func__);
560 return -ENOENT;
561 }
562
563 if (!desc) {
564 pr_debug("%s: invalid gpio descriptor\n", __func__);
565 return -EINVAL;
566 }
567
568 CLASS(gpio_chip_guard, guard)(desc);
569 if (!guard.gc)
570 return -ENODEV;
571
572 if (test_and_set_bit(FLAG_EXPORT, &desc->flags))
573 return -EPERM;
574
575 gdev = desc->gdev;
576
577 guard(mutex)(&sysfs_lock);
578
579 /* check if chip is being removed */
580 if (!gdev->mockdev) {
581 status = -ENODEV;
582 goto err_clear_bit;
583 }
584
585 if (!test_bit(FLAG_REQUESTED, &desc->flags)) {
586 gpiod_dbg(desc, "%s: unavailable (not requested)\n", __func__);
587 status = -EPERM;
> 588 goto err_clear_bit;
589 }
590
591 struct gpiod_data *data __free(kfree) = kzalloc(sizeof(*data),
592 GFP_KERNEL);
593 if (!data) {
594 status = -ENOMEM;
595 goto err_clear_bit;
596 }
597
598 data->desc = desc;
599 mutex_init(&data->mutex);
600 if (guard.gc->direction_input && guard.gc->direction_output)
601 data->direction_can_change = direction_may_change;
602 else
603 data->direction_can_change = false;
604
605 dev = device_create_with_groups(&gpio_class, &gdev->dev,
606 MKDEV(0, 0), data, gpio_groups,
607 "gpio%u", desc_to_gpio(desc));
608 if (IS_ERR(dev)) {
609 status = PTR_ERR(dev);
610 goto err_clear_bit;
611 }
612
613 data = NULL;
614 return 0;
615
616 err_clear_bit:
617 clear_bit(FLAG_EXPORT, &desc->flags);
618 gpiod_dbg(desc, "%s: status %d\n", __func__, status);
619 return status;
620 }
621 EXPORT_SYMBOL_GPL(gpiod_export);
622
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-10-27 22:21 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-26 12:58 [PATCH v3 0/5] gpio: sysfs: send character device notifications for sysfs class events Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 1/5] gpio: sysfs: use cleanup guards for gpiod_data::mutex Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 2/5] gpio: sysfs: use cleanup guards for the sysfs_lock mutex Bartosz Golaszewski
2024-10-27 22:21 ` kernel test robot
2024-10-26 12:58 ` [PATCH v3 3/5] gpio: sysfs: emit chardev line-state events on GPIO export Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 4/5] gpio: sysfs: emit chardev line-state events on active-low changes Bartosz Golaszewski
2024-10-26 12:58 ` [PATCH v3 5/5] gpio: sysfs: emit chardev line-state events on edge store Bartosz Golaszewski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).