summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGui-Dong Han <hanguidong02@gmail.com>2026-03-25 12:09:05 +0300
committerDanilo Krummrich <dakr@kernel.org>2026-03-30 15:45:51 +0300
commit3210dabba4e4aff7395b68914bad95153dda6db7 (patch)
treecfe2fdc39ae1736cde2ceda16b8d3acb237ffb1b
parenta1fa010b3c9f0adae252986ddb54a449df45f700 (diff)
downloadlinux-3210dabba4e4aff7395b68914bad95153dda6db7.tar.xz
driver core: simplify __device_set_driver_override() clearing logic
Currently, __device_set_driver_override() handles clearing the override via empty string ("") and newline ("\n") in two separate paths. The "\n" case also performs an unnecessary memory allocation and immediate free. Simplify the logic by initializing 'new' to NULL and only allocating memory if the string length remains non-zero after stripping the trailing newline. Reduce code size, improve readability, and avoid unnecessary memory operations. No functional change intended. Suggested-by: Geert Uytterhoeven <geert@linux-m68k.org> Link: https://lore.kernel.org/driver-core/DGS82WWLXPJ0.2EH4VJSF30UR5@kernel.org/ Signed-off-by: Gui-Dong Han <hanguidong02@gmail.com> Link: https://patch.msgid.link/20260325090905.169000-1-hanguidong02@gmail.com [ Narrow cp's scope to the newline handling block; use scoped_guard(). - Danilo ] Signed-off-by: Danilo Krummrich <dakr@kernel.org>
-rw-r--r--drivers/base/dd.c46
1 files changed, 19 insertions, 27 deletions
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 37c7e54e0e4c..a46e28236068 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -383,8 +383,7 @@ __exitcall(deferred_probe_exit);
int __device_set_driver_override(struct device *dev, const char *s, size_t len)
{
- const char *new, *old;
- char *cp;
+ const char *new = NULL, *old;
if (!s)
return -EINVAL;
@@ -404,37 +403,30 @@ int __device_set_driver_override(struct device *dev, const char *s, size_t len)
*/
len = strlen(s);
- if (!len) {
- /* Empty string passed - clear override */
- spin_lock(&dev->driver_override.lock);
- old = dev->driver_override.name;
- dev->driver_override.name = NULL;
- spin_unlock(&dev->driver_override.lock);
- kfree(old);
+ /* Handle trailing newline */
+ if (len) {
+ char *cp;
- return 0;
+ cp = strnchr(s, len, '\n');
+ if (cp)
+ len = cp - s;
}
- cp = strnchr(s, len, '\n');
- if (cp)
- len = cp - s;
-
- new = kstrndup(s, len, GFP_KERNEL);
- if (!new)
- return -ENOMEM;
+ /*
+ * If empty string or "\n" passed, new remains NULL, clearing
+ * the driver_override.name.
+ */
+ if (len) {
+ new = kstrndup(s, len, GFP_KERNEL);
+ if (!new)
+ return -ENOMEM;
+ }
- spin_lock(&dev->driver_override.lock);
- old = dev->driver_override.name;
- if (cp != s) {
+ scoped_guard(spinlock, &dev->driver_override.lock) {
+ old = dev->driver_override.name;
dev->driver_override.name = new;
- spin_unlock(&dev->driver_override.lock);
- } else {
- /* "\n" passed - clear override */
- dev->driver_override.name = NULL;
- spin_unlock(&dev->driver_override.lock);
-
- kfree(new);
}
+
kfree(old);
return 0;