]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
spi: spidev: fix lock inversion between spi_lock and buf_lock
authorFabian Godehardt <fg@emlix.com>
Wed, 11 Feb 2026 07:26:16 +0000 (08:26 +0100)
committerMark Brown <broonie@kernel.org>
Tue, 17 Feb 2026 15:29:16 +0000 (15:29 +0000)
commit40534d19ed2afb880ecf202dab26a8e7a5808d16
tree9e35ea5152d8dfaee9277abccc854eaa4c6377fe
parent888a0a802c467bbe34a42167bdf9d7331333440a
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>
drivers/spi/spidev.c