mbox series

[v7,0/9] Introduce configfs-based interface for gpio-aggregator

Message ID 20250407043019.4105613-1-koichiro.den@canonical.com
Headers show
Series Introduce configfs-based interface for gpio-aggregator | expand

Message

Koichiro Den April 7, 2025, 4:30 a.m. UTC
This patch series introduces a configfs-based interface to gpio-aggregator
to address limitations in the existing 'new_device' interface.

The existing 'new_device' interface has several limitations:

  Issue#1. No way to determine when GPIO aggregator creation is complete.
  Issue#2. No way to retrieve errors when creating a GPIO aggregator.
  Issue#3. No way to trace a GPIO line of an aggregator back to its
           corresponding physical device.
  Issue#4. The 'new_device' echo does not indicate which virtual
           gpiochip<N> was created.
  Issue#5. No way to assign names to GPIO lines exported through an
           aggregator.

Although Issue#1 to #3 could technically be resolved easily without
configfs, using configfs offers a streamlined, modern, and extensible
approach, especially since gpio-sim and gpio-virtuser already utilize
configfs.

This v7 patch series includes 9 patches:

  Patch#1: Reorder functions to prepare for configfs introduction.
  Patch#2: Unify function naming.
  Patch#3: Add gpio_aggregator_alloc() to reduce code duplication.
  Patch#4: Introduce basic configfs interface. Address Issue#1 to #5.
  Patch#5: Prepare for Patch#6.
  Patch#6: Expose devices created with sysfs to configfs.
  Patch#7: Suppress deferred probe for purely configfs-based aggregators.
  Patch#8: Documentation for the new configfs interface.
  Patch#9: Selftest for gpio-aggregator.

N.B. This submission is based on commit 0af2f6be1b42 ("Linux 6.15-rc1").


v6->v7 changes:
  - Addressed feedback from Bartosz:
    * Unified function naming using gpio_aggregator_ prefix (except for GPIO
      forwarder implementations).
    * Replaced remaining raw mutex_lock/mutex_unlock with scoped_guard.
    * Ensured variables with __free() attribute are defined and assigned
      in a single statement.
  - Eliminated needless style inconsistencies across the new configfs attr
    .show() implementations by replacing scoped_guard with guard where
    possible, with no functional change.

v5->v6 changes:
  - Addressed feedback from Bartosz:
    * Resolved issues spotted with lockdep and kasan.
    * Added kselftest for gpio-aggregator.
  - Fixed a memory leak in aggr_free_line() (missing kfree(line->name)).
  - Fixed a bug I mistakenly added in aggr_parse() (misplaced scnprintf()).
  - Eliminated a potential lock inversion deadlock by removing
    gpio_aggregator_lock acquisition in gpio_aggregator_remove_all(), which
    became unnecessary after the upstream commit 12f65d120350 ("gpio:
    aggregator: protect driver attr handlers against module unload").

v4->v5 changes:
  - Rebased off of the latest gpio/for-next, that includes the patch series:
    "Add synchronous fake device creation utility for GPIO drivers"
    (https://lore.kernel.org/all/20250221133501.2203897-1-koichiro.den@canonical.com/)

v3->v4 changes:
  - Split off the introduction of gpio-pseudo.[ch] and conversions.
  - Reordered commits to place a fix commit first.
  - Squashed the trivial update for gpio-aggregator's conversion to gpio-pseudo
    into the primary commit "gpio: aggregator: introduce basic configfs interface"
    as it is only meaningful when combined.

v2->v3 changes:
  - Addressed feedback from Bartosz:
    * Factored out the common mechanism for synchronizing platform device
      probe by adding gpio-pseudo.[ch].
    * Renamed "_auto." prefix to "_sysfs." for auto-generated
      configfs entries corresponding to sysfs-created devices.
    * Squashed v2 Patch#3 into its predecessor.
  - Addressed feedback from Geert:
    * Factored out duplicate code in struct gpio_aggregator initialization
      by adding gpio_alloc()/gpio_free() functions. Note that v2 Patch#7
      was dropped for other reasons as mentioned below, so aggr_free() in
      v3 is unrelated to the same-named function in v2.
    * Removed redundant parsing of gpio-line-names and unnecessary
      chip->names assignments; squashed v2 Patch#4 + v2 Patch#5 into v3
      Patch#9.
    * Updated to use sysfs_emit().
    * Updated Kconfig (select CONFIGFS_FS).
    * Fixed typos, coding style issues, missing const qualifiers, and other
      minor issues.
  - Resolved an issue that was spotted during v3 preparation. See Patch#2.
  - Reordered resource initialization order in gpio_aggregator_init() to
    both eliminate a potential race condition (as noted in the source code
    comment) and simplify the code. See Patch#8. This enabled:
    * Removal of v2 Patch#7.
    * Merging of aggr_unregister_lines() and aggr_free_lines() into a
      unified function.
  - Disabled 'delete_device' functionality for devices created via configfs
    for simplicity. It was mistakenly allowed in v2 and proved buggy. See
    Patch #8.

RFC->v2 changes:
  - Addressed feedback from Bartosz:
    * Expose devices created with sysfs to configfs.
    * Drop 'num_lines' attribute.
    * Fix bugs and crashes.
    * Organize internal symbol prefixes more cleanly.
  - Split diffs for improved reviewability.
  - Update kernel doc to reflect the changes.

v6: https://lore.kernel.org/all/20250315164123.1855142-1-koichiro.den@canonical.com/
v5: https://lore.kernel.org/all/20250224143134.3024598-1-koichiro.den@canonical.com/
v4: https://lore.kernel.org/all/20250217143531.541185-1-koichiro.den@canonical.com/
v3: https://lore.kernel.org/all/20250216125816.14430-1-koichiro.den@canonical.com/
v2: https://lore.kernel.org/all/20250203031213.399914-1-koichiro.den@canonical.com/
RFC (v1): https://lore.kernel.org/linux-gpio/20250129155525.663780-1-koichiro.den@canonical.com/T/#u


Koichiro Den (9):
  gpio: aggregator: reorder functions to prepare for configfs
    introduction
  gpio: aggregator: unify function naming
  gpio: aggregator: add gpio_aggregator_{alloc,free}()
  gpio: aggregator: introduce basic configfs interface
  gpio: aggregator: rename 'name' to 'key' in gpio_aggregator_parse()
  gpio: aggregator: expose aggregator created via legacy sysfs to
    configfs
  gpio: aggregator: cancel deferred probe for devices created via
    configfs
  Documentation: gpio: document configfs interface for gpio-aggregator
  selftests: gpio: add test cases for gpio-aggregator

 .../admin-guide/gpio/gpio-aggregator.rst      |  107 ++
 drivers/gpio/Kconfig                          |    2 +
 drivers/gpio/gpio-aggregator.c                | 1181 ++++++++++++++---
 tools/testing/selftests/gpio/Makefile         |    2 +-
 tools/testing/selftests/gpio/config           |    1 +
 .../testing/selftests/gpio/gpio-aggregator.sh |  723 ++++++++++
 6 files changed, 1811 insertions(+), 205 deletions(-)
 create mode 100755 tools/testing/selftests/gpio/gpio-aggregator.sh

Comments

Bartosz Golaszewski April 9, 2025, 1:58 p.m. UTC | #1
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>


On Mon, 07 Apr 2025 13:30:10 +0900, Koichiro Den wrote:
> This patch series introduces a configfs-based interface to gpio-aggregator
> to address limitations in the existing 'new_device' interface.
> 
> The existing 'new_device' interface has several limitations:
> 
>   Issue#1. No way to determine when GPIO aggregator creation is complete.
>   Issue#2. No way to retrieve errors when creating a GPIO aggregator.
>   Issue#3. No way to trace a GPIO line of an aggregator back to its
>            corresponding physical device.
>   Issue#4. The 'new_device' echo does not indicate which virtual
>            gpiochip<N> was created.
>   Issue#5. No way to assign names to GPIO lines exported through an
>            aggregator.
> 
> [...]

Applied, thanks!

[1/9] gpio: aggregator: reorder functions to prepare for configfs introduction
      https://git.kernel.org/brgl/linux/c/7a56efeabffd13a162073068b8e29113c65f9e64
[2/9] gpio: aggregator: unify function naming
      https://git.kernel.org/brgl/linux/c/7616dd97ae22e5f69b24774455673d183d4191c9
[3/9] gpio: aggregator: add gpio_aggregator_{alloc,free}()
      https://git.kernel.org/brgl/linux/c/88fe1d1a646b3b01dcc335c44e7b33ea510f620e
[4/9] gpio: aggregator: introduce basic configfs interface
      https://git.kernel.org/brgl/linux/c/2b72a5399eae25ee2cfd447efa3012f1d9d7257d
[5/9] gpio: aggregator: rename 'name' to 'key' in gpio_aggregator_parse()
      https://git.kernel.org/brgl/linux/c/26ec717c3b160d00a91e647c8ecfa33eaf645b05
[6/9] gpio: aggregator: expose aggregator created via legacy sysfs to configfs
      https://git.kernel.org/brgl/linux/c/09708f2b1cee33d585606932fb0ff5bb4c49f48d
[7/9] gpio: aggregator: cancel deferred probe for devices created via configfs
      https://git.kernel.org/brgl/linux/c/62cf750f23a8905be5cf4471087068c1fe2e2d5b
[8/9] Documentation: gpio: document configfs interface for gpio-aggregator
      https://git.kernel.org/brgl/linux/c/017ae62c1d0bb4b3c29c8a15dc7c130e3c4783b8
[9/9] selftests: gpio: add test cases for gpio-aggregator
      https://git.kernel.org/brgl/linux/c/93ada5ce07889271aefb22147280cfd9cf3da5d8

Best regards,