diff options
| author | Fabian Godehardt <fg@emlix.com> | 2026-02-11 08:26:16 +0100 |
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2026-02-17 15:29:16 +0000 |
| commit | 40534d19ed2afb880ecf202dab26a8e7a5808d16 (patch) | |
| tree | 9e35ea5152d8dfaee9277abccc854eaa4c6377fe /rust/kernel/sync | |
| parent | 888a0a802c467bbe34a42167bdf9d7331333440a (diff) | |
spi: spidev: fix lock inversion between spi_lock and buf_lock
The spidev driver previously used two mutexes, spi_lock and buf_lock,
but acquired them in different orders depending on the code path:
write()/read(): buf_lock -> spi_lock
ioctl(): spi_lock -> buf_lock
This AB-BA locking pattern triggers lockdep warnings and can
cause real deadlocks:
WARNING: possible circular locking dependency detected
spidev_ioctl() -> mutex_lock(&spidev->buf_lock)
spidev_sync_write() -> mutex_lock(&spidev->spi_lock)
*** DEADLOCK ***
The issue is reproducible with a simple userspace program that
performs write() and SPI_IOC_WR_MAX_SPEED_HZ ioctl() calls from
separate threads on the same spidev file descriptor.
Fix this by simplifying the locking model and removing the lock
inversion entirely. spidev_sync() no longer performs any locking,
and all callers serialize access using spi_lock.
buf_lock is removed since its functionality is fully covered by
spi_lock, eliminating the possibility of lock ordering issues.
This removes the lock inversion and prevents deadlocks without
changing userspace ABI or behaviour.
Signed-off-by: Fabian Godehardt <fg@emlix.com>
Link: https://patch.msgid.link/20260211072616.489522-1-fg@emlix.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'rust/kernel/sync')
0 files changed, 0 insertions, 0 deletions
