Skip to contentSkip to conversation

Patch "spi: Fix controller unregister order" has been added to the 4.4-stable tree

DISCUSSION yangerkun 3 participants 3 messages Oct 10, 2020 – Dec 6, 2020 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

yangerkun

author
#1 lore raw
Quoted 48 lines · Sasha Levin

This is a note to let you know that I've just added the patch titled

spi: Fix controller unregister order

to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
spi-fix-controller-unregister-order.patch
and it can be found in the queue-4.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

commit af9adff04d45f726c49bc1be4a401877e627adf3

Author: Lukas Wunner <[email protected]>
Date:   Fri May 15 17:58:01 2020 +0200

spi: Fix controller unregister order

[ Upstream commit 84855678add8aba927faf76bc2f130a40f94b6f7 ]

When an SPI controller unregisters, it unbinds all its slave devices. For this, their drivers may need to access the SPI bus, e.g. to quiesce interrupts.

However since commit ffbbdd21329f ("spi: create a message queueing infrastructure"), spi_destroy_queue() is executed before unbinding the slaves. It sets ctlr->running = false, thereby preventing SPI bus access and causing unbinding of slave devices to fail.

Fix by unbinding slaves before calling spi_destroy_queue().

drivers/spi/spi.c +0 -0
index e5460d84ed08..57001f8f727a 100644

drivers/spi/spi.c void spi_unregister_master(struct spi_master *master) · line 1926

Quoted 5 lines
drivers/spi/spi.c +2 -0
@@ -1922,11 +1922,12 @@ void spi_unregister_master(struct spi_master *master)
  			dev_err(&master->dev, "queue remove failed\n");
  	}
 
+	device_for_each_child(&master->dev, NULL, __unregister);
+

Hi,

This is a wrong patch. We should move this line before spi_destroy_queue, but we didn't. 4.9 stable exists this problem too.

Thanks,
Kun.

Quoted 11 lines
drivers/spi/spi.c +0 -1
  	mutex_lock(&board_lock);
  	list_del(&master->list);
  	mutex_unlock(&board_lock);
 
-	device_for_each_child(&master->dev, NULL, __unregister);
  	device_unregister(&master->dev);
  }
  EXPORT_SYMBOL_GPL(spi_unregister_master);

.

#2 lore raw
Quoted 6 lines · yangerkun

?? 2020/6/16 9:56, Sasha Levin ????:

Quoted 5 lines

This is a note to let you know that I've just added the patch titled

spi: Fix controller unregister order

to the 4.4-stable tree which can be found at:

[...]

Quoted 11 lines

drivers/spi/spi.c void spi_unregister_master(struct spi_master *master) · line 1925

Quoted 7 lines
drivers/spi/spi.c +2 -0
@@ -1922,11 +1922,12 @@ void spi_unregister_master(struct spi_master *master)
  			dev_err(&master->dev, "queue remove failed\n");
  	}
+	device_for_each_child(&master->dev, NULL, __unregister);
+

This is a wrong patch. We should move this line before spi_destroy_queue, but we didn't. 4.9 stable exists this problem too.

Hi Sasha, Hi Greg,

below please find a patch for the 4.9-stable tree to fix the backporting issue reported above.

Thanks!

-- >8 --
Subject: [PATCH] spi: Fix controller unregister order harder

Commit c7e41e1caa71 sought to backport upstream commit 84855678add8 to the 4.9-stable tree but erroneously inserted a line at the wrong place. Fix it.

Fixes c7e41e1caa71 ("spi: Fix controller unregister order")
---
 drivers/spi/spi.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/spi/spi.c +2 -2
index c7c9ca3178ad..e0632ee1723b 100644
@@ -2070,13 +2070,13 @@ static int __unregister(struct device *dev, void *null)
  */
 void spi_unregister_master(struct spi_master *master)
 {
+	device_for_each_child(&master->dev, NULL, __unregister);
+
 	if (master->queued) {
 		if (spi_destroy_queue(master))
 			dev_err(&master->dev, "queue remove failed\n");
 	}
 
-	device_for_each_child(&master->dev, NULL, __unregister);
-
 	mutex_lock(&board_lock);
 	list_del(&master->list);
 	mutex_unlock(&board_lock);
Signature · 1 line
2.29.2
maintainer
#3 lore raw
Quoted 20 lines · Lukas Wunner
Quoted 6 lines · yangerkun

?? 2020/6/16 9:56, Sasha Levin ????:

Quoted 5 lines

This is a note to let you know that I've just added the patch titled

spi: Fix controller unregister order

to the 4.4-stable tree which can be found at:

[...]

Quoted 11 lines

drivers/spi/spi.c void spi_unregister_master(struct spi_master *master) · line 1925

Quoted 7 lines
drivers/spi/spi.c +2 -0
@@ -1922,11 +1922,12 @@ void spi_unregister_master(struct spi_master *master)
  			dev_err(&master->dev, "queue remove failed\n");
  	}
+	device_for_each_child(&master->dev, NULL, __unregister);
+

This is a wrong patch. We should move this line before spi_destroy_queue, but we didn't. 4.9 stable exists this problem too.

Quoted 4 lines

Hi Sasha, Hi Greg,

below please find a patch for the 4.9-stable tree to fix the backporting issue reported above.

Now applied, thanks.

greg k-h