Message ID | 20231212105501.16347-1-brgl@bgdev.pl |
---|---|
State | New |
Headers | show |
Series | gpiolib: allocate memory atomically with a spinlock held | expand |
On Tue, Dec 12, 2023 at 11:55 AM Bartosz Golaszewski <brgl@bgdev.pl> wrote: > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > We will eventually switch to protecting the GPIO descriptors with a mutex > but until then, we need to allocate memory for the label copy atomically > while we're holding the global spinlock. > > Reported-by: Dan Carpenter <dan.carpenter@linaro.org> > Closes: https://lore.kernel.org/linux-gpio/62588146-eed6-42f7-ba26-160226b109fe@moroto.mountain/T/#u > Fixes: f8d05e276b45 ("gpiolib: remove gpiochip_is_requested()") > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> Makes sense. Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij
On Tue, Dec 12, 2023 at 11:55 AM Bartosz Golaszewski <brgl@bgdev.pl> wrote: > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > > We will eventually switch to protecting the GPIO descriptors with a mutex > but until then, we need to allocate memory for the label copy atomically > while we're holding the global spinlock. > > Reported-by: Dan Carpenter <dan.carpenter@linaro.org> > Closes: https://lore.kernel.org/linux-gpio/62588146-eed6-42f7-ba26-160226b109fe@moroto.mountain/T/#u > Fixes: f8d05e276b45 ("gpiolib: remove gpiochip_is_requested()") > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> > --- > drivers/gpio/gpiolib.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c > index 4e190be75dc2..6efe44570333 100644 > --- a/drivers/gpio/gpiolib.c > +++ b/drivers/gpio/gpiolib.c > @@ -2399,7 +2399,15 @@ char *gpiochip_dup_line_label(struct gpio_chip *gc, unsigned int offset) > if (!test_bit(FLAG_REQUESTED, &desc->flags)) > return NULL; > > - label = kstrdup(desc->label, GFP_KERNEL); > + /* > + * FIXME: Once we mark gpiod_direction_input/output() and > + * gpiod_get_direction() with might_sleep(), we'll be able to protect > + * the GPIO descriptors with mutex (while value setting operations will > + * become lockless). > + * > + * Until this happens, this allocation needs to be atomic. > + */ > + label = kstrdup(desc->label, GFP_ATOMIC); > if (!label) > return ERR_PTR(-ENOMEM); > > -- > 2.40.1 > Patch applied. Bart
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 4e190be75dc2..6efe44570333 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -2399,7 +2399,15 @@ char *gpiochip_dup_line_label(struct gpio_chip *gc, unsigned int offset) if (!test_bit(FLAG_REQUESTED, &desc->flags)) return NULL; - label = kstrdup(desc->label, GFP_KERNEL); + /* + * FIXME: Once we mark gpiod_direction_input/output() and + * gpiod_get_direction() with might_sleep(), we'll be able to protect + * the GPIO descriptors with mutex (while value setting operations will + * become lockless). + * + * Until this happens, this allocation needs to be atomic. + */ + label = kstrdup(desc->label, GFP_ATOMIC); if (!label) return ERR_PTR(-ENOMEM);