All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] spi: fix resource leaks on device setup failure
@ 2026-04-10 15:49 Johan Hovold
  2026-04-10 15:49 ` [PATCH 1/2] " Johan Hovold
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Johan Hovold @ 2026-04-10 15:49 UTC (permalink / raw)
  To: Mark Brown; +Cc: Saravana Kannan, linux-spi, linux-kernel, Johan Hovold

Make sure to call controller cleanup() if spi_setup() fails while
registering a device to avoid leaking any resources allocated by
setup().

Johan


Changes in v2:
 - only call cleanup() if spi_setup() fails during registration
 - use spi_cleanup() helper
 - fix controller cleanup() documentation (new patch)


Johan Hovold (2):
  spi: fix resource leaks on device setup failure
  spi: fix controller cleanup() documentation

 drivers/spi/spi.c       | 61 +++++++++++++++++++++++++----------------
 include/linux/spi/spi.h |  2 +-
 2 files changed, 38 insertions(+), 25 deletions(-)

-- 
2.52.0


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

* [PATCH 1/2] spi: fix resource leaks on device setup failure
  2026-04-10 15:49 [PATCH 0/2] spi: fix resource leaks on device setup failure Johan Hovold
@ 2026-04-10 15:49 ` Johan Hovold
  2026-04-10 15:49 ` [PATCH 2/2] spi: fix controller cleanup() documentation Johan Hovold
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Johan Hovold @ 2026-04-10 15:49 UTC (permalink / raw)
  To: Mark Brown; +Cc: Saravana Kannan, linux-spi, linux-kernel, Johan Hovold, stable

Make sure to call controller cleanup() if spi_setup() fails while
registering a device to avoid leaking any resources allocated by
setup().

Fixes: c7299fea6769 ("spi: Fix spi device unregister flow")
Cc: stable@vger.kernel.org	# 5.13
Cc: Saravana Kannan <saravanak@kernel.org>
Signed-off-by: Johan Hovold <johan@kernel.org>
---
 drivers/spi/spi.c | 61 ++++++++++++++++++++++++++++-------------------
 1 file changed, 37 insertions(+), 24 deletions(-)

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 272b45d6b5aa..c14f29457c29 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -43,6 +43,8 @@ EXPORT_TRACEPOINT_SYMBOL(spi_transfer_stop);
 
 #include "internals.h"
 
+static int __spi_setup(struct spi_device *spi, bool initial_setup);
+
 static DEFINE_IDR(spi_controller_idr);
 
 static void spidev_release(struct device *dev)
@@ -726,7 +728,7 @@ static int __spi_add_device(struct spi_device *spi)
 	 * normally rely on the device being setup.  Devices
 	 * using SPI_CS_HIGH can't coexist well otherwise...
 	 */
-	status = spi_setup(spi);
+	status = __spi_setup(spi, true);
 	if (status < 0) {
 		dev_err(dev, "can't setup %s, status %d\n",
 				dev_name(&spi->dev), status);
@@ -3992,27 +3994,7 @@ static int spi_set_cs_timing(struct spi_device *spi)
 	return status;
 }
 
-/**
- * spi_setup - setup SPI mode and clock rate
- * @spi: the device whose settings are being modified
- * Context: can sleep, and no requests are queued to the device
- *
- * SPI protocol drivers may need to update the transfer mode if the
- * device doesn't work with its default.  They may likewise need
- * to update clock rates or word sizes from initial values.  This function
- * changes those settings, and must be called from a context that can sleep.
- * Except for SPI_CS_HIGH, which takes effect immediately, the changes take
- * effect the next time the device is selected and data is transferred to
- * or from it.  When this function returns, the SPI device is deselected.
- *
- * Note that this call will fail if the protocol driver specifies an option
- * that the underlying controller or its driver does not support.  For
- * example, not all hardware supports wire transfers using nine bit words,
- * LSB-first wire encoding, or active-high chipselects.
- *
- * Return: zero on success, else a negative error code.
- */
-int spi_setup(struct spi_device *spi)
+static int __spi_setup(struct spi_device *spi, bool initial_setup)
 {
 	unsigned	bad_bits, ugly_bits;
 	int		status;
@@ -4097,7 +4079,7 @@ int spi_setup(struct spi_device *spi)
 	status = spi_set_cs_timing(spi);
 	if (status) {
 		mutex_unlock(&spi->controller->io_mutex);
-		return status;
+		goto err_cleanup;
 	}
 
 	if (spi->controller->auto_runtime_pm && spi->controller->set_cs) {
@@ -4106,7 +4088,7 @@ int spi_setup(struct spi_device *spi)
 			mutex_unlock(&spi->controller->io_mutex);
 			dev_err(&spi->controller->dev, "Failed to power device: %d\n",
 				status);
-			return status;
+			goto err_cleanup;
 		}
 
 		/*
@@ -4142,6 +4124,37 @@ int spi_setup(struct spi_device *spi)
 			status);
 
 	return status;
+
+err_cleanup:
+	if (initial_setup)
+		spi_cleanup(spi);
+
+	return status;
+}
+
+/**
+ * spi_setup - setup SPI mode and clock rate
+ * @spi: the device whose settings are being modified
+ * Context: can sleep, and no requests are queued to the device
+ *
+ * SPI protocol drivers may need to update the transfer mode if the
+ * device doesn't work with its default.  They may likewise need
+ * to update clock rates or word sizes from initial values.  This function
+ * changes those settings, and must be called from a context that can sleep.
+ * Except for SPI_CS_HIGH, which takes effect immediately, the changes take
+ * effect the next time the device is selected and data is transferred to
+ * or from it.  When this function returns, the SPI device is deselected.
+ *
+ * Note that this call will fail if the protocol driver specifies an option
+ * that the underlying controller or its driver does not support.  For
+ * example, not all hardware supports wire transfers using nine bit words,
+ * LSB-first wire encoding, or active-high chipselects.
+ *
+ * Return: zero on success, else a negative error code.
+ */
+int spi_setup(struct spi_device *spi)
+{
+	return __spi_setup(spi, false);
 }
 EXPORT_SYMBOL_GPL(spi_setup);
 
-- 
2.52.0


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

* [PATCH 2/2] spi: fix controller cleanup() documentation
  2026-04-10 15:49 [PATCH 0/2] spi: fix resource leaks on device setup failure Johan Hovold
  2026-04-10 15:49 ` [PATCH 1/2] " Johan Hovold
