There are two legacy, deprecated functions - gpiod_to_chip() and gpio_device_get_chip() - that still have users in tree. They return the address of the SRCU-protected chip outside of the read-only critical sections. They are inherently dangerous and the users should convert to safer alternatives. Let's explicitly silence lockdep warnings by using rcu_dereference_check(ptr, 1). While at it: reuse gpio_device_get_chip() in gpiod_to_chip().
Unified · Split
| @@ -221,7 +221,8 @@ struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc) · 220 unmodified lines | ||
| 221 | 221 | { |
| 222 | 222 | if (!desc) |
| 223 | 223 | return NULL; |
| 224 | − return rcu_dereference(desc->gdev->chip); | |
| 224 | + | |
| 225 | + return gpio_device_get_chip(desc->gdev); | |
| 225 | 226 | } |
| 226 | 227 | EXPORT_SYMBOL_GPL(gpiod_to_chip); |
| 227 | 228 | |
| @@ -291,7 +292,7 @@ EXPORT_SYMBOL(gpio_device_get_label); · 63 unmodified lines | ||
| 291 | 292 | */ |
| 292 | 293 | struct gpio_chip *gpio_device_get_chip(struct gpio_device *gdev) |
| 293 | 294 | { |
| 294 | − return rcu_dereference(gdev->chip); | |
| 295 | + return rcu_dereference_check(gdev->chip, 1); | |
| 295 | 296 | } |
| 296 | 297 | EXPORT_SYMBOL_GPL(gpio_device_get_chip); |
| 297 | 298 | |