[<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