When removing and reinserting the laptop battery, ACPI can trigger two notifications in quick succession:
- ACPI_BATTERY_NOTIFY_STATUS (0x80) - ACPI_BATTERY_NOTIFY_INFO (0x81)
Both notifications call acpi_battery_update(). Because the events happen very close in time, sysfs_add_battery() can be re-entered before battery->bat is set, causing a duplicate sysfs entry error.
This patch ensures that sysfs_add_battery() is not re-entered when battery->bat is already non-NULL, preventing the duplicate sysfs creation and stabilizing battery hotplug handling.
[ 476.117945] sysfs: cannot create duplicate filename '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT1' [ 476.118896] CPU: 1 UID: 0 PID: 185 Comm: kworker/1:4 Kdump: loaded Not tainted 6.12.38+deb13-amd64 #1 Debian 6.12.38-1 [ 476.118903] Hardware name: Gateway NV44 /SJV40-MV , BIOS V1.3121 04/08/2009 [ 476.118906] Workqueue: kacpi_notify acpi_os_execute_deferred [ 476.118917] Call Trace: [ 476.118922] <TASK> [ 476.118929] dump_stack_lvl+0x5d/0x80 [ 476.118938] sysfs_warn_dup.cold+0x17/0x23 [ 476.118943] sysfs_create_dir_ns+0xce/0xe0 [ 476.118952] kobject_add_internal+0xba/0x250 [ 476.118959] kobject_add+0x96/0xc0 [ 476.118964] ? get_device_parent+0xde/0x1e0 [ 476.118970] device_add+0xe2/0x870 [ 476.118975] __power_supply_register.part.0+0x20f/0x3f0 [ 476.118981] ? wake_up_q+0x4e/0x90 [ 476.118990] sysfs_add_battery+0xa4/0x1d0 [battery] [ 476.118998] acpi_battery_update+0x19e/0x290 [battery] [ 476.119002] acpi_battery_notify+0x50/0x120 [battery] [ 476.119006] acpi_ev_notify_dispatch+0x49/0x70 [ 476.119012] acpi_os_execute_deferred+0x1a/0x30 [ 476.119015] process_one_work+0x177/0x330 [ 476.119022] worker_thread+0x251/0x390 [ 476.119026] ? __pfx_worker_thread+0x10/0x10 [ 476.119030] kthread+0xd2/0x100 [ 476.119033] ? __pfx_kthread+0x10/0x10 [ 476.119035] ret_from_fork+0x34/0x50 [ 476.119040] ? __pfx_kthread+0x10/0x10 [ 476.119042] ret_from_fork_asm+0x1a/0x30 [ 476.119049] </TASK> [ 476.142552] kobject: kobject_add_internal failed for BAT1 with -EEXIST, don't try to register things with the same name in the same directory. [ 476.415022] ata1.00: unexpected _GTF length (8) [ 476.428076] sd 0:0:0:0: [sda] Starting disk [ 476.835035] ata1.00: unexpected _GTF length (8) [ 476.839720] ata1.00: configured for UDMA/133 [ 491.328831] sysfs: cannot create duplicate filename '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:00/power_supply/BAT1' [ 491.329720] CPU: 1 UID: 0 PID: 185 Comm: kworker/1:4 Kdump: loaded Not tainted 6.12.38+deb13-amd64 #1 Debian 6.12.38-1 [ 491.329727] Hardware name: Gateway NV44 /SJV40-MV , BIOS V1.3121 04/08/2009 [ 491.329731] Workqueue: kacpi_notify acpi_os_execute_deferred [ 491.329741] Call Trace: [ 491.329745] <TASK> [ 491.329751] dump_stack_lvl+0x5d/0x80 [ 491.329758] sysfs_warn_dup.cold+0x17/0x23 [ 491.329762] sysfs_create_dir_ns+0xce/0xe0 [ 491.329770] kobject_add_internal+0xba/0x250 [ 491.329775] kobject_add+0x96/0xc0 [ 491.329779] ? get_device_parent+0xde/0x1e0 [ 491.329784] device_add+0xe2/0x870 [ 491.329790] __power_supply_register.part.0+0x20f/0x3f0 [ 491.329797] sysfs_add_battery+0xa4/0x1d0 [battery] [ 491.329805] acpi_battery_update+0x19e/0x290 [battery] [ 491.329809] acpi_battery_notify+0x50/0x120 [battery] [ 491.329812] acpi_ev_notify_dispatch+0x49/0x70 [ 491.329817] acpi_os_execute_deferred+0x1a/0x30 [ 491.329820] process_one_work+0x177/0x330 [ 491.329826] worker_thread+0x251/0x390 [ 491.329830] ? __pfx_worker_thread+0x10/0x10 [ 491.329833] kthread+0xd2/0x100 [ 491.329836] ? __pfx_kthread+0x10/0x10 [ 491.329838] ret_from_fork+0x34/0x50 [ 491.329842] ? __pfx_kthread+0x10/0x10 [ 491.329844] ret_from_fork_asm+0x1a/0x30 [ 491.329850] </TASK> [ 491.329855] kobject: kobject_add_internal failed for BAT1 with -EEXIST, don't try to register things with the same name in the same directory.
Fixes: 508df92d1f8d ("ACPI: battery: register power_supply subdevice only when battery is present") Signed-off-by: GuangFei Luo luogf2025@163.com Cc: stable@vger.kernel.org --- drivers/acpi/battery.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 6905b56bf3e4..3801fd34c969 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c @@ -1026,11 +1026,13 @@ static int acpi_battery_update(struct acpi_battery *battery, bool resume) return result; acpi_battery_quirks(battery);
+ mutex_lock(&battery->sysfs_lock); if (!battery->bat) { result = sysfs_add_battery(battery); if (result) return result; } + mutex_unlock(&battery->sysfs_lock);
/* * Wakeup the system if battery is critical low
Hi GuangFei,
kernel test robot noticed the following build warnings:
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/GuangFei-Luo/ACPI-battery-pre... base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next patch link: https://lore.kernel.org/r/20250907035154.223983-1-luogf2025%40163.com patch subject: [PATCH] ACPI: battery: prevent sysfs_add_battery re-entry on rapid events config: x86_64-randconfig-161-20250909 (https://download.01.org/0day-ci/archive/20250910/202509101620.yI0HZ5gT-lkp@i...) compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot lkp@intel.com | Reported-by: Dan Carpenter dan.carpenter@linaro.org | Closes: https://lore.kernel.org/r/202509101620.yI0HZ5gT-lkp@intel.com/
smatch warnings: drivers/acpi/battery.c:1046 acpi_battery_update() warn: inconsistent returns '&battery->sysfs_lock'.
vim +1046 drivers/acpi/battery.c
9e50bc14a7f58b5 Lan Tianyu 2014-05-04 1001 static int acpi_battery_update(struct acpi_battery *battery, bool resume) 508df92d1f8d192 Andrey Borzenkov 2007-10-28 1002 { 82f2d30570b7ecd Lucas Rangit Magasweran 2018-07-14 1003 int result = acpi_battery_get_status(battery); 82f2d30570b7ecd Lucas Rangit Magasweran 2018-07-14 1004 508df92d1f8d192 Andrey Borzenkov 2007-10-28 1005 if (result) 508df92d1f8d192 Andrey Borzenkov 2007-10-28 1006 return result; 82f2d30570b7ecd Lucas Rangit Magasweran 2018-07-14 1007 508df92d1f8d192 Andrey Borzenkov 2007-10-28 1008 if (!acpi_battery_present(battery)) { 508df92d1f8d192 Andrey Borzenkov 2007-10-28 1009 sysfs_remove_battery(battery); 97749cd9adbb298 Alexey Starikovskiy 2008-01-01 1010 battery->update_time = 0; 508df92d1f8d192 Andrey Borzenkov 2007-10-28 1011 return 0; 508df92d1f8d192 Andrey Borzenkov 2007-10-28 1012 } 9e50bc14a7f58b5 Lan Tianyu 2014-05-04 1013 9e50bc14a7f58b5 Lan Tianyu 2014-05-04 1014 if (resume) 9e50bc14a7f58b5 Lan Tianyu 2014-05-04 1015 return 0; 9e50bc14a7f58b5 Lan Tianyu 2014-05-04 1016 82f2d30570b7ecd Lucas Rangit Magasweran 2018-07-14 1017 if (!battery->update_time) { 97749cd9adbb298 Alexey Starikovskiy 2008-01-01 1018 result = acpi_battery_get_info(battery); 97749cd9adbb298 Alexey Starikovskiy 2008-01-01 1019 if (result) 97749cd9adbb298 Alexey Starikovskiy 2008-01-01 1020 return result; 97749cd9adbb298 Alexey Starikovskiy 2008-01-01 1021 acpi_battery_init_alarm(battery); 97749cd9adbb298 Alexey Starikovskiy 2008-01-01 1022 } 12c78ca2ab5e64b Carlos Garnacho 2016-08-10 1023 12c78ca2ab5e64b Carlos Garnacho 2016-08-10 1024 result = acpi_battery_get_state(battery); 12c78ca2ab5e64b Carlos Garnacho 2016-08-10 1025 if (result) 12c78ca2ab5e64b Carlos Garnacho 2016-08-10 1026 return result; 12c78ca2ab5e64b Carlos Garnacho 2016-08-10 1027 acpi_battery_quirks(battery); 12c78ca2ab5e64b Carlos Garnacho 2016-08-10 1028 ce5e61beaad5c5a GuangFei Luo 2025-09-07 1029 mutex_lock(&battery->sysfs_lock); 297d716f6260cc9 Krzysztof Kozlowski 2015-03-12 1030 if (!battery->bat) { eb03cb02b74df6d Stefan Hajnoczi 2011-07-12 1031 result = sysfs_add_battery(battery); eb03cb02b74df6d Stefan Hajnoczi 2011-07-12 1032 if (result) eb03cb02b74df6d Stefan Hajnoczi 2011-07-12 1033 return result;
mutex_unlock(&battery->sysfs_lock) before returning.
eb03cb02b74df6d Stefan Hajnoczi 2011-07-12 1034 } ce5e61beaad5c5a GuangFei Luo 2025-09-07 1035 mutex_unlock(&battery->sysfs_lock); e0d1f09e311fafa Zhang Rui 2014-05-28 1036 e0d1f09e311fafa Zhang Rui 2014-05-28 1037 /* e0d1f09e311fafa Zhang Rui 2014-05-28 1038 * Wakeup the system if battery is critical low e0d1f09e311fafa Zhang Rui 2014-05-28 1039 * or lower than the alarm level e0d1f09e311fafa Zhang Rui 2014-05-28 1040 */ e0d1f09e311fafa Zhang Rui 2014-05-28 1041 if ((battery->state & ACPI_BATTERY_STATE_CRITICAL) || e0d1f09e311fafa Zhang Rui 2014-05-28 1042 (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) && e0d1f09e311fafa Zhang Rui 2014-05-28 1043 (battery->capacity_now <= battery->alarm))) 33e4f80ee69b516 Rafael J. Wysocki 2017-06-12 1044 acpi_pm_wakeup_event(&battery->device->dev); e0d1f09e311fafa Zhang Rui 2014-05-28 1045 557d58687dcdee6 Zhang Rui 2010-10-22 @1046 return result; 4bd35cdb1e2d1a1 Vladimir Lebedev 2007-02-10 1047 }
linux-stable-mirror@lists.linaro.org