lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Wed,  6 Sep 2017 19:26:51 +0800
From:   Baolin Wang <baolin.wang@...aro.org>
To:     broonie@...nel.org
Cc:     linux-spi@...r.kernel.org, linux-kernel@...r.kernel.org,
        baolin.wang@...aro.org
Subject: [PATCH] spi: Use ida to manage SPI bus number

This patch adds one static ida variable to manage SPI bus number, moreover
we can get dynamic bus number from ida instead of one "dynamic" IDs, which
can be removed.

Signed-off-by: Baolin Wang <baolin.wang@...aro.org>
---
 drivers/spi/spi.c |   21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 4fcbb0a..1498be2 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -40,10 +40,13 @@
 #include <linux/ioport.h>
 #include <linux/acpi.h>
 #include <linux/highmem.h>
+#include <linux/idr.h>
 
 #define CREATE_TRACE_POINTS
 #include <trace/events/spi.h>
 
+static DEFINE_IDA(spi_bus_ida);
+
 static void spidev_release(struct device *dev)
 {
 	struct spi_device	*spi = to_spi_device(dev);
@@ -2052,7 +2055,6 @@ static int of_spi_register_master(struct spi_controller *ctlr)
  */
 int spi_register_controller(struct spi_controller *ctlr)
 {
-	static atomic_t		dyn_bus_id = ATOMIC_INIT((1<<15) - 1);
 	struct device		*dev = ctlr->dev.parent;
 	struct boardinfo	*bi;
 	int			status = -ENODEV;
@@ -2076,12 +2078,15 @@ int spi_register_controller(struct spi_controller *ctlr)
 	if ((ctlr->bus_num < 0) && ctlr->dev.of_node)
 		ctlr->bus_num = of_alias_get_id(ctlr->dev.of_node, "spi");
 
-	/* convention:  dynamically assigned bus IDs count down from the max */
+	if (ctlr->bus_num >= 0)
+		ctlr->bus_num = ida_simple_get(&spi_bus_ida, ctlr->bus_num,
+					       ctlr->bus_num + 1, GFP_KERNEL);
+
 	if (ctlr->bus_num < 0) {
-		/* FIXME switch to an IDR based scheme, something like
-		 * I2C now uses, so we can't run out of "dynamic" IDs
-		 */
-		ctlr->bus_num = atomic_dec_return(&dyn_bus_id);
+		ctlr->bus_num = ida_simple_get(&spi_bus_ida, 0, 0, GFP_KERNEL);
+		if (ctlr->bus_num < 0)
+			return ctlr->bus_num;
+
 		dynamic = 1;
 	}
 
@@ -2128,7 +2133,10 @@ int spi_register_controller(struct spi_controller *ctlr)
 	/* Register devices from the device tree and ACPI */
 	of_register_spi_devices(ctlr);
 	acpi_register_spi_devices(ctlr);
+
+	return 0;
 done:
+	ida_simple_remove(&spi_bus_ida, ctlr->bus_num);
 	return status;
 }
 EXPORT_SYMBOL_GPL(spi_register_controller);
@@ -2202,6 +2210,7 @@ void spi_unregister_controller(struct spi_controller *ctlr)
 	list_del(&ctlr->list);
 	mutex_unlock(&board_lock);
 
+	ida_simple_remove(&spi_bus_ida, ctlr->bus_num);
 	dummy = device_for_each_child(&ctlr->dev, NULL, __unregister);
 	device_unregister(&ctlr->dev);
 }
-- 
1.7.9.5

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