twx-linux/drivers/gpio
Bartosz Golaszewski dcb73cbaae gpio: cdev: use raw notifier for line state events
We use a notifier to implement the mechanism of informing the user-space
about changes in GPIO line status. We register with the notifier when
the GPIO character device file is opened and unregister when the last
reference to the associated file descriptor is dropped.

Since commit fcc8b637c542 ("gpiolib: switch the line state notifier to
atomic") we use the atomic notifier variant. Atomic notifiers call
rcu_synchronize in atomic_notifier_chain_unregister() which caused a
significant performance regression in some circumstances, observed by
user-space when calling close() on the GPIO device file descriptor.

Replace the atomic notifier with the raw variant and provide
synchronization with a read-write spinlock.

Fixes: fcc8b637c542 ("gpiolib: switch the line state notifier to atomic")
Reported-by: David Jander <david@protonic.nl>
Closes: https://lore.kernel.org/all/20250311110034.53959031@erd003.prtnl/
Tested-by: David Jander <david@protonic.nl>
Tested-by: Kent Gibson <warthog618@gmail.com>
Link: https://lore.kernel.org/r/20250311-gpiolib-line-state-raw-notifier-v2-1-138374581e1e@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
2025-03-13 09:20:12 +01:00
..
gpio-74x164.c gpio: 74x164: shrink code 2024-10-21 09:23:20 +02:00
gpio-74xx-mmio.c gpio: 74xx-mmio: remove unneeded platform_set_drvdata() call 2023-07-29 16:03:17 +02:00
gpio-104-dio-48e.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
gpio-104-idi-48.c gpio: 104-idi-48: Enable use_raw_spinlock for idi48_regmap_config 2023-04-11 21:08:31 +02:00
gpio-104-idio-16.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
gpio-adnp.c gpio: Switch i2c drivers back to use .probe() 2023-05-23 10:09:11 +02:00
gpio-adp5520.c
gpio-adp5585.c gpio: adp5585: Add Analog Devices ADP5585 support 2024-08-01 14:09:28 +01:00
gpio-aggregator.c gpio: aggregator: protect driver attr handlers against module unload 2025-03-05 13:14:19 +01:00
gpio-altera-a10sr.c gpio: altera-a10sr: remove redundant of_match_ptr 2023-08-03 15:58:45 +02:00
gpio-altera.c gpio: altera: Drop .mapped_irq from driver data 2025-01-13 09:20:25 +01:00
gpio-amd8111.c gpio: amd8111: Convert PCIBIOS_* return codes to errnos 2024-05-30 11:20:53 +02:00
gpio-amd-fch.c
gpio-amdpt.c gpio: amdpt: remove remove() 2024-10-17 08:53:34 +02:00
gpio-arizona.c
gpio-aspeed-sgpio.c Fix a potential abuse of seq_printf() format string in drivers 2024-11-22 15:31:35 +01:00
gpio-aspeed.c Driver core changes for 6.13-rc1 2024-11-29 11:43:29 -08:00
gpio-ath79.c gpio: ath79: remove support for platform data 2024-09-02 09:45:18 +02:00
gpio-bcm-kona.c gpio: bcm-kona: Add missing newline to dev_err format string 2025-02-11 09:46:59 +01:00
gpio-bd9571mwv.c
gpio-bd71815.c
gpio-bd71828.c
gpio-brcmstb.c gpio: Switch back to struct platform_driver::remove() 2024-10-17 09:00:48 +02:00
gpio-bt8xx.c
gpio-cadence.c gpio: Switch back to struct platform_driver::remove() 2024-10-17 09:00:48 +02:00
gpio-cgbc.c gpio: Congatec Board Controller gpio driver 2024-10-09 16:32:04 +01:00
gpio-clps711x.c gpio: clps711x: remove redundant of_match_ptr() 2023-08-03 15:58:46 +02:00
gpio-creg-snps.c gpio: Explicitly include correct DT includes 2023-07-19 13:24:01 +02:00
gpio-cros-ec.c gpio: cros-ec: provide ID table for avoiding fallback match 2024-04-02 10:58:21 +02:00
gpio-crystalcove.c gpio: crystalcove: Use -ENOTSUPP consistently 2024-04-05 20:12:39 +03:00
gpio-cs5535.c
gpio-da9052.c
gpio-da9055.c
gpio-davinci.c gpio: davinci: use generic device properties 2024-10-14 10:28:40 +02:00
gpio-dln2.c gpio: Switch back to struct platform_driver::remove() 2024-10-17 09:00:48 +02:00
gpio-ds4520.c gpio: ds4520: Add ADI DS4520 GPIO Expander Support 2023-07-29 15:56:33 +02:00
gpio-dwapb.c gpio: dwapb: Add ACPI HID for DWAPB GPIO controller on Fujitsu MONAKA 2024-10-31 13:37:54 +01:00
gpio-eic-sprd.c gpio: eic-sprd: use generic device_get_match_data() 2024-10-14 10:28:56 +02:00
gpio-elkhartlake.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
gpio-em.c pinctrl: em: drop the wrapper around pinctrl_gpio_request() 2023-11-04 10:23:23 +01:00
gpio-en7523.c gpio: EN7523: fix kernel-doc warnings 2024-01-15 23:15:35 +01:00
gpio-ep93xx.c Fix a potential abuse of seq_printf() format string in drivers 2024-11-22 15:31:35 +01:00
gpio-exar.c gpio: exar: set value when external pull-up or pull-down is present 2024-11-21 09:08:47 +01:00
gpio-f7188x.c gpio-f7188x: fix base values conflicts with other gpio pins 2023-09-11 09:03:44 +02:00
gpio-ftgpio010.c gpio: ftgpio010: shrink code 2024-10-21 09:23:34 +02:00
gpio-fxl6408.c gpio: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-07-29 10:50:51 +02:00
gpio-ge.c gpio: ge: Replace GPLv2 boilerplate with SPDX 2023-07-27 09:33:07 +02:00
gpio-gpio-mm.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
gpio-graniterapids.c gpio: graniterapids: Fix GPIO Ack functionality 2024-12-10 10:35:13 +01:00
gpio-grgpio.c gpio: grgpio: Add NULL check in grgpio_probe 2024-11-18 11:45:06 +01:00
gpio-gw-pld.c gpio: add missing MODULE_DESCRIPTION() macros 2024-06-07 10:05:21 +02:00
gpio-hisi.c gpio: hisi: Fix format specifier 2023-10-13 08:39:30 +02:00
gpio-hlwd.c Fix a potential abuse of seq_printf() format string in drivers 2024-11-22 15:31:35 +01:00
gpio-htc-egpio.c
gpio-i8255.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
gpio-i8255.h gpio: i8255: Remove unused legacy interface 2023-01-30 15:55:28 +01:00
gpio-ich.c gpio: ich: Use devm_gpiochip_add_data() to simplify remove path 2023-03-09 16:08:39 +02:00
gpio-idio-16.c gpio: idio-16: Actually make use of the GPIO_IDIO_16 symbol namespace 2024-12-10 11:38:57 +01:00
gpio-idio-16.h gpio: idio-16: Remove unused legacy interface 2023-08-11 14:23:32 +02:00
gpio-idt3243x.c gpio: idt3243x: Convert to immutable irq_chip 2023-03-10 16:17:30 +01:00
gpio-imx-scu.c gpio: imx-scu: Use ARRAY_SIZE for array length 2023-08-11 16:20:02 +02:00
gpio-it87.c
gpio-ixp4xx.c gpio: ixp4xx: Replace of_node_to_fwnode() with more suitable API 2024-09-02 12:27:36 +02:00
gpio-janz-ttl.c
gpio-kempld.c
gpio-latch.c gpio: Add gpio latch driver 2022-10-26 14:52:01 +02:00
gpio-ljca.c Linux 6.13-rc2 2024-12-10 11:38:38 +01:00
gpio-logicvc.c gpio: logicvc: remove unneeded platform_set_drvdata() call 2023-07-29 16:05:50 +02:00
gpio-loongson1.c gpio: loongson1: Add DT support 2023-03-23 14:31:18 +01:00
gpio-loongson-64bit.c gpio: loongson: Fix Loongson-2K2000 ACPI GPIO register offset 2025-01-08 09:54:20 +01:00
gpio-loongson.c
gpio-lp873x.c
gpio-lp3943.c gpio: lp3943: remove unneeded platform_set_drvdata() call 2023-08-01 21:14:48 +02:00
gpio-lp87565.c
gpio-lpc18xx.c gpio: Switch back to struct platform_driver::remove() 2024-10-17 09:00:48 +02:00
gpio-lpc32xx.c gpio: lpc32xx: fix module autoloading 2024-04-12 21:30:58 +02:00
gpio-madera.c
gpio-max730x.c gpio: max730x: use devres to shrink and simplify code 2024-10-21 09:23:47 +02:00
gpio-max732x.c gpio: max732x: remove redundant CONFIG_OF and of_match_ptr() 2023-08-03 15:56:30 +02:00
gpio-max3191x.c gpio: max3191x: remove redundant of_match_ptr() 2023-08-03 15:58:50 +02:00
gpio-max7300.c gpio: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-07-29 10:50:51 +02:00
gpio-max7301.c
gpio-max77620.c gpio: max77620: remove unneeded platform_set_drvdata() call 2023-08-01 21:15:23 +02:00
gpio-max77650.c
gpio-mb86s7x.c gpio: mb86s7x: remove some dead code in mb86s70_gpio_to_irq() 2024-10-24 10:37:51 +02:00
gpio-mc33880.c gpio updates for v6.11-rc1 2024-07-15 17:53:24 -07:00
gpio-menz127.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
gpio-merrifield.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
gpio-ml-ioh.c
gpio-mlxbf2.c Fix a potential abuse of seq_printf() format string in drivers 2024-11-22 15:31:35 +01:00
gpio-mlxbf3.c gpio: mlxbf3: Support shutdown() function 2024-08-10 21:35:16 +02:00
gpio-mlxbf.c
gpio-mm-lantiq.c gpio: Switch back to struct platform_driver::remove() 2024-10-17 09:00:48 +02:00
gpio-mmio.c gpio: mmio: do not calculate bgpio_bits via "ngpios" 2024-07-03 15:27:59 +02:00
gpio-mockup.c [tree-wide] finally take no_llseek out 2024-09-27 08:18:43 -07:00
gpio-moxtet.c
gpio-mpc8xxx.c gpio: mpc8xxx: Add MPC8314 support 2025-01-13 09:20:25 +01:00
gpio-mpc5200.c gpio: Switch back to struct platform_driver::remove() 2024-10-17 09:00:48 +02:00
gpio-mpfs.c gpio: mpfs: add CoreGPIO support 2024-11-13 16:29:27 +01:00
gpio-mpsse.c gpio: mpsse: Remove usage of the deprecated ida_simple_xx() API 2024-11-22 15:23:31 +01:00
gpio-msc313.c gpio: msc313: Replace of_node_to_fwnode() with more suitable API 2024-09-02 12:27:36 +02:00
gpio-mt7621.c
gpio-mvebu.c gpio: mvebu: use generic device properties 2024-10-08 10:08:51 +02:00
gpio-mxc.c gpio: mxc: remove dead code after switch to DT-only 2025-01-23 08:44:51 +01:00
gpio-mxs.c gpio: mxs: fix Wvoid-pointer-to-enum-cast warning 2023-08-11 16:21:46 +02:00
gpio-nomadik.c drivers/gpio/nomadik: move dummy nmk_gpio_dbg_show_one() to header 2024-03-12 12:53:35 +01:00
gpio-npcm-sgpio.c gpio: nuvoton: Fix sgpio irq handle error 2024-05-07 09:44:33 +02:00
gpio-octeon.c
gpio-omap.c Driver core changes for 6.13-rc1 2024-11-29 11:43:29 -08:00
gpio-palmas.c gpio: palmas: remove unnecessary call to platform_set_drvdata() 2023-08-01 21:22:38 +02:00
gpio-pca953x.c gpio: pca953x: Improve interrupt support 2025-02-04 21:21:03 +01:00
gpio-pca9570.c gpio: pca9570: fix kerneldoc 2023-08-21 10:39:58 +02:00
gpio-pcf857x.c gpio: add missing MODULE_DESCRIPTION() macros 2024-06-07 10:05:21 +02:00
gpio-pch.c gpio: pch: kerneldoc fixes for excess members 2024-09-02 14:35:32 +02:00
gpio-pci-idio-16.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
gpio-pcie-idio-24.c gpio: pcie-idio-24: Replace deprecated PCI functions 2024-11-04 09:15:38 +01:00
gpio-pisosr.c gpio: pisosr: Use devm_gpiochip_add_data() to simplify remove path 2023-07-20 17:22:10 +02:00
gpio-pl061.c Fix a potential abuse of seq_printf() format string in drivers 2024-11-22 15:31:35 +01:00
gpio-pmic-eic-sprd.c gpio: pmic-eic-sprd: Configure the bit corresponding to the EIC through offset 2024-01-03 09:50:47 +01:00
gpio-pxa.c treewide: rename pinctrl_gpio_direction_output_new() 2023-11-04 10:23:22 +01:00
gpio-raspberrypi-exp.c gpio: raspberrypi-exp: remove redundant of_match_ptr() 2023-08-03 15:58:52 +02:00
gpio-rc5t583.c gpio: rc5t583: remove unneeded call to platform_set_drvdata() 2023-08-01 21:26:48 +02:00
gpio-rcar.c gpio: rcar: Fix missing of_node_put() call 2025-03-06 15:51:27 +01:00
gpio-rda.c gpio: rda: Convert to immutable irq_chip 2023-03-23 14:31:18 +01:00
gpio-rdc321x.c gpio: rdc321x: Convert PCIBIOS_* return codes to errnos 2024-05-30 11:21:05 +02:00
gpio-realtek-otto.c
gpio-reg.c gpio: reg: Add missing header(s) 2023-03-06 12:33:02 +02:00
gpio-regmap.c gpio: regmap: Use generic request/free ops 2025-01-13 09:20:25 +01:00
gpio-rockchip.c gpio: rockchip: support new version GPIO 2024-11-12 13:51:25 +01:00
gpio-rtd.c gpio: rtd: Fix signedness bug in probe 2024-01-15 11:07:46 +01:00
gpio-sa1100.c gpio: sa1100: include <mach/generic.h> 2023-05-17 11:56:24 +02:00
gpio-sama5d2-piobu.c gpio: sama5d2-piobu: convert comma to semicolon 2024-09-05 09:34:51 +02:00
gpio-sch311x.c gpio: sch311x: Use devm_gpiochip_add_data() to simplify remove path 2023-05-17 11:52:14 +02:00
gpio-sch.c gpio: sch: Utilise temporary variable for struct device 2024-04-15 16:12:18 +03:00
gpio-sifive.c gpio: sifive: remove unneeded call to platform_set_drvdata() 2023-11-15 15:39:40 +01:00
gpio-sim.c gpio: sim: lock hog configfs items if present 2025-02-05 14:37:01 +01:00
gpio-siox.c gpio: siox: Convert to immutable irq_chip 2023-03-23 14:31:18 +01:00
gpio-sl28cpld.c gpio: sl28cpld: Replace irqchip mask_invert with unmask_base 2022-11-15 15:41:45 +01:00
gpio-sloppy-logic-analyzer.c Linux 6.12-rc6 2024-11-04 08:46:55 +01:00
gpio-sodaville.c
gpio-spear-spics.c
gpio-sprd.c gpio: Explicitly include correct DT includes 2023-07-19 13:24:01 +02:00
gpio-stmpe.c gpio: stmpe: Check return value of stmpe_reg_read in stmpe_gpio_irq_sync_unlock 2025-02-12 10:52:56 +01:00
gpio-stp-xway.c gpio: stp-xway: Simplify using devm_clk_get_enabled() 2024-09-02 12:31:48 +02:00
gpio-syscon.c gpio: syscon: fix excess struct member build warning 2024-09-02 12:35:59 +02:00
gpio-tangier.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
gpio-tangier.h gpio: tangier: unexport suspend/resume handles 2023-11-13 17:59:48 +02:00
gpio-tb10x.c gpio: Switch back to struct platform_driver::remove() 2024-10-17 09:00:48 +02:00
gpio-tc3589x.c
gpio-tegra186.c Fix a potential abuse of seq_printf() format string in drivers 2024-11-22 15:31:35 +01:00
gpio-tegra.c Fix a potential abuse of seq_printf() format string in drivers 2024-11-22 15:31:35 +01:00
gpio-thunderx.c gpio: thunderx: Replace of_node_to_fwnode() with more suitable API 2024-09-02 12:27:36 +02:00
gpio-timberdale.c gpio: timberdale: Fix potential deadlock on &tgpio->lock 2023-09-27 08:51:28 +02:00
gpio-tn48m.c
gpio-tpic2810.c gpio: Switch i2c drivers back to use .probe() 2023-05-23 10:09:11 +02:00
gpio-tps6586x.c gpio: Explicitly include correct DT includes 2023-07-19 13:24:01 +02:00
gpio-tps65086.c gpio: tps65086: Use devm_gpiochip_add_data() to simplify remove path 2023-05-17 11:40:40 +02:00
gpio-tps65218.c gpio: tps65218: remove redundant of_match_ptr() 2023-08-03 15:55:34 +02:00
gpio-tps65219.c gpio: tps65219: Use existing kernel gpio macros 2024-12-20 14:44:24 +01:00
gpio-tps65910.c gpio: Explicitly include correct DT includes 2023-07-19 13:24:01 +02:00
gpio-tps65912.c
gpio-tps68470.c gpio: tps68470: Make tps68470_gpio_output() always set the initial value 2023-07-19 13:22:13 +02:00
gpio-tqmx86.c gpio: tqmx86: add support for changing GPIO directions 2024-12-16 10:00:46 +01:00
gpio-ts4800.c gpio: Explicitly include correct DT includes 2023-07-19 13:24:01 +02:00
gpio-ts4900.c gpio: ts4900: use generic device properties 2024-10-14 10:28:21 +02:00
gpio-ts5500.c gpio: Switch back to struct platform_driver::remove() 2024-10-17 09:00:48 +02:00
gpio-twl4030.c This removes all usage of global GPIO numbers from 2023-05-31 17:01:34 +02:00
gpio-twl6040.c gpio: twl4030: use gpiochip_get_data 2024-12-05 13:14:44 +01:00
gpio-uniphier.c gpio: Switch back to struct platform_driver::remove() 2024-10-17 09:00:48 +02:00
gpio-vf610.c gpio: vf610: add locking to gpio direction functions 2025-02-17 11:57:54 +01:00
gpio-viperboard.c
gpio-virtio.c virtio: rename virtio_find_vqs_info() to virtio_find_vqs() 2024-07-17 05:20:58 -04:00
gpio-virtuser.c gpio: virtuser: lock up configfs that an instantiated device depends on 2025-01-03 17:15:04 +01:00
gpio-visconti.c Fix a potential abuse of seq_printf() format string in drivers 2024-11-22 15:31:35 +01:00
gpio-vx855.c gpio: vx855: remove unneeded call to platform_set_drvdata() 2023-08-03 15:48:15 +02:00
gpio-wcd934x.c gpio: Explicitly include correct DT includes 2023-07-19 13:24:01 +02:00
gpio-wcove.c gpio: wcove: Use -ENOTSUPP consistently 2024-04-05 20:12:03 +03:00
gpio-winbond.c
gpio-wm831x.c gpio: wm831x: use gpiochip_dup_line_label() 2023-12-08 09:26:20 +01:00
gpio-wm8350.c gpio: wm8350: Remove unused header(s) 2022-10-24 12:29:41 +03:00
gpio-wm8994.c gpio: wm8994: use gpiochip_dup_line_label() 2023-12-08 09:26:25 +01:00
gpio-ws16c48.c gpio updates for v6.6 2023-08-29 10:21:56 -07:00
gpio-xgene-sb.c gpio: xgene-sb: don't use "proxy" headers 2024-10-22 09:21:12 +02:00
gpio-xgene.c
gpio-xgs-iproc.c Driver core changes for 6.13-rc1 2024-11-29 11:43:29 -08:00
gpio-xilinx.c gpio: xilinx: Convert gpio_lock to raw spinlock 2025-01-14 14:04:38 +01:00
gpio-xlp.c gpio: xlp: Convert to immutable irq_chip 2023-03-23 14:31:19 +01:00
gpio-xra1403.c gpio: xra1403: remove redundant of_match_ptr() 2023-08-03 15:58:54 +02:00
gpio-xtensa.c
gpio-zevio.c gpio: zevio: Add missed label initialisation 2024-11-21 09:06:17 +01:00
gpio-zynq.c gpio: Switch back to struct platform_driver::remove() 2024-10-17 09:00:48 +02:00
gpio-zynqmp-modepin.c gpio: modepin: Enable module autoloading 2024-09-02 15:00:53 +02:00
gpiolib-acpi.c gpiolib: acpi: Add a quirk for Acer Nitro ANV14 2025-02-12 10:06:47 +01:00
gpiolib-acpi.h gpio: acpi: Make acpi_gpio_count() take firmware node as a parameter 2024-03-01 09:08:34 +01:00
gpiolib-cdev.c gpio: cdev: use raw notifier for line state events 2025-03-13 09:20:12 +01:00
gpiolib-cdev.h
gpiolib-devres.c gpiolib: legacy: Consolidate devm_gpio_*() with other legacy APIs 2024-09-02 12:27:36 +02:00
gpiolib-legacy.c gpio: Get rid of GPIOF_ACTIVE_LOW 2024-11-09 14:55:33 +01:00
gpiolib-of.c gpio: Use of_property_present() for non-boolean properties 2024-11-06 14:41:06 +01:00
gpiolib-of.h gpio: of: Make of_gpio_get_count() take firmware node as a parameter 2024-03-01 09:07:21 +01:00
gpiolib-swnode.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
gpiolib-swnode.h gpiolib: add support for software nodes 2022-11-15 11:21:43 +01:00
gpiolib-sysfs.c gpio: sysfs: emit chardev line-state events on edge store 2024-11-04 08:56:20 +01:00
gpiolib-sysfs.h gpiolib: revert the attempt to protect the GPIO device list with an rwsem 2024-01-17 09:52:37 +01:00
gpiolib.c gpio: cdev: use raw notifier for line state events 2025-03-13 09:20:12 +01:00
gpiolib.h gpio: cdev: use raw notifier for line state events 2025-03-13 09:20:12 +01:00
Kconfig gpio: GPIO_GRGPIO should depend on OF 2025-02-05 14:37:53 +01:00
Makefile gpio: mpfs: add polarfire soc gpio support 2024-11-06 14:40:08 +01:00
TODO Fix typos in GPIO TODO document 2024-09-30 10:16:26 +02:00