@ 2026-04-10 15:49 ` Johan Hovold
  2026-04-10 15:51 ` [PATCH 0/2] spi: fix resource leaks on device setup failure Johan Hovold
  2026-04-22 14:10 ` Mark Brown
  3 siblings, 0 replies; 5+ messages in thread
From: Johan Hovold @ 2026-04-10 15:49 UTC (permalink / raw)
  To: Mark Brown; +Cc: Saravana Kannan, linux-spi, linux-kernel, Johan Hovold

The controller cleanup() callback is no longer called when releasing a
device, but rather when deregistering it (and on registration failures).

Fixes: c7299fea6769 ("spi: Fix spi device unregister flow")
Cc: Saravana Kannan <saravanak@kernel.org>
Signed-off-by: Johan Hovold <johan@kernel.org>
---
 include/linux/spi/spi.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index 0dc671c07d3a..0de636484f3d 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -700,7 +700,7 @@ struct spi_controller {
 	int			(*transfer)(struct spi_device *spi,
 						struct spi_message *mesg);
 
-	/* Called on release() to free memory provided by spi_controller */
+	/* Called on deregistration to free memory provided by spi_controller */
 	void			(*cleanup)(struct spi_device *spi);
 
 	/*
-- 
2.52.0


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

* Re: [PATCH 0/2] spi: fix resource leaks on device setup failure
  2026-04-10 15:49 [PATCH 0/2] spi: fix resource leaks on device setup failure Johan Hovold
  2026-04-10 15:49 ` [PATCH 1/2] " Johan Hovold
  2026-04-10 15:49 ` [PATCH 2/2] spi: fix controller cleanup() documentation Johan Hovold
@ 2026-04-10 15:51 ` Johan Hovold
  2026-04-22 14:10 ` Mark Brown
  3 siblings, 0 replies; 5+ messages in thread
From: Johan Hovold @ 2026-04-10 15:51 UTC (permalink / raw)
  To: Mark Brown; +Cc: Saravana Kannan, linux-spi, linux-kernel

On Fri, Apr 10, 2026 at 05:49:05PM +0200, Johan Hovold wrote:
> Make sure to call controller cleanup() if spi_setup() fails while
> registering a device to avoid leaking any resources allocated by
> setup().

> Changes in v2:
>  - only call cleanup() if spi_setup() fails during registration
>  - use spi_cleanup() helper
>  - fix controller cleanup() documentation (new patch)

Bah, I missed to add "v2" to Subject. Let me know if you prefer me to
send a v3...

Johan

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

* Re: [PATCH 0/2] spi: fix resource leaks on device setup failure
  2026-04-10 15:49 [PATCH 0/2] spi: fix resource leaks on device setup failure Johan Hovold
                   ` (2 preceding siblings ...)
  2026-04-10 15:51 ` [PATCH 0/2] spi: fix resource leaks on device setup failure Johan Hovold
@ 2026-04-22 14:10 ` Mark Brown
  3 siblings, 0 replies; 5+ messages in thread
From: Mark Brown @ 2026-04-22 14:10 UTC (permalink / raw)
  To: Johan Hovold; +Cc: Saravana Kannan, linux-spi, linux-kernel

On Fri, 10 Apr 2026 17:49:05 +0200, Johan Hovold wrote:
> spi: fix resource leaks on device setup failure
> 
> Make sure to call controller cleanup() if spi_setup() fails while
> registering a device to avoid leaking any resources allocated by
> setup().
> 
> Johan
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git for-7.1

Thanks!

[1/2] spi: fix resource leaks on device setup failure
      https://git.kernel.org/broonie/spi/c/db357034f7e0
[2/2] spi: fix controller cleanup() documentation
      https://git.kernel.org/broonie/spi/c/a6e23843e949

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark


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

end of thread, other threads:[~2026-04-22 19:57 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-10 15:49 [PATCH 0/2] spi: fix resource leaks on device setup failure Johan Hovold
2026-04-10 15:49 ` [PATCH 1/2] " Johan Hovold
2026-04-10 15:49 ` [PATCH 2/2] spi: fix controller cleanup() documentation Johan Hovold
2026-04-10 15:51 ` [PATCH 0/2] spi: fix resource leaks on device setup failure Johan Hovold
2026-04-22 14:10 ` Mark Brown

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.