public inbox for linux-mediatek@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
@ 2026-03-06  5:43 ` peter.wang
  2026-03-06 16:34   ` Bart Van Assche
                     ` (3 more replies)
  0 siblings, 4 replies; 15+ messages in thread
From: peter.wang @ 2026-03-06  5:43 UTC (permalink / raw)
  To: linux-scsi, martin.petersen, avri.altman, alim.akhtar, jejb
  Cc: wsd_upstream, linux-mediatek, peter.wang, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, tun-yu.yu, eddie.huang,
	naomi.chu, ed.tsai, bvanassche

From: Peter Wang <peter.wang@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@mediatek.com>
---
 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);
-- 
2.45.2



^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-06  5:43 ` [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command peter.wang
@ 2026-03-06 16:34   ` Bart Van Assche
  2026-03-07 16:07   ` Martin K. Petersen
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 15+ messages in thread
From: Bart Van Assche @ 2026-03-06 16:34 UTC (permalink / raw)
  To: peter.wang, linux-scsi, martin.petersen, avri.altman, alim.akhtar,
	jejb
  Cc: wsd_upstream, linux-mediatek, chun-hung.wu, alice.chao, cc.chou,
	chaotian.jing, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai

On 3/5/26 11:43 PM, peter.wang@mediatek.com wrote:
> 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);

Reviewed-by: Bart Van Assche <bvanassche@acm.org>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-06  5:43 ` [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command peter.wang
  2026-03-06 16:34   ` Bart Van Assche
@ 2026-03-07 16:07   ` Martin K. Petersen
  2026-03-16  1:41   ` Martin K. Petersen
  2026-03-17 17:11   ` Marek Szyprowski
  3 siblings, 0 replies; 15+ messages in thread
From: Martin K. Petersen @ 2026-03-07 16:07 UTC (permalink / raw)
  To: peter.wang
  Cc: linux-scsi, martin.petersen, avri.altman, alim.akhtar, jejb,
	wsd_upstream, linux-mediatek, chun-hung.wu, alice.chao, cc.chou,
	chaotian.jing, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	bvanassche


Peter,

> 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.

Applied to 7.1/scsi-staging, thanks!

-- 
Martin K. Petersen


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-06  5:43 ` [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command peter.wang
  2026-03-06 16:34   ` Bart Van Assche
  2026-03-07 16:07   ` Martin K. Petersen
@ 2026-03-16  1:41   ` Martin K. Petersen
  2026-03-17 17:11   ` Marek Szyprowski
  3 siblings, 0 replies; 15+ messages in thread
From: Martin K. Petersen @ 2026-03-16  1:41 UTC (permalink / raw)
  To: linux-scsi, avri.altman, alim.akhtar, jejb, peter.wang
  Cc: Martin K . Petersen, wsd_upstream, linux-mediatek, chun-hung.wu,
	alice.chao, cc.chou, chaotian.jing, tun-yu.yu, eddie.huang,
	naomi.chu, ed.tsai, bvanassche

On Fri, 06 Mar 2026 13:43:02 +0800, peter.wang@mediatek.com wrote:

> 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.
> 
> 
> [...]

Applied to 7.1/scsi-queue, thanks!

[1/1] ufs: core: Avoid IRQ thread wakeup during active UIC command
      https://git.kernel.org/mkp/scsi/c/6475cfb81fc4

-- 
Martin K. Petersen


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-06  5:43 ` [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command peter.wang
                     ` (2 preceding siblings ...)
  2026-03-16  1:41   ` Martin K. Petersen
@ 2026-03-17 17:11   ` Marek Szyprowski
  2026-03-18  6:57     ` Peter Wang (王信友)
  2026-03-18 15:50     ` Bart Van Assche
  3 siblings, 2 replies; 15+ messages in thread
From: Marek Szyprowski @ 2026-03-17 17:11 UTC (permalink / raw)
  To: peter.wang, linux-scsi, martin.petersen, avri.altman, alim.akhtar,
	jejb
  Cc: wsd_upstream, linux-mediatek, chun-hung.wu, alice.chao, cc.chou,
	chaotian.jing, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai,
	bvanassche

Hi

On 06.03.2026 06:43, peter.wang@mediatek.com wrote:
> From: Peter Wang <peter.wang@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@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



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-17 17:11   ` Marek Szyprowski
@ 2026-03-18  6:57     ` Peter Wang (王信友)
  2026-03-18  8:14       ` Marek Szyprowski
  2026-03-18 15:50     ` Bart Van Assche
  1 sibling, 1 reply; 15+ messages in thread
From: Peter Wang (王信友) @ 2026-03-18  6:57 UTC (permalink / raw)
  To: linux-scsi@vger.kernel.org, m.szyprowski@samsung.com,
	jejb@linux.ibm.com, avri.altman@sandisk.com,
	alim.akhtar@samsung.com, martin.petersen@oracle.com
  Cc: bvanassche@acm.org, Alice Chao (趙珮均),
	Eddie Huang (黃智傑),
	CC Chou (周志杰),
	Ed Tsai (蔡宗軒), wsd_upstream,
	Chaotian Jing (井朝天),
	Chun-Hung Wu (巫駿宏),
	Naomi Chu (朱詠田),
	linux-mediatek@lists.infradead.org,
	Tun-yu Yu (游敦聿)

On Tue, 2026-03-17 at 18:11 +0100, Marek Szyprowski wrote:
> 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):

Hi Marek,

If this issue can always be reproduced with this patch?
I have doubts because, in your log, it seems to be ISR trying
to acquire the spinlock (shost->host_lock), but cannot obtain
it in time, causing a timeout.

ufshcd-qcom 1d84000.ufshc: uic cmd 0x1 with arg3 0x0 completion timeout
ufshcd-qcom 1d84000.ufshc: dme-get: sttr-id 0x41 failed 0 retries no
locks held by swapper/0/0.
ufshcd-qcom 1d84000.ufshc: ufs_wcom_check_hibern8: unable to get
TX_FSM_STATE, err -110 stack backtrace:
ufshcd-qcom 1d84000.ufshc: No active UIC command. Maybe a timeout
occurred?
ufshcd-qcom 1d84000.ufshc: ufshcd_threaded_intr: Unhadled interrupt
0x00000000 (0x00000400, 0x00000400)

Regardless of whether it runs in IRQ or thread IRQ context, the
outcome is the same (host_lock cannot be acquired in time).
So, could you check why this spinlock cannot be acquired first?
Additionally, ufs_wcom_check_hibern8 does not appear in the
current code base, so there might be some other unknown code 
that has already acquired host_lock in your code base?

Thanks
Peter

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-18  6:57     ` Peter Wang (王信友)
@ 2026-03-18  8:14       ` Marek Szyprowski
  2026-03-19 12:39         ` Peter Wang (王信友)
  0 siblings, 1 reply; 15+ messages in thread
From: Marek Szyprowski @ 2026-03-18  8:14 UTC (permalink / raw)
  To: Peter Wang (王信友), linux-scsi@vger.kernel.org,
	jejb@linux.ibm.com, avri.altman@sandisk.com,
	alim.akhtar@samsung.com, martin.petersen@oracle.com
  Cc: bvanassche@acm.org, Alice Chao (趙珮均),
	Eddie Huang (黃智傑),
	CC Chou (周志杰),
	Ed Tsai (蔡宗軒), wsd_upstream,
	Chaotian Jing (井朝天),
	Chun-Hung Wu (巫駿宏),
	Naomi Chu (朱詠田),
	linux-mediatek@lists.infradead.org,
	Tun-yu Yu (游敦聿)

Hi Peter,

On 18.03.2026 07:57, Peter Wang (王信友) wrote:
> On Tue, 2026-03-17 at 18:11 +0100, Marek Szyprowski wrote:
>> 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):
> Hi Marek,
>
> If this issue can always be reproduced with this patch?

The issue I've observed is 100% reproducible. I've checked again by 
compiling the kernel directly from commit 6475cfb81fc4:

=============================
[ BUG: Invalid wait context ]
7.0.0-rc1+ #16536 Not tainted
-----------------------------
swapper/0/0 is trying to lock:
ffff000080bdc048 (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-rc1+ #16536 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+0x208/0x290
  cpu_startup_entry+0x34/0x3c
  rest_init+0xf8/0x188
  start_kernel+0x810/0x8e4
  __primary_switched+0x88/0x90
scsi host0: ufshcd



> I have doubts because, in your log, it seems to be ISR trying
> to acquire the spinlock (shost->host_lock), but cannot obtain
> it in time, causing a timeout.
>
> ufshcd-qcom 1d84000.ufshc: uic cmd 0x1 with arg3 0x0 completion timeout
> ufshcd-qcom 1d84000.ufshc: dme-get: sttr-id 0x41 failed 0 retries no
> locks held by swapper/0/0.
> ufshcd-qcom 1d84000.ufshc: ufs_wcom_check_hibern8: unable to get
> TX_FSM_STATE, err -110 stack backtrace:
> ufshcd-qcom 1d84000.ufshc: No active UIC command. Maybe a timeout
> occurred?
> ufshcd-qcom 1d84000.ufshc: ufshcd_threaded_intr: Unhadled interrupt
> 0x00000000 (0x00000400, 0x00000400)
>
> Regardless of whether it runs in IRQ or thread IRQ context, the
> outcome is the same (host_lock cannot be acquired in time).
> So, could you check why this spinlock cannot be acquired first?
> Additionally, ufs_wcom_check_hibern8 does not appear in the
> current code base, so there might be some other unknown code
> that has already acquired host_lock in your code base?

You have probably mixed my report with this one 
https://lore.kernel.org/all/abmNkRC_vSVaP2sC@mail.iam.tj/

Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-17 17:11   ` Marek Szyprowski
  2026-03-18  6:57     ` Peter Wang (王信友)
@ 2026-03-18 15:50     ` Bart Van Assche
  2026-03-18 17:13       ` Marek Szyprowski
  1 sibling, 1 reply; 15+ messages in thread
From: Bart Van Assche @ 2026-03-18 15:50 UTC (permalink / raw)
  To: Marek Szyprowski, peter.wang, linux-scsi, martin.petersen,
	avri.altman, alim.akhtar, jejb
  Cc: wsd_upstream, linux-mediatek, chun-hung.wu, alice.chao, cc.chou,
	chaotian.jing, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai

On 3/17/26 10:11 AM, Marek Szyprowski wrote:
> 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:

This line is a mystery to me. Are there perhaps any local changes in
your kernel tree on top of linux-next? I haven't been able to find the
text "shost->host_lock" in the UIC completion path. Instead, this is
what I found:

	guard(spinlock_irqsave)(hba->host->host_lock);

> ufshcd_sl_intr+0x3c0/0x6b4

Can you please help with translating this information into a line
number? Tools like addr2line, llvm-addr2line or llvm-objdump -d -l -S
can be used to perform such a conversion.

Thanks,

Bart.


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-18 15:50     ` Bart Van Assche
@ 2026-03-18 17:13       ` Marek Szyprowski
  2026-03-18 17:32         ` Bart Van Assche
  0 siblings, 1 reply; 15+ messages in thread
From: Marek Szyprowski @ 2026-03-18 17:13 UTC (permalink / raw)
  To: Bart Van Assche, peter.wang, linux-scsi, martin.petersen,
	avri.altman, alim.akhtar, jejb
  Cc: wsd_upstream, linux-mediatek, chun-hung.wu, alice.chao, cc.chou,
	chaotian.jing, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai

On 18.03.2026 16:50, Bart Van Assche wrote:
> On 3/17/26 10:11 AM, Marek Szyprowski wrote:
>> 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:
>
> This line is a mystery to me. Are there perhaps any local changes in
> your kernel tree on top of linux-next? I haven't been able to find the
> text "shost->host_lock" in the UIC completion path.

I don't have any local changes, code is at commit 6475cfb81fc4. After 
looking at the code this 'shost' indeed looks a bit mysterious, but 
maybe it got that name after some inlining or code optimization.

> Instead, this is
> what I found:
>
>     guard(spinlock_irqsave)(hba->host->host_lock);
>
>> ufshcd_sl_intr+0x3c0/0x6b4
>
> Can you please help with translating this information into a line
> number? Tools like addr2line, llvm-addr2line or llvm-objdump -d -l -S
> can be used to perform such a conversion.

ufshcd_clk_scaling_allow() in drivers/ufs/core/ufshcd.c:6492 (code 
checkout at git commit 6475cfb81fc4)


Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-18 17:13       ` Marek Szyprowski
@ 2026-03-18 17:32         ` Bart Van Assche
  2026-03-18 19:32           ` Marek Szyprowski
  0 siblings, 1 reply; 15+ messages in thread
From: Bart Van Assche @ 2026-03-18 17:32 UTC (permalink / raw)
  To: Marek Szyprowski, peter.wang, linux-scsi, martin.petersen,
	avri.altman, alim.akhtar, jejb
  Cc: wsd_upstream, linux-mediatek, chun-hung.wu, alice.chao, cc.chou,
	chaotian.jing, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai

On 3/18/26 10:13 AM, Marek Szyprowski wrote:
> On 18.03.2026 16:50, Bart Van Assche wrote:
>> On 3/17/26 10:11 AM, Marek Szyprowski wrote:
>>> 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:
>>
>> This line is a mystery to me. Are there perhaps any local changes in
>> your kernel tree on top of linux-next? I haven't been able to find the
>> text "shost->host_lock" in the UIC completion path.
> 
> I don't have any local changes, code is at commit 6475cfb81fc4. After
> looking at the code this 'shost' indeed looks a bit mysterious, but
> maybe it got that name after some inlining or code optimization.
> 
>> Instead, this is
>> what I found:
>>
>>      guard(spinlock_irqsave)(hba->host->host_lock);
>>
>>> ufshcd_sl_intr+0x3c0/0x6b4
>>
>> Can you please help with translating this information into a line
>> number? Tools like addr2line, llvm-addr2line or llvm-objdump -d -l -S
>> can be used to perform such a conversion.
> 
> ufshcd_clk_scaling_allow() in drivers/ufs/core/ufshcd.c:6492 (code
> checkout at git commit 6475cfb81fc4)

Hi Marek,

I haven't been able to find any call chain from ufshcd_sl_intr() into
ufshcd_clk_scaling_allow(). Am I perhaps overlooking something?

Thanks,

Bart.


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-18 17:32         ` Bart Van Assche
@ 2026-03-18 19:32           ` Marek Szyprowski
  2026-03-18 20:38             ` Bart Van Assche
  0 siblings, 1 reply; 15+ messages in thread
From: Marek Szyprowski @ 2026-03-18 19:32 UTC (permalink / raw)
  To: Bart Van Assche, peter.wang, linux-scsi, martin.petersen,
	avri.altman, alim.akhtar, jejb
  Cc: wsd_upstream, linux-mediatek, chun-hung.wu, alice.chao, cc.chou,
	chaotian.jing, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai

On 18.03.2026 18:32, Bart Van Assche wrote:
> On 3/18/26 10:13 AM, Marek Szyprowski wrote:
>> On 18.03.2026 16:50, Bart Van Assche wrote:
>>> On 3/17/26 10:11 AM, Marek Szyprowski wrote:
>>>> 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:
>>>
>>> This line is a mystery to me. Are there perhaps any local changes in
>>> your kernel tree on top of linux-next? I haven't been able to find the
>>> text "shost->host_lock" in the UIC completion path.
>>
>> I don't have any local changes, code is at commit 6475cfb81fc4. After
>> looking at the code this 'shost' indeed looks a bit mysterious, but
>> maybe it got that name after some inlining or code optimization.
>>
>>> Instead, this is
>>> what I found:
>>>
>>>      guard(spinlock_irqsave)(hba->host->host_lock);
>>>
>>>> ufshcd_sl_intr+0x3c0/0x6b4
>>>
>>> Can you please help with translating this information into a line
>>> number? Tools like addr2line, llvm-addr2line or llvm-objdump -d -l -S
>>> can be used to perform such a conversion.
>>
>> ufshcd_clk_scaling_allow() in drivers/ufs/core/ufshcd.c:6492 (code
>> checkout at git commit 6475cfb81fc4)
>
> Hi Marek,
>
> I haven't been able to find any call chain from ufshcd_sl_intr() into
> ufshcd_clk_scaling_allow(). Am I perhaps overlooking something?

I must have mixed something while calculating offsets for addr2line. I 
checked again and I found that there is already a script doing that. 
I've recompiled kernel with -Os (assuming that this way less code will 
be inlined) and this is the result:

=============================
[ BUG: Invalid wait context ]
7.0.0-rc1+ #16537 Not tainted
-----------------------------
swapper/0/0 is trying to lock:
ffff000080a04048 (shost->host_lock){....}-{3:3}, at: 
ufshcd_sl_intr+0x50/0x598
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-rc1+ #16537 PREEMPT
Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT)
Call trace:
  show_stack+0x18/0x24 (C)
  dump_stack_lvl+0x6c/0x94
  dump_stack+0x18/0x24
  __lock_acquire+0x3f8/0x10ac
  lock_acquire+0x29c/0x2ec
  _raw_spin_lock_irqsave+0x58/0x78
  ufshcd_sl_intr+0x50/0x598
  ufshcd_intr+0x64/0x78
  __handle_irq_event_percpu+0x1d4/0x354
  handle_irq_event_percpu+0x18/0x4c
  handle_irq_event+0x48/0x90
  handle_fasteoi_irq+0xc4/0xe8
  handle_irq_desc+0x48/0x58
  generic_handle_domain_irq+0x18/0x24
  gic_handle_irq+0xa4/0x108
  call_on_irq_stack+0x30/0x48
  do_interrupt_handler+0x88/0x94
  el1_interrupt+0x3c/0x60
  el1h_64_irq_handler+0x18/0x24
  el1h_64_irq+0x6c/0x70
  cpuidle_enter_state+0x1c0/0x2f0 (P)
  cpuidle_enter+0x38/0x50
  do_idle+0x23c/0x260
  cpu_startup_entry+0x34/0x38
  kernel_init+0x0/0x12c
  start_kernel+0x7e4/0x7f0
  __primary_switched+0x88/0x90


# ./scripts/faddr2line vmlinux "ufshcd_sl_intr+0x50/0x598"
ufshcd_sl_intr+0x50/0x598:
ufshcd_uic_cmd_compl at drivers/ufs/core/ufshcd.c:5570
(inlined by) ufshcd_sl_intr at drivers/ufs/core/ufshcd.c:7144


Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-18 19:32           ` Marek Szyprowski
@ 2026-03-18 20:38             ` Bart Van Assche
  0 siblings, 0 replies; 15+ messages in thread
From: Bart Van Assche @ 2026-03-18 20:38 UTC (permalink / raw)
  To: Marek Szyprowski, peter.wang, linux-scsi, martin.petersen,
	avri.altman, alim.akhtar, jejb
  Cc: wsd_upstream, linux-mediatek, chun-hung.wu, alice.chao, cc.chou,
	chaotian.jing, tun-yu.yu, eddie.huang, naomi.chu, ed.tsai

On 3/18/26 12:32 PM, Marek Szyprowski wrote:
> I must have mixed something while calculating offsets for addr2line. I
> checked again and I found that there is already a script doing that.
> I've recompiled kernel with -Os (assuming that this way less code will
> be inlined) and this is the result:
> 
> [ ... ]
> 
> # ./scripts/faddr2line vmlinux "ufshcd_sl_intr+0x50/0x598"
> ufshcd_sl_intr+0x50/0x598:
> ufshcd_uic_cmd_compl at drivers/ufs/core/ufshcd.c:5570
> (inlined by) ufshcd_sl_intr at drivers/ufs/core/ufshcd.c:7144

Thanks! So it's the guard(spinlock_irqsave)(hba->host->host_lock)
statement. Not sure why it triggers an "invalid wait context" complaint.
Is CONFIG_PREEMPT_RT perhaps enabled in your kernel configuration?

Thanks,

Bart.


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-18  8:14       ` Marek Szyprowski
@ 2026-03-19 12:39         ` Peter Wang (王信友)
  2026-03-19 20:30           ` Bart Van Assche
  0 siblings, 1 reply; 15+ messages in thread
From: Peter Wang (王信友) @ 2026-03-19 12:39 UTC (permalink / raw)
  To: linux-scsi@vger.kernel.org, m.szyprowski@samsung.com,
	jejb@linux.ibm.com, avri.altman@sandisk.com,
	alim.akhtar@samsung.com, martin.petersen@oracle.com
  Cc: Alice Chao (趙珮均),
	CC Chou (周志杰),
	Eddie Huang (黃智傑),
	Ed Tsai (蔡宗軒), wsd_upstream,
	Chaotian Jing (井朝天),
	Chun-Hung Wu (巫駿宏), bvanassche@acm.org,
	Naomi Chu (朱詠田),
	linux-mediatek@lists.infradead.org,
	Tun-yu Yu (游敦聿)

On Wed, 2026-03-18 at 09:14 +0100, Marek Szyprowski wrote:
> CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 7.0.0-rc1+ #16536
> PREEMPT
> 

Hi Marek,

I stressed the UIC command for 24 hours but could not 
reproduce the issue. I also found that the line containing
"PREEMPT" might be a key point.

So I suspect that lockdep might be misjudging with "PREEMPT"
setting. After all, using spin_lock_irqsave inside the
ISR should be fine:
    guard(spinlock_irqsave)(hba->host->host_lock);

Would it be possible to try disabling lockdep and see what
happens? It seems lockdep is even getting the lock wrong 
(hba->host->host_lock, not shost->host_lock).


> 
> You have probably mixed my report with this one 
> https://lore.kernel.org/all/abmNkRC_vSVaP2sC@mail.iam.tj/ 
> 
> Best regards


Yes, I mixed it up with this one because the call trace 
looks the same.

Thanks
Peter

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-19 12:39         ` Peter Wang (王信友)
@ 2026-03-19 20:30           ` Bart Van Assche
  2026-03-20  2:09             ` Peter Wang (王信友)
  0 siblings, 1 reply; 15+ messages in thread
