Skip to content
/ linux Public

Commit 3b02923

Browse files
mandrzejewski-iceyegregkh
authored andcommitted
serial: uartlite: fix PM runtime usage count underflow on probe
commit d54801c upstream. ulite_probe() calls pm_runtime_put_autosuspend() at the end of probe without holding a corresponding PM runtime reference for non-console ports. During ulite_assign(), uart_add_one_port() triggers uart_configure_port() which calls ulite_pm() via uart_change_pm(). For non-console ports, the UART core performs a balanced get/put cycle: uart_change_pm(ON) -> ulite_pm() -> pm_runtime_get_sync() +1 uart_change_pm(OFF) -> ulite_pm() -> pm_runtime_put_autosuspend() -1 This leaves no spare reference for the pm_runtime_put_autosuspend() at the end of probe. The PM runtime core prevents the count from actually going below zero, and instead triggers a "Runtime PM usage count underflow!" warning. For console ports the bug is masked: the UART core skips the uart_change_pm(OFF) call, so the UART core's unbalanced get happens to pair with probe's trailing put. Add pm_runtime_get_noresume() before pm_runtime_enable() to take an explicit probe-owned reference that the trailing pm_runtime_put_autosuspend() can release. This ensures a correct usage count regardless of whether the port is a console. Fixes: 5bbe10a ("tty: serial: uartlite: Add runtime pm support") Cc: stable <stable@kernel.org> Signed-off-by: Maciej Andrzejewski ICEYE <maciej.andrzejewski@m-works.net> Link: https://patch.msgid.link/20260305123746.4152800-1-maciej.andrzejewski@m-works.net Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent efe85a5 commit 3b02923

File tree

1 file changed

+1
-0
lines changed

1 file changed

+1
-0
lines changed

drivers/tty/serial/uartlite.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,7 @@ static int ulite_probe(struct platform_device *pdev)
878878
pm_runtime_use_autosuspend(&pdev->dev);
879879
pm_runtime_set_autosuspend_delay(&pdev->dev, UART_AUTOSUSPEND_TIMEOUT);
880880
pm_runtime_set_active(&pdev->dev);
881+
pm_runtime_get_noresume(&pdev->dev);
881882
pm_runtime_enable(&pdev->dev);
882883

883884
ret = ulite_assign(&pdev->dev, id, res->start, irq, pdata);

0 commit comments

Comments
 (0)