Skip to content

Commit c86d06b

Browse files
htejunrafaeljw
authored andcommitted
PM / QoS: avoid calling cancel_delayed_work_sync() during early boot
of_clk_init() ends up calling into pm_qos_update_request() very early during boot where irq is expected to stay disabled. pm_qos_update_request() uses cancel_delayed_work_sync() which correctly assumes that irq is enabled on invocation and unconditionally disables and re-enables it. Gate cancel_delayed_work_sync() invocation with kevented_up() to avoid enabling irq unexpectedly during early boot. Signed-off-by: Tejun Heo <[email protected]> Reported-and-tested-by: Qiao Zhou <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent c693593 commit c86d06b

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

kernel/power/qos.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,16 @@ void pm_qos_update_request(struct pm_qos_request *req,
482482
return;
483483
}
484484

485-
cancel_delayed_work_sync(&req->work);
485+
/*
486+
* This function may be called very early during boot, for example,
487+
* from of_clk_init(), where irq needs to stay disabled.
488+
* cancel_delayed_work_sync() assumes that irq is enabled on
489+
* invocation and re-enables it on return. Avoid calling it until
490+
* workqueue is initialized.
491+
*/
492+
if (keventd_up())
493+
cancel_delayed_work_sync(&req->work);
494+
486495
__pm_qos_update_request(req, new_value);
487496
}
488497
EXPORT_SYMBOL_GPL(pm_qos_update_request);

0 commit comments

Comments
 (0)