From: Bart Van Assche @ 2026-03-19 20:30 UTC (permalink / raw)
  To: Peter Wang (王信友), linux-scsi@vger.kernel.org,
	m.szyprowski@samsung.com, jejb@linux.ibm.com,
	avri.altman@sandisk.com, alim.akhtar@samsung.com,
	martin.petersen@oracle.com
  Cc: Alice Chao (趙珮均),
	CC Chou (周志杰),
	Eddie Huang (黃智傑),
	Ed Tsai (蔡宗軒), wsd_upstream,
	Chaotian Jing (井朝天),
	Chun-Hung Wu (巫駿宏),
	Naomi Chu (朱詠田),
	linux-mediatek@lists.infradead.org,
	Tun-yu Yu (游敦聿)

On 3/19/26 5:39 AM, Peter Wang (王信友) wrote:
> So I suspect that lockdep might be misjudging with "PREEMPT"
> setting.

If this issue would be caused by a bug in lockdep, which I doubt,
there should be other reports of this lockdep bug, isn't it? Even if
this would be a lockdep bug, this should be fixed because lockdep is
an essential debugging tool.

I propose to revert patch "ufs: core: Avoid IRQ thread wakeup during
active UIC command" if the root cause of this issue is not found in the
next few days.

Thanks,

Bart.


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command
  2026-03-19 20:30           ` Bart Van Assche
@ 2026-03-20  2:09             ` Peter Wang (王信友)
  0 siblings, 0 replies; 15+ messages in thread
From: Peter Wang (王信友) @ 2026-03-20  2:09 UTC (permalink / raw)
  To: linux-scsi@vger.kernel.org, m.szyprowski@samsung.com,
	jejb@linux.ibm.com, avri.altman@sandisk.com, bvanassche@acm.org,
	alim.akhtar@samsung.com, martin.petersen@oracle.com
  Cc: Alice Chao (趙珮均),
	Eddie Huang (黃智傑),
	CC Chou (周志杰),
	Ed Tsai (蔡宗軒), wsd_upstream,
	Chaotian Jing (井朝天),
	Chun-Hung Wu (巫駿宏),
	Naomi Chu (朱詠田),
	linux-mediatek@lists.infradead.org,
	Tun-yu Yu (游敦聿)

On Thu, 2026-03-19 at 13:30 -0700, Bart Van Assche wrote:
> If this issue would be caused by a bug in lockdep, which I doubt,
> there should be other reports of this lockdep bug, isn't it? Even if
> this would be a lockdep bug, this should be fixed because lockdep is
> an essential debugging tool.
> 

Hi Bart,

I absolutely agree with you, and I just want to conduct some
DOE experiments to find out the root cause of this issue.
Because it is really weird and cannot be reproduced at my site.


> I propose to revert patch "ufs: core: Avoid IRQ thread wakeup during
> active UIC command" if the root cause of this issue is not found in
> the
> next few days.
> 
> Thanks,
> 
> Bart.

Sure, reverting is a quick solution. But I am concerned that
it would hide the real problem.

Thanks.
Peter


^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2026-03-20  2:10 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <CGME20260317171131eucas1p25dd55bf1aad6d5b310526d51885b3b7a@eucas1p2.samsung.com>
2026-03-06  5:43 ` [PATCH v2] ufs: core: Avoid IRQ thread wakeup during active UIC command peter.wang
2026-03-06 16:34   ` Bart Van Assche
2026-03-07 16:07   ` Martin K. Petersen
2026-03-16  1:41   ` Martin K. Petersen
2026-03-17 17:11   ` Marek Szyprowski
2026-03-18  6:57     ` Peter Wang (王信友)
2026-03-18  8:14       ` Marek Szyprowski
2026-03-19 12:39         ` Peter Wang (王信友)
2026-03-19 20:30           ` Bart Van Assche
2026-03-20  2:09             ` Peter Wang (王信友)
2026-03-18 15:50     ` Bart Van Assche
2026-03-18 17:13       ` Marek Szyprowski
2026-03-18 17:32         ` Bart Van Assche
2026-03-18 19:32           ` Marek Szyprowski
2026-03-18 20:38             ` Bart Van Assche

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox