gpio: protect the list of GPIO devices with SRCU
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 19 Jan 2024 15:43:13 +0000 (16:43 +0100)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 12 Feb 2024 09:50:20 +0000 (10:50 +0100)
commite348544f7994d252427ed3ae637c7081cbb90f66
treea931f5f0033853572d528a8647244e94057a073e
parentfaf6efd2e5e23d3319501132d9671c8606ef21bd
gpio: protect the list of GPIO devices with SRCU

We're working towards removing the "multi-function" GPIO spinlock that's
implemented terribly wrong. We tried using an RW-semaphore to protect
the list of GPIO devices but it turned out that we still have old code
using legacy GPIO calls that need to translate the global GPIO number to
the address of the associated descriptor and - to that end - traverse
the list while holding the lock. If we change the spinlock to a sleeping
lock then we'll end up with "scheduling while atomic" bugs.

Let's allow lockless traversal of the list using SRCU and only use the
mutex when modyfing the list.

While at it: let's protect the period between when we start the lookup
and when we finally request the descriptor (increasing the reference
count of the GPIO device) with the SRCU read lock.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
drivers/gpio/gpiolib.c