Skip to content

Commit 3f39f56

Browse files
Jason-JH LinJassi Brar
authored andcommitted
mailbox: mtk-cmdq: Remove pm_runtime APIs from cmdq_mbox_send_data()
pm_runtime_get_sync() and pm_runtime_put_autosuspend() were previously called in cmdq_mbox_send_data(), which is under a spinlock in msg_submit() (mailbox.c). This caused lockdep warnings such as "sleeping function called from invalid context" when running with lockdebug enabled. The BUG report: BUG: sleeping function called from invalid context at drivers/base/power/runtime.c:1164 in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 3616, name: kworker/u17:3 preempt_count: 1, expected: 0 RCU nest depth: 0, expected: 0 INFO: lockdep is turned off. irq event stamp: 0 CPU: 1 PID: 3616 Comm: kworker/u17:3 Not tainted 6.1.87-lockdep-14133-g26e933aca785 #1 Hardware name: Google Ciri sku0/unprovisioned board (DT) Workqueue: imgsys_runner imgsys_runner_func Call trace: dump_backtrace+0x100/0x120 show_stack+0x20/0x2c dump_stack_lvl+0x84/0xb4 dump_stack+0x18/0x48 __might_resched+0x354/0x4c0 __might_sleep+0x98/0xe4 __pm_runtime_resume+0x70/0x124 cmdq_mbox_send_data+0xe4/0xb1c msg_submit+0x194/0x2dc mbox_send_message+0x190/0x330 imgsys_cmdq_sendtask+0x1618/0x2224 imgsys_runner_func+0xac/0x11c process_one_work+0x638/0xf84 worker_thread+0x808/0xcd0 kthread+0x24c/0x324 ret_from_fork+0x10/0x20 Additionally, pm_runtime_put_autosuspend() should be invoked from the GCE IRQ handler to ensure the hardware has actually completed its work. To resolve these issues, remove the pm_runtime calls from cmdq_mbox_send_data() and delegate power management responsibilities to the client driver. Fixes: 8afe816 ("mailbox: mtk-cmdq-mailbox: Implement Runtime PM with autosuspend") Signed-off-by: Jason-JH Lin <jason-jh.lin@mediatek.com> Signed-off-by: Jassi Brar <jassisinghbrar@gmail.com>
1 parent dbca0ea commit 3f39f56

File tree

1 file changed

+1
-11
lines changed

1 file changed

+1
-11
lines changed

drivers/mailbox/mtk-cmdq-mailbox.c

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -379,20 +379,13 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
379379
struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev);
380380
struct cmdq_task *task;
381381
unsigned long curr_pa, end_pa;
382-
int ret;
383382

384383
/* Client should not flush new tasks if suspended. */
385384
WARN_ON(cmdq->suspended);
386385

387-
ret = pm_runtime_get_sync(cmdq->mbox.dev);
388-
if (ret < 0)
389-
return ret;
390-
391386
task = kzalloc(sizeof(*task), GFP_ATOMIC);
392-
if (!task) {
393-
pm_runtime_put_autosuspend(cmdq->mbox.dev);
387+
if (!task)
394388
return -ENOMEM;
395-
}
396389

397390
task->cmdq = cmdq;
398391
INIT_LIST_HEAD(&task->list_entry);
@@ -439,9 +432,6 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
439432
}
440433
list_move_tail(&task->list_entry, &thread->task_busy_list);
441434

442-
pm_runtime_mark_last_busy(cmdq->mbox.dev);
443-
pm_runtime_put_autosuspend(cmdq->mbox.dev);
444-
445435
return 0;
446436
}
447437

0 commit comments

Comments
 (0)