gpio: regression fixes
Subsystems (2)
v2 cover gpio: regression fixes
Here's a fix for a regression in 5.12 due to the new stub-driver hack, and a fix for potential list corruption due to missing locking which has been there since the introduction of the character-device interface in 4.6.
Johan
Changes in v2
- drop the corresponding drv_set_drvdata() which is no longer needed after patch 1/2
- add Saravanas's reviewed-by tag to patch 2/2
Johan Hovold (2):
gpio: fix NULL-deref-on-deregistration regression
gpio: fix gpio-device list corruption
drivers/gpio/gpiolib.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
Signature · 1 line
2.26.2
PATCH v2 1/2 gpio: fix NULL-deref-on-deregistration regression
Fix a NULL-pointer deference when deregistering the gpio character device that was introduced by the recent stub-driver hack. When the new "driver" is unbound as part of deregistration, driver core clears the driver-data pointer which is used to retrieve the struct gpio_device in its release callback.
Fix this by using container_of() in the release callback as should have been done all along.
--- drivers/gpio/gpiolib.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/gpio/gpiolib.c +1 -2
@@ -474,7 +474,7 @@ EXPORT_SYMBOL_GPL(gpiochip_line_is_valid);static void gpiodevice_release (struct device *dev) { -struct gpio_device *gdev =dev_get_drvdata (dev); + struct gpio_device *gdev = container_of(dev, struct gpio_device, dev);list_del (&gdev->list);ida_free (&gpio_ida, gdev->id);
@@ -605,7 +605,6 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, goto err_free_ida;device_initialize (&gdev->dev); -dev_set_drvdata (&gdev->dev, gdev);if (gc->parent && gc->parent->driver) gdev->owner = gc->parent->driver->owner;else if (gc->owner)
Signature · 1 line
2.26.2
Re: [PATCH v2 1/2] gpio: fix NULL-deref-on-deregistration regression
Quoted 6 lines · Johan Hovold
Fix a NULL-pointer deference when deregistering the gpio character device that was introduced by the recent stub-driver hack. When the new "driver" is unbound as part of deregistration, driver core clears the driver-data pointer which is used to retrieve the struct
gpio_devicein its release callback.
Quoted 8 lines
Fix this by using
container_of()in the release callback as should have been done all along.Fixes 4731210c09f5 ("gpiolib: Bind gpio_device to a driver to enable fw_devlink=on by default")Cc Saravana Kannan <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Reported-by [email protected]Signed-off-by Johan Hovold <[email protected]>
Oh nice catch!
Yours,
Linus Walleij
PATCH v2 2/2 gpio: fix gpio-device list corruption
In reply to Johan HovoldMake sure to hold the gpio_lock when removing the gpio device from the gpio_devices list (when dropping the last reference) to avoid corrupting the list when there are concurrent accesses.
--- drivers/gpio/gpiolib.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpio/gpiolib.c +4 -0
@@ -475,8 +475,12 @@ EXPORT_SYMBOL_GPL(gpiochip_line_is_valid);static void gpiodevice_release (struct device *dev) { struct gpio_device *gdev = container_of(dev, struct gpio_device, dev); +unsigned long flags; +spin_lock_irqsave (&gpio_lock, flags);list_del (&gdev->list); +spin_unlock_irqrestore (&gpio_lock, flags); +ida_free (&gpio_ida, gdev->id);kfree_const (gdev->label);kfree (gdev->descs);
Signature · 1 line
2.26.2
Re: [PATCH v2 2/2] gpio: fix gpio-device list corruption
Quoted 8 lines · Johan Hovold
Make sure to hold the
gpio_lockwhen removing the gpio device from thegpio_deviceslist (when dropping the last reference) to avoid corrupting the list when there are concurrent accesses.Fixes ff2b13592299 ("gpio: make the gpiochip a real device")Cc [email protected] # 4.6Reviewed-by Saravana Kannan <[email protected]>Signed-off-by Johan Hovold <[email protected]>
Excellent fix as well,
Yours,
Linus Walleij
Quoted 18 lines · Johan Hovold
Here's a fix for a regression in 5.12 due to the new stub-driver hack, and a fix for potential list corruption due to missing locking which has been there since the introduction of the character-device interface in 4.6.
Johan
Changes in v2
- drop the correspondingdrv_set_drvdata()which is no longer needed after patch 1/2
- add Saravanas's reviewed-by tag to patch 2/2Johan Hovold (2):
gpio: fix NULL-deref-on-deregistration regression
gpio: fix gpio-device list corruption
Quoted 6 lines
drivers/gpio/gpiolib.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)--
2.26.2
Patches applied, thanks!
Bartosz
Andy Shevchenko
Tested-byQuoted 15 lines · Bartosz Golaszewski
Quoted 14 lines · Johan Hovold
Here's a fix for a regression in 5.12 due to the new stub-driver hack, and a fix for potential list corruption due to missing locking which has been there since the introduction of the character-device interface in 4.6.
Johan
Changes in v2
- drop the correspondingdrv_set_drvdata()which is no longer needed after patch 1/2
- add Saravanas's reviewed-by tag to patch 2/2
Quoted 8 lines
Quoted 6 lines
Johan Hovold (2):
gpio: fix NULL-deref-on-deregistration regression
gpio: fix gpio-device list corruptiondrivers/gpio/gpiolib.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)Patches applied, thanks!
Ooops, you are fast!
Anyway, I have tested with gpio-aggregator (w/o this series it sparkles with all possible bugs).
Signature · 2 lines
With Best Regards, Andy Shevchenko
Quoted 22 lines · Andy Shevchenko
Quoted 19 lines · Bartosz Golaszewski
Quoted 18 lines · Johan Hovold
Here's a fix for a regression in 5.12 due to the new stub-driver hack, and a fix for potential list corruption due to missing locking which has been there since the introduction of the character-device interface in 4.6.
Johan
Changes in v2
- drop the correspondingdrv_set_drvdata()which is no longer needed after patch 1/2
- add Saravanas's reviewed-by tag to patch 2/2Johan Hovold (2):
gpio: fix NULL-deref-on-deregistration regression
gpio: fix gpio-device list corruption
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
drivers/gpio/gpiolib.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)Patches applied, thanks!
Ooops, you are fast!
The regression broke my gpip-sim I'm working on right now so I tested it too.
Bartosz
Quoted 20 lines · Bartosz Golaszewski
Quoted 18 lines · Johan Hovold
Here's a fix for a regression in 5.12 due to the new stub-driver hack, and a fix for potential list corruption due to missing locking which has been there since the introduction of the character-device interface in 4.6.
Johan
Changes in v2
- drop the correspondingdrv_set_drvdata()which is no longer needed after patch 1/2
- add Saravanas's reviewed-by tag to patch 2/2Johan Hovold (2):
gpio: fix NULL-deref-on-deregistration regression
gpio: fix gpio-device list corruption
Quoted 8 lines
Quoted 6 lines
drivers/gpio/gpiolib.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)--
2.26.2Patches applied, thanks!
Thanks Johan and Bartosz!
-Saravana