[PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
Marek Szyprowski
m.szyprowski at samsung.com
Tue Mar 17 10:11:29 PDT 2026
Hi
On 06.03.2026 06:43, peter.wang at mediatek.com wrote:
> From: Peter Wang <peter.wang at mediatek.com>
>
> Only return IRQ_WAKE_THREAD when MCQ and ESI are not enabled
> and no UIC command is active. The default UIC command timeout
> is 500ms, Using threaded IRQs during an active UIC command
> increases the risk of timeout due to possible preemption
> by other system IRQs.
>
> Signed-off-by: Peter Wang <peter.wang at mediatek.com>
This patch landed in linux-next as commit 6475cfb81fc4 ("scsi: ufs:
core: Avoid IRQ thread wakeup during active UIC command"). In my tests I
found that it causes the following regression on QCom RB5 board
(arch/arm64/boot/dts/qcom/qrb5165-rb5.dts):
=============================
[ BUG: Invalid wait context ]
7.0.0-rc4-next-20260316 #16535 Not tainted
-----------------------------
swapper/0/0 is trying to lock:
ffff000089f58048 (shost->host_lock){....}-{3:3}, at:
ufshcd_sl_intr+0x3c0/0x6b4
other info that might help us debug this:
context-{2:2}
no locks held by swapper/0/0.
stack backtrace:
CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 7.0.0-rc4-next-20260316
#16535 PREEMPT
Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT)
Call trace:
show_stack+0x18/0x24 (C)
dump_stack_lvl+0x90/0xd0
dump_stack+0x18/0x24
__lock_acquire+0xa40/0x2254
lock_acquire+0x1c4/0x3fc
_raw_spin_lock_irqsave+0x60/0x88
ufshcd_sl_intr+0x3c0/0x6b4
ufshcd_intr+0x7c/0x90
__handle_irq_event_percpu+0xa0/0x4c4
handle_irq_event+0x4c/0xf8
handle_fasteoi_irq+0x108/0x198
handle_irq_desc+0x40/0x58
generic_handle_domain_irq+0x18/0x24
gic_handle_irq+0x4c/0x110
call_on_irq_stack+0x30/0x48
do_interrupt_handler+0x80/0x84
el1_interrupt+0x3c/0x60
el1h_64_irq_handler+0x18/0x24
el1h_64_irq+0x6c/0x70
cpuidle_enter_state+0xf8/0x41c (P)
cpuidle_enter+0x38/0x50
do_idle+0x170/0x2ac
cpu_startup_entry+0x34/0x3c
rest_init+0xf8/0x188
start_kernel+0x818/0x8ec
__primary_switched+0x88/0x90
scsi host0: ufshcd
Reverting $subject on top of linux-next fixes this issue.
> ---
> drivers/ufs/core/ufshcd.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 9908375b2f98..6554e1db3343 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -7200,8 +7200,12 @@ static irqreturn_t ufshcd_intr(int irq, void *__hba)
> struct ufs_hba *hba = __hba;
> u32 intr_status, enabled_intr_status;
>
> - /* Move interrupt handling to thread when MCQ & ESI are not enabled */
> - if (!hba->mcq_enabled || !hba->mcq_esi_enabled)
> + /*
> + * Handle interrupt in thread if MCQ or ESI is disabled,
> + * and no active UIC command.
> + */
> + if ((!hba->mcq_enabled || !hba->mcq_esi_enabled) &&
> + !hba->active_uic_cmd)
> return IRQ_WAKE_THREAD;
>
> intr_status = ufshcd_readl(hba, REG_INTERRUPT_STATUS);
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
More information about the Linux-mediatek
mailing list