Skip to content

Commit 3210dab

Browse files
2045geminiDanilo Krummrich
authored andcommitted
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>
1 parent a1fa010 commit 3210dab

1 file changed

Lines changed: 19 additions & 27 deletions

File tree

drivers/base/dd.c

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -383,8 +383,7 @@ __exitcall(deferred_probe_exit);
383383

384384
int __device_set_driver_override(struct device *dev, const char *s, size_t len)
385385
{
386-
const char *new, *old;
387-
char *cp;
386+
const char *new = NULL, *old;
388387

389388
if (!s)
390389
return -EINVAL;
@@ -404,37 +403,30 @@ int __device_set_driver_override(struct device *dev, const char *s, size_t len)
404403
*/
405404
len = strlen(s);
406405

407-
if (!len) {
408-
/* Empty string passed - clear override */
409-
spin_lock(&dev->driver_override.lock);
410-
old = dev->driver_override.name;
411-
dev->driver_override.name = NULL;
412-
spin_unlock(&dev->driver_override.lock);
413-
kfree(old);
406+
/* Handle trailing newline */
407+
if (len) {
408+
char *cp;
414409

415-
return 0;
410+
cp = strnchr(s, len, '\n');
411+
if (cp)
412+
len = cp - s;
416413
}
417414

418-
cp = strnchr(s, len, '\n');
419-
if (cp)
420-
len = cp - s;
421-
422-
new = kstrndup(s, len, GFP_KERNEL);
423-
if (!new)
424-
return -ENOMEM;
415+
/*
416+
* If empty string or "\n" passed, new remains NULL, clearing
417+
* the driver_override.name.
418+
*/
419+
if (len) {
420+
new = kstrndup(s, len, GFP_KERNEL);
421+
if (!new)
422+
return -ENOMEM;
423+
}
425424

426-
spin_lock(&dev->driver_override.lock);
427-
old = dev->driver_override.name;
428-
if (cp != s) {
425+
scoped_guard(spinlock, &dev->driver_override.lock) {
426+
old = dev->driver_override.name;
429427
dev->driver_override.name = new;
430-
spin_unlock(&dev->driver_override.lock);
431-
} else {
432-
/* "\n" passed - clear override */
433-
dev->driver_override.name = NULL;
434-
spin_unlock(&dev->driver_override.lock);
435-
436-
kfree(new);
437428
}
429+
438430
kfree(old);
439431

440432
return 0;

0 commit comments

Comments
 (0)