summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorDanilo Krummrich <dakr@kernel.org>2026-05-25 03:23:22 +0200
committerDanilo Krummrich <dakr@kernel.org>2026-05-26 16:51:08 +0200
commit557495bc879013c3d5e21d667e987e7ce3a514de (patch)
tree2d6c30b1cdbc42b309ec6851c8e796ac4185afdd /drivers/base
parentf9e6da99fe49277979798a1c3b9790ae10aaa18a (diff)
downloadlinux-557495bc879013c3d5e21d667e987e7ce3a514de.tar.gz
linux-557495bc879013c3d5e21d667e987e7ce3a514de.tar.bz2
linux-557495bc879013c3d5e21d667e987e7ce3a514de.zip
driver core: Guard deferred probe timeout extension with delayed_work_pending()
mod_delayed_work() unconditionally queues the work even when it wasn't previously pending, which can fire the timeout prematurely or restart it after it already fired. Add a delayed_work_pending() guard to restore the originally intended semantics. Premature firing calls fw_devlink_drivers_done() before all built-in drivers have registered, causing fw_devlink to prematurely relax device links for suppliers whose drivers haven't loaded yet. Fixes: 1137838865bf ("driver core: Use mod_delayed_work to prevent lost deferred probe work") Tested-by: Geert Uytterhoeven <geert+renesas@glider.be> Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Link: https://patch.msgid.link/20260525012340.3860581-2-dakr@kernel.org Signed-off-by: Danilo Krummrich <dakr@kernel.org>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/dd.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index bebb43acc132..905269ecef9b 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -323,7 +323,8 @@ void deferred_probe_extend_timeout(void)
* If the work hasn't been queued yet or if the work expired, don't
* start a new one.
*/
- if (mod_delayed_work(system_wq, &deferred_probe_timeout_work,
+ if (delayed_work_pending(&deferred_probe_timeout_work) &&
+ mod_delayed_work(system_wq, &deferred_probe_timeout_work,
secs_to_jiffies(driver_deferred_probe_timeout)))
pr_debug("Extended deferred probe timeout by %d secs\n",
driver_deferred_probe_timeout);