Linux GPIO subsystem development
 help / color / mirror / Atom feed
* regression: gpiolib: switch the line state notifier to atomic unexpected impact on performance
@ 2025-03-11 10:00 David Jander
  2025-03-11 10:21 ` Bartosz Golaszewski
  2025-03-11 11:45 ` Bartosz Golaszewski
  0 siblings, 2 replies; 12+ messages in thread
From: David Jander @ 2025-03-11 10:00 UTC (permalink / raw)
  To: Bartosz Golaszewski; +Cc: Kent Gibson, Linus Walleij, linux-gpio, linux-kernel


Dear Bartosz,

I noticed this because after updating the kernel from 6.11 to 6.14 a
user-space application that uses GPIOs heavily started getting extremely slow,
to the point that I will need to heavily modify this application in order to
be usable again.
I traced the problem down to the following patch that went into 6.13:

fcc8b637c542 gpiolib: switch the line state notifier to atomic

What happens here, is that gpio_chrdev_release() now calls
atomic_notifier_chain_unregister(), which uses RCU, and as such must call
synchronize_rcu(). synchronize_rcu() waits for the RCU grace time to expire
before returning and according to the documentation can cause a delay of up to
several milliseconds. In fact it seems to take between 8-10ms on my system (an
STM32MP153C single-core Cortex-A7).

This has the effect that the time it takes to call close() on a /dev/gpiochipX
takes now ~10ms each time. If I git-revert this commit, close() will take less
than 1ms.

10ms doesn't sound like much, but it is more ~10x the time it tool before,
and unfortunately libgpiod code calls this function very often in some places,
especially in find_line() if your board has many gpiochips (mine has 16
chardevs).

The effect can easily be reproduced with the gpiofind tool:

Running on kernel 6.12:

$ time gpiofind LPOUT0
gpiochip7 9
real    0m 0.02s
user    0m 0.00s
sys     0m 0.01s

Running on kernel 6.13:

$ time gpiofind LPOUT0
gpiochip7 9
real    0m 0.19s
user    0m 0.00s
sys     0m 0.01s

That is almost a 10x increase in execution time of the whole program!!

On kernel 6.13, after git revert -n fcc8b637c542 time is back to what it was
on 6.12.

Unfortunately I can't come up with an easy solution to this problem, that's
why I don't have a patch to propose. Sorry for that.

I still think it is a bit alarming this change has such a huge impact. IMHO it
really shouldn't. What can be done about this? Is it maybe possible to defer
unregistering and freeing to a kthread and return from the release function
earlier?

Best regards,

-- 
David Jander

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2025-03-12 12:10 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-11 10:00 regression: gpiolib: switch the line state notifier to atomic unexpected impact on performance David Jander
2025-03-11 10:21 ` Bartosz Golaszewski
2025-03-11 11:03   ` David Jander
2025-03-12  1:32     ` Kent Gibson
2025-03-12  8:08       ` David Jander
2025-03-12  9:10         ` Kent Gibson
2025-03-12 10:24           ` David Jander
2025-03-12 12:10             ` Kent Gibson
2025-03-11 11:45 ` Bartosz Golaszewski
2025-03-11 12:30   ` David Jander
2025-03-11 13:21     ` Bartosz Golaszewski
2025-03-11 14:09       ` David Jander

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox