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-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20240904-bus_match_unlikely-v1-1-122318285261@quicinc.com>
Date: Wed, 04 Sep 2024 20:56:42 +0800
From: Zijun Hu <zijun_hu@...oud.com>
To: Greg Kroah-Hartman <gregkh@...uxfoundation.org>, 
 "Rafael J. Wysocki" <rafael@...nel.org>
Cc: Zijun Hu <zijun_hu@...oud.com>, linux-kernel@...r.kernel.org, 
 Zijun Hu <quic_zijuhu@...cinc.com>
Subject: [PATCH 1/3] driver core: Mark impossible return values of
 bus_type's match() with unlikely()

From: Zijun Hu <quic_zijuhu@...cinc.com>

Bus_type's match() should return bool type compatible integer 0 or 1
ideally since its main operations are lookup and comparison normally
actually, this rule is followed by ALL bus_types but @amba_bustype within
current v6.10 kernel tree, for @amba_bustype, ONLY extra -EPROBE_DEFER
may be returned, so mark those impossible or rare return values with
unlikely() to help readers understand device and driver binding logic.

Signed-off-by: Zijun Hu <quic_zijuhu@...cinc.com>
---
 drivers/base/dd.c          | 16 ++++++++++++----
 include/linux/device/bus.h |  9 ++++-----
 2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 9b745ba54de1..288e19c9854b 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -928,7 +928,11 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
 	if (ret == 0) {
 		/* no match */
 		return 0;
-	} else if (ret == -EPROBE_DEFER) {
+	} else if (unlikely(ret == -EPROBE_DEFER)) {
+		/*
+		 * Only match() of @amba_bustype may return this error
+		 * in current v6.10 tree, so also give unlikely() here.
+		 */
 		dev_dbg(dev, "Device match requests probe deferral\n");
 		dev->can_match = true;
 		driver_deferred_probe_add(dev);
@@ -937,7 +941,7 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
 		 * to match or bind with other drivers on the bus.
 		 */
 		return ret;
-	} else if (ret < 0) {
+	} else if (unlikely(ret < 0)) {
 		dev_dbg(dev, "Bus failed to match device: %d\n", ret);
 		return ret;
 	} /* ret > 0 means positive match */
@@ -1172,7 +1176,11 @@ static int __driver_attach(struct device *dev, void *data)
 	if (ret == 0) {
 		/* no match */
 		return 0;
-	} else if (ret == -EPROBE_DEFER) {
+	} else if (unlikely(ret == -EPROBE_DEFER)) {
+		/*
+		 * Only match() of @amba_bustype may return this error
+		 * in current v6.10 tree, so also give unlikely() here.
+		 */
 		dev_dbg(dev, "Device match requests probe deferral\n");
 		dev->can_match = true;
 		driver_deferred_probe_add(dev);
@@ -1181,7 +1189,7 @@ static int __driver_attach(struct device *dev, void *data)
 		 * another device on the bus.
 		 */
 		return 0;
-	} else if (ret < 0) {
+	} else if (unlikely(ret < 0)) {
 		dev_dbg(dev, "Bus failed to match device: %d\n", ret);
 		/*
 		 * Driver could not match with device, but may match with
diff --git a/include/linux/device/bus.h b/include/linux/device/bus.h
index 807831d6bf0f..1766b555da11 100644
--- a/include/linux/device/bus.h
+++ b/include/linux/device/bus.h
@@ -29,12 +29,11 @@ struct fwnode_handle;
  * @bus_groups:	Default attributes of the bus.
  * @dev_groups:	Default attributes of the devices on the bus.
  * @drv_groups: Default attributes of the device drivers on the bus.
- * @match:	Called, perhaps multiple times, whenever a new device or driver
- *		is added for this bus. It should return a positive value if the
+ * @match:	Called, perhaps multiple times, whenever a new device or
+ *		driver is added for this bus. It should return one if the
  *		given device can be handled by the given driver and zero
- *		otherwise. It may also return error code if determining that
- *		the driver supports the device is not possible. In case of
- *		-EPROBE_DEFER it will queue the device for deferred probing.
+ *		otherwise. It may also return -EPROBE_DEFER to queue the
+ *		device for deferred probing.
  * @uevent:	Called when a device is added, removed, or a few other things
  *		that generate uevents to add the environment variables.
  * @probe:	Called when a new device or driver add to this bus, and callback

-- 
2.34.1


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