* [PATCH v2 0/2] gpiolib: protect the list of GPIO devices with a mutex @ 2023-12-08 10:20 Bartosz Golaszewski 2023-12-08 10:20 ` [PATCH v2 1/2] gpiolib: rename static functions that are called with the lock taken Bartosz Golaszewski 2023-12-08 10:20 ` [PATCH v2 2/2] gpiolib: use a mutex to protect the list of GPIO devices Bartosz Golaszewski 0 siblings, 2 replies; 9+ messages in thread From: Bartosz Golaszewski @ 2023-12-08 10:20 UTC (permalink / raw) To: Linus Walleij, Andy Shevchenko, Kent Gibson Cc: linux-gpio, linux-kernel, Bartosz Golaszewski From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> I figured that - since the descriptor locking is going to take some more time - we should at least start the conversion and protect the GPIO device list with a mutex. Patch 2/2 here is actually a v2 of the original submission. v1 -> v2: - add a patch renaming two functions - protect the list in gpio_device_find() too - coding style tweaks Bartosz Golaszewski (2): gpiolib: rename static functions that are called with the lock taken gpiolib: use a mutex to protect the list of GPIO devices drivers/gpio/gpiolib-sysfs.c | 26 +----- drivers/gpio/gpiolib-sysfs.h | 6 ++ drivers/gpio/gpiolib.c | 166 ++++++++++++++++++----------------- drivers/gpio/gpiolib.h | 1 - 4 files changed, 94 insertions(+), 105 deletions(-) -- 2.40.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/2] gpiolib: rename static functions that are called with the lock taken 2023-12-08 10:20 [PATCH v2 0/2] gpiolib: protect the list of GPIO devices with a mutex Bartosz Golaszewski @ 2023-12-08 10:20 ` Bartosz Golaszewski 2023-12-08 14:06 ` Andy Shevchenko 2023-12-08 10:20 ` [PATCH v2 2/2] gpiolib: use a mutex to protect the list of GPIO devices Bartosz Golaszewski 1 sibling, 1 reply; 9+ messages in thread From: Bartosz Golaszewski @ 2023-12-08 10:20 UTC (permalink / raw) To: Linus Walleij, Andy Shevchenko, Kent Gibson Cc: linux-gpio, linux-kernel, Bartosz Golaszewski From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> Rename two functions that read or modify the global GPIO device list but don't take the lock themselves (and need to be called with it already acquired). Use the _unlocked() suffix which seems to be used quite consistently across the kernel despite there also existing the _locked() suffix for the same purpose. Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> --- drivers/gpio/gpiolib.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 4e190be75dc2..779f8b21bf05 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -290,7 +290,7 @@ struct gpio_chip *gpio_device_get_chip(struct gpio_device *gdev) EXPORT_SYMBOL_GPL(gpio_device_get_chip); /* dynamic allocation of GPIOs, e.g. on a hotplugged device */ -static int gpiochip_find_base(int ngpio) +static int gpiochip_find_base_unlocked(int ngpio) { struct gpio_device *gdev; int base = GPIO_DYNAMIC_BASE; @@ -363,7 +363,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_direction); * Return -EBUSY if the new chip overlaps with some other chip's integer * space. */ -static int gpiodev_add_to_list(struct gpio_device *gdev) +static int gpiodev_add_to_list_unlocked(struct gpio_device *gdev) { struct gpio_device *prev, *next; @@ -907,7 +907,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, */ base = gc->base; if (base < 0) { - base = gpiochip_find_base(gc->ngpio); + base = gpiochip_find_base_unlocked(gc->ngpio); if (base < 0) { spin_unlock_irqrestore(&gpio_lock, flags); ret = base; @@ -927,7 +927,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, } gdev->base = base; - ret = gpiodev_add_to_list(gdev); + ret = gpiodev_add_to_list_unlocked(gdev); if (ret) { spin_unlock_irqrestore(&gpio_lock, flags); chip_err(gc, "GPIO integer space overlap, cannot add chip\n"); -- 2.40.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/2] gpiolib: rename static functions that are called with the lock taken 2023-12-08 10:20 ` [PATCH v2 1/2] gpiolib: rename static functions that are called with the lock taken Bartosz Golaszewski @ 2023-12-08 14:06 ` Andy Shevchenko 0 siblings, 0 replies; 9+ messages in thread From: Andy Shevchenko @ 2023-12-08 14:06 UTC (permalink / raw) To: Bartosz Golaszewski Cc: Linus Walleij, Kent Gibson, linux-gpio, linux-kernel, Bartosz Golaszewski On Fri, Dec 08, 2023 at 11:20:19AM +0100, Bartosz Golaszewski wrote: > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > Rename two functions that read or modify the global GPIO device list but > don't take the lock themselves (and need to be called with it already > acquired). Use the _unlocked() suffix which seems to be used quite > consistently across the kernel despite there also existing the _locked() > suffix for the same purpose. Okay, Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 2/2] gpiolib: use a mutex to protect the list of GPIO devices 2023-12-08 10:20 [PATCH v2 0/2] gpiolib: protect the list of GPIO devices with a mutex Bartosz Golaszewski 2023-12-08 10:20 ` [PATCH v2 1/2] gpiolib: rename static functions that are called with the lock taken Bartosz Golaszewski @ 2023-12-08 10:20 ` Bartosz Golaszewski 2023-12-08 14:05 ` Andy Shevchenko 2023-12-14 12:26 ` Bartosz Golaszewski 1 sibling, 2 replies; 9+ messages in thread From: Bartosz Golaszewski @ 2023-12-08 10:20 UTC (permalink / raw) To: Linus Walleij, Andy Shevchenko, Kent Gibson Cc: linux-gpio, linux-kernel, Bartosz Golaszewski From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> The global list of GPIO devices is never modified or accessed from atomic context so it's fine to protect it using a mutex. Add a new global lock dedicated to the gpio_devices list and use it whenever accessing or modifying it. While at it: fold the sysfs registering of existing devices into gpiolib.c and make gpio_devices static within its compilation unit. Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> --- drivers/gpio/gpiolib-sysfs.c | 26 +----- drivers/gpio/gpiolib-sysfs.h | 6 ++ drivers/gpio/gpiolib.c | 162 ++++++++++++++++++----------------- drivers/gpio/gpiolib.h | 1 - 4 files changed, 92 insertions(+), 103 deletions(-) diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index 6f309a3b2d9a..c538568604e8 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c @@ -790,9 +790,7 @@ void gpiochip_sysfs_unregister(struct gpio_device *gdev) static int __init gpiolib_sysfs_init(void) { - int status; - unsigned long flags; - struct gpio_device *gdev; + int status; status = class_register(&gpio_class); if (status < 0) @@ -804,26 +802,6 @@ static int __init gpiolib_sysfs_init(void) * We run before arch_initcall() so chip->dev nodes can have * registered, and so arch_initcall() can always gpiod_export(). */ - spin_lock_irqsave(&gpio_lock, flags); - list_for_each_entry(gdev, &gpio_devices, list) { - if (gdev->mockdev) - continue; - - /* - * TODO we yield gpio_lock here because - * gpiochip_sysfs_register() acquires a mutex. This is unsafe - * and needs to be fixed. - * - * Also it would be nice to use gpio_device_find() here so we - * can keep gpio_chips local to gpiolib.c, but the yield of - * gpio_lock prevents us from doing this. - */ - spin_unlock_irqrestore(&gpio_lock, flags); - status = gpiochip_sysfs_register(gdev); - spin_lock_irqsave(&gpio_lock, flags); - } - spin_unlock_irqrestore(&gpio_lock, flags); - - return status; + return gpiochip_sysfs_register_all(); } postcore_initcall(gpiolib_sysfs_init); diff --git a/drivers/gpio/gpiolib-sysfs.h b/drivers/gpio/gpiolib-sysfs.h index b794b396d6a5..ab157cec0b4b 100644 --- a/drivers/gpio/gpiolib-sysfs.h +++ b/drivers/gpio/gpiolib-sysfs.h @@ -8,6 +8,7 @@ struct gpio_device; #ifdef CONFIG_GPIO_SYSFS int gpiochip_sysfs_register(struct gpio_device *gdev); +int gpiochip_sysfs_register_all(void); void gpiochip_sysfs_unregister(struct gpio_device *gdev); #else @@ -17,6 +18,11 @@ static inline int gpiochip_sysfs_register(struct gpio_device *gdev) return 0; } +static inline int gpiochip_sysfs_register_all(void) +{ + return 0; +} + static inline void gpiochip_sysfs_unregister(struct gpio_device *gdev) { } diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 779f8b21bf05..9aaf1d11fdd9 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -2,6 +2,7 @@ #include <linux/acpi.h> #include <linux/bitmap.h> +#include <linux/cleanup.h> #include <linux/compat.h> #include <linux/debugfs.h> #include <linux/device.h> @@ -15,6 +16,7 @@ #include <linux/kernel.h> #include <linux/list.h> #include <linux/module.h> +#include <linux/mutex.h> #include <linux/of.h> #include <linux/pinctrl/consumer.h> #include <linux/seq_file.h> @@ -94,7 +96,9 @@ DEFINE_SPINLOCK(gpio_lock); static DEFINE_MUTEX(gpio_lookup_lock); static LIST_HEAD(gpio_lookup_list); -LIST_HEAD(gpio_devices); + +static LIST_HEAD(gpio_devices); +static DEFINE_MUTEX(gpio_devices_lock); static DEFINE_MUTEX(gpio_machine_hogs_mutex); static LIST_HEAD(gpio_machine_hogs); @@ -126,20 +130,15 @@ static inline void desc_set_label(struct gpio_desc *d, const char *label) struct gpio_desc *gpio_to_desc(unsigned gpio) { struct gpio_device *gdev; - unsigned long flags; - spin_lock_irqsave(&gpio_lock, flags); - - list_for_each_entry(gdev, &gpio_devices, list) { - if (gdev->base <= gpio && - gdev->base + gdev->ngpio > gpio) { - spin_unlock_irqrestore(&gpio_lock, flags); - return &gdev->descs[gpio - gdev->base]; + scoped_guard(mutex, &gpio_devices_lock) { + list_for_each_entry(gdev, &gpio_devices, list) { + if (gdev->base <= gpio && + gdev->base + gdev->ngpio > gpio) + return &gdev->descs[gpio - gdev->base]; } } - spin_unlock_irqrestore(&gpio_lock, flags); - if (!gpio_is_valid(gpio)) pr_warn("invalid GPIO %d\n", gpio); @@ -412,26 +411,21 @@ static int gpiodev_add_to_list_unlocked(struct gpio_device *gdev) static struct gpio_desc *gpio_name_to_desc(const char * const name) { struct gpio_device *gdev; - unsigned long flags; if (!name) return NULL; - spin_lock_irqsave(&gpio_lock, flags); + guard(mutex)(&gpio_devices_lock); list_for_each_entry(gdev, &gpio_devices, list) { struct gpio_desc *desc; for_each_gpio_desc(gdev->chip, desc) { - if (desc->name && !strcmp(desc->name, name)) { - spin_unlock_irqrestore(&gpio_lock, flags); + if (desc->name && !strcmp(desc->name, name)) return desc; - } } } - spin_unlock_irqrestore(&gpio_lock, flags); - return NULL; } @@ -669,11 +663,9 @@ EXPORT_SYMBOL_GPL(gpiochip_line_is_valid); static void gpiodev_release(struct device *dev) { struct gpio_device *gdev = to_gpio_device(dev); - unsigned long flags; - spin_lock_irqsave(&gpio_lock, flags); - list_del(&gdev->list); - spin_unlock_irqrestore(&gpio_lock, flags); + scoped_guard(mutex, &gpio_devices_lock) + list_del(&gdev->list); ida_free(&gpio_ida, gdev->id); kfree_const(gdev->label); @@ -726,6 +718,27 @@ static int gpiochip_setup_dev(struct gpio_device *gdev) return ret; } +#if IS_ENABLED(CONFIG_GPIO_SYSFS) +int gpiochip_sysfs_register_all(void) +{ + struct gpio_device *gdev; + int ret; + + guard(mutex)(&gpio_devices_lock); + + list_for_each_entry(gdev, &gpio_devices, list) { + if (gdev->mockdev) + continue; + + ret = gpiochip_sysfs_register(gdev); + if (ret) + return ret; + } + + return 0; +} +#endif /* CONFIG_GPIO_SYSFS */ + static void gpiochip_machine_hog(struct gpio_chip *gc, struct gpiod_hog *hog) { struct gpio_desc *desc; @@ -831,7 +844,6 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, struct lock_class_key *request_key) { struct gpio_device *gdev; - unsigned long flags; unsigned int i; int base = 0; int ret = 0; @@ -896,48 +908,45 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, gdev->ngpio = gc->ngpio; - spin_lock_irqsave(&gpio_lock, flags); + scoped_guard(mutex, &gpio_devices_lock) { + /* + * TODO: this allocates a Linux GPIO number base in the global + * GPIO numberspace for this chip. In the long run we want to + * get *rid* of this numberspace and use only descriptors, but + * it may be a pipe dream. It will not happen before we get rid + * of the sysfs interface anyways. + */ + base = gc->base; - /* - * TODO: this allocates a Linux GPIO number base in the global - * GPIO numberspace for this chip. In the long run we want to - * get *rid* of this numberspace and use only descriptors, but - * it may be a pipe dream. It will not happen before we get rid - * of the sysfs interface anyways. - */ - base = gc->base; - if (base < 0) { - base = gpiochip_find_base_unlocked(gc->ngpio); if (base < 0) { - spin_unlock_irqrestore(&gpio_lock, flags); - ret = base; - base = 0; + base = gpiochip_find_base_unlocked(gc->ngpio); + if (base < 0) { + ret = base; + base = 0; + goto err_free_label; + } + /* + * TODO: it should not be necessary to reflect the assigned + * base outside of the GPIO subsystem. Go over drivers and + * see if anyone makes use of this, else drop this and assign + * a poison instead. + */ + gc->base = base; + } else { + dev_warn(&gdev->dev, + "Static allocation of GPIO base is deprecated, use dynamic allocation.\n"); + } + gdev->base = base; + + ret = gpiodev_add_to_list_unlocked(gdev); + if (ret) { + chip_err(gc, "GPIO integer space overlap, cannot add chip\n"); goto err_free_label; } - /* - * TODO: it should not be necessary to reflect the assigned - * base outside of the GPIO subsystem. Go over drivers and - * see if anyone makes use of this, else drop this and assign - * a poison instead. - */ - gc->base = base; - } else { - dev_warn(&gdev->dev, - "Static allocation of GPIO base is deprecated, use dynamic allocation.\n"); + + for (i = 0; i < gc->ngpio; i++) + gdev->descs[i].gdev = gdev; } - gdev->base = base; - - ret = gpiodev_add_to_list_unlocked(gdev); - if (ret) { - spin_unlock_irqrestore(&gpio_lock, flags); - chip_err(gc, "GPIO integer space overlap, cannot add chip\n"); - goto err_free_label; - } - - for (i = 0; i < gc->ngpio; i++) - gdev->descs[i].gdev = gdev; - - spin_unlock_irqrestore(&gpio_lock, flags); BLOCKING_INIT_NOTIFIER_HEAD(&gdev->line_state_notifier); BLOCKING_INIT_NOTIFIER_HEAD(&gdev->device_notifier); @@ -1029,9 +1038,8 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, goto err_print_message; } err_remove_from_list: - spin_lock_irqsave(&gpio_lock, flags); - list_del(&gdev->list); - spin_unlock_irqrestore(&gpio_lock, flags); + scoped_guard(mutex, &gpio_devices_lock) + list_del(&gdev->list); err_free_label: kfree_const(gdev->label); err_free_descs: @@ -1140,7 +1148,7 @@ struct gpio_device *gpio_device_find(void *data, */ might_sleep(); - guard(spinlock_irqsave)(&gpio_lock); + guard(mutex)(&gpio_devices_lock); list_for_each_entry(gdev, &gpio_devices, list) { if (gdev->chip && match(gdev->chip, data)) @@ -4748,35 +4756,33 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_device *gdev) static void *gpiolib_seq_start(struct seq_file *s, loff_t *pos) { - unsigned long flags; struct gpio_device *gdev = NULL; loff_t index = *pos; s->private = ""; - spin_lock_irqsave(&gpio_lock, flags); - list_for_each_entry(gdev, &gpio_devices, list) - if (index-- == 0) { - spin_unlock_irqrestore(&gpio_lock, flags); + guard(mutex)(&gpio_devices_lock); + + list_for_each_entry(gdev, &gpio_devices, list) { + if (index-- == 0) return gdev; - } - spin_unlock_irqrestore(&gpio_lock, flags); + } return NULL; } static void *gpiolib_seq_next(struct seq_file *s, void *v, loff_t *pos) { - unsigned long flags; struct gpio_device *gdev = v; void *ret = NULL; - spin_lock_irqsave(&gpio_lock, flags); - if (list_is_last(&gdev->list, &gpio_devices)) - ret = NULL; - else - ret = list_first_entry(&gdev->list, struct gpio_device, list); - spin_unlock_irqrestore(&gpio_lock, flags); + scoped_guard(mutex, &gpio_devices_lock) { + if (list_is_last(&gdev->list, &gpio_devices)) + ret = NULL; + else + ret = list_first_entry(&gdev->list, struct gpio_device, + list); + } s->private = "\n"; ++*pos; diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h index 3ccacf3c1288..9278796db079 100644 --- a/drivers/gpio/gpiolib.h +++ b/drivers/gpio/gpiolib.h @@ -135,7 +135,6 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep, int gpiod_set_transitory(struct gpio_desc *desc, bool transitory); extern spinlock_t gpio_lock; -extern struct list_head gpio_devices; void gpiod_line_state_notify(struct gpio_desc *desc, unsigned long action); -- 2.40.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/2] gpiolib: use a mutex to protect the list of GPIO devices 2023-12-08 10:20 ` [PATCH v2 2/2] gpiolib: use a mutex to protect the list of GPIO devices Bartosz Golaszewski @ 2023-12-08 14:05 ` Andy Shevchenko 2023-12-14 13:59 ` Bartosz Golaszewski 2023-12-14 12:26 ` Bartosz Golaszewski 1 sibling, 1 reply; 9+ messages in thread From: Andy Shevchenko @ 2023-12-08 14:05 UTC (permalink / raw) To: Bartosz Golaszewski Cc: Linus Walleij, Kent Gibson, linux-gpio, linux-kernel, Bartosz Golaszewski On Fri, Dec 08, 2023 at 11:20:20AM +0100, Bartosz Golaszewski wrote: > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > The global list of GPIO devices is never modified or accessed from > atomic context so it's fine to protect it using a mutex. Add a new > global lock dedicated to the gpio_devices list and use it whenever > accessing or modifying it. ... > While at it: fold the sysfs registering of existing devices into > gpiolib.c and make gpio_devices static within its compilation unit. TBH I do not like injecting sysfs (legacy!) code into gpiolib. It makes things at very least confusing. That _ugly_ ifdeffery and sysfs in the function name are not okay. If you want do that, please create a separate change and explain the rationale behind with answering to the Q "Why do we need all that and why is it better than any alternatives?". -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/2] gpiolib: use a mutex to protect the list of GPIO devices 2023-12-08 14:05 ` Andy Shevchenko @ 2023-12-14 13:59 ` Bartosz Golaszewski 2023-12-14 14:04 ` Andy Shevchenko 0 siblings, 1 reply; 9+ messages in thread From: Bartosz Golaszewski @ 2023-12-14 13:59 UTC (permalink / raw) To: Andy Shevchenko Cc: Linus Walleij, Kent Gibson, linux-gpio, linux-kernel, Bartosz Golaszewski On Thu, Dec 14, 2023 at 2:53 PM Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote: > > On Fri, Dec 08, 2023 at 11:20:20AM +0100, Bartosz Golaszewski wrote: > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > > > The global list of GPIO devices is never modified or accessed from > > atomic context so it's fine to protect it using a mutex. Add a new > > global lock dedicated to the gpio_devices list and use it whenever > > accessing or modifying it. > > ... > > > While at it: fold the sysfs registering of existing devices into > > gpiolib.c and make gpio_devices static within its compilation unit. > > TBH I do not like injecting sysfs (legacy!) code into gpiolib. > It makes things at very least confusing. > > That _ugly_ ifdeffery and sysfs in the function name are not okay. > > If you want do that, please create a separate change and explain the rationale > behind with answering to the Q "Why do we need all that and why is it better > than any alternatives?". > I can move it back to gpiolib-sysfs.c but this way we'll have to keep the GPIO device mutex public in gpiolib.h. Bart > -- > With Best Regards, > Andy Shevchenko > > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/2] gpiolib: use a mutex to protect the list of GPIO devices 2023-12-14 13:59 ` Bartosz Golaszewski @ 2023-12-14 14:04 ` Andy Shevchenko 2023-12-14 14:18 ` Bartosz Golaszewski 0 siblings, 1 reply; 9+ messages in thread From: Andy Shevchenko @ 2023-12-14 14:04 UTC (permalink / raw) To: Bartosz Golaszewski Cc: Linus Walleij, Kent Gibson, linux-gpio, linux-kernel, Bartosz Golaszewski On Thu, Dec 14, 2023 at 02:59:28PM +0100, Bartosz Golaszewski wrote: > On Thu, Dec 14, 2023 at 2:53 PM Andy Shevchenko > <andriy.shevchenko@linux.intel.com> wrote: > > > > On Fri, Dec 08, 2023 at 11:20:20AM +0100, Bartosz Golaszewski wrote: > > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > > > > > The global list of GPIO devices is never modified or accessed from > > > atomic context so it's fine to protect it using a mutex. Add a new > > > global lock dedicated to the gpio_devices list and use it whenever > > > accessing or modifying it. ... > > > While at it: fold the sysfs registering of existing devices into > > > gpiolib.c and make gpio_devices static within its compilation unit. > > > > TBH I do not like injecting sysfs (legacy!) code into gpiolib. > > It makes things at very least confusing. > > > > That _ugly_ ifdeffery and sysfs in the function name are not okay. > > > > If you want do that, please create a separate change and explain the rationale > > behind with answering to the Q "Why do we need all that and why is it better > > than any alternatives?". > > I can move it back to gpiolib-sysfs.c but this way we'll have to keep > the GPIO device mutex public in gpiolib.h. And I'm fine with that. Again, we can discuss this in a separate change that will do that (make that mutex local with the explanation why). -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/2] gpiolib: use a mutex to protect the list of GPIO devices 2023-12-14 14:04 ` Andy Shevchenko @ 2023-12-14 14:18 ` Bartosz Golaszewski 0 siblings, 0 replies; 9+ messages in thread From: Bartosz Golaszewski @ 2023-12-14 14:18 UTC (permalink / raw) To: Andy Shevchenko Cc: Linus Walleij, Kent Gibson, linux-gpio, linux-kernel, Bartosz Golaszewski On Thu, Dec 14, 2023 at 3:04 PM Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote: > > On Thu, Dec 14, 2023 at 02:59:28PM +0100, Bartosz Golaszewski wrote: > > On Thu, Dec 14, 2023 at 2:53 PM Andy Shevchenko > > <andriy.shevchenko@linux.intel.com> wrote: > > > > > > On Fri, Dec 08, 2023 at 11:20:20AM +0100, Bartosz Golaszewski wrote: > > > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > > > > > > > The global list of GPIO devices is never modified or accessed from > > > > atomic context so it's fine to protect it using a mutex. Add a new > > > > global lock dedicated to the gpio_devices list and use it whenever > > > > accessing or modifying it. > > ... > > > > > While at it: fold the sysfs registering of existing devices into > > > > gpiolib.c and make gpio_devices static within its compilation unit. > > > > > > TBH I do not like injecting sysfs (legacy!) code into gpiolib. > > > It makes things at very least confusing. > > > > > > That _ugly_ ifdeffery and sysfs in the function name are not okay. > > > > > > If you want do that, please create a separate change and explain the rationale > > > behind with answering to the Q "Why do we need all that and why is it better > > > than any alternatives?". > > > > I can move it back to gpiolib-sysfs.c but this way we'll have to keep > > the GPIO device mutex public in gpiolib.h. > > And I'm fine with that. Again, we can discuss this in a separate change that > will do that (make that mutex local with the explanation why). > No, I won't be sending one. I'll send another iteration of this with sysfs stuff contained to gpiolib-sysfs.c. Bart > -- > With Best Regards, > Andy Shevchenko > > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/2] gpiolib: use a mutex to protect the list of GPIO devices 2023-12-08 10:20 ` [PATCH v2 2/2] gpiolib: use a mutex to protect the list of GPIO devices Bartosz Golaszewski 2023-12-08 14:05 ` Andy Shevchenko @ 2023-12-14 12:26 ` Bartosz Golaszewski 1 sibling, 0 replies; 9+ messages in thread From: Bartosz Golaszewski @ 2023-12-14 12:26 UTC (permalink / raw) To: Linus Walleij, Andy Shevchenko, Kent Gibson Cc: linux-gpio, linux-kernel, Bartosz Golaszewski On Fri, Dec 8, 2023 at 11:20 AM Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > The global list of GPIO devices is never modified or accessed from > atomic context so it's fine to protect it using a mutex. Add a new > global lock dedicated to the gpio_devices list and use it whenever > accessing or modifying it. > > While at it: fold the sysfs registering of existing devices into > gpiolib.c and make gpio_devices static within its compilation unit. > > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> If there are no objections, I'll apply it tomorrow. Bart ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2023-12-14 14:19 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-12-08 10:20 [PATCH v2 0/2] gpiolib: protect the list of GPIO devices with a mutex Bartosz Golaszewski 2023-12-08 10:20 ` [PATCH v2 1/2] gpiolib: rename static functions that are called with the lock taken Bartosz Golaszewski 2023-12-08 14:06 ` Andy Shevchenko 2023-12-08 10:20 ` [PATCH v2 2/2] gpiolib: use a mutex to protect the list of GPIO devices Bartosz Golaszewski 2023-12-08 14:05 ` Andy Shevchenko 2023-12-14 13:59 ` Bartosz Golaszewski 2023-12-14 14:04 ` Andy Shevchenko 2023-12-14 14:18 ` Bartosz Golaszewski 2023-12-14 12:26 ` 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).