Patch "scsi: hisi_sas: Add cond_resched() for no forced preemption model" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    scsi: hisi_sas: Add cond_resched() for no forced preemption model

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     scsi-hisi_sas-add-cond_resched-for-no-forced-preempt.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit ea1414255e94323964a6a29be231dbede90d2c20
Author: Yihang Li <liyihang9@xxxxxxxxxx>
Date:   Tue Oct 8 10:18:16 2024 +0800

    scsi: hisi_sas: Add cond_resched() for no forced preemption model
    
    [ Upstream commit 2233c4a0b948211743659b24c13d6bd059fa75fc ]
    
    For no forced preemption model kernel, in the scenario where the
    expander is connected to 12 high performance SAS SSDs, the following
    call trace may occur:
    
    [  214.409199][  C240] watchdog: BUG: soft lockup - CPU#240 stuck for 22s! [irq/149-hisi_sa:3211]
    [  214.568533][  C240] pstate: 60400009 (nZCv daif +PAN -UAO -TCO BTYPE=--)
    [  214.575224][  C240] pc : fput_many+0x8c/0xdc
    [  214.579480][  C240] lr : fput+0x1c/0xf0
    [  214.583302][  C240] sp : ffff80002de2b900
    [  214.587298][  C240] x29: ffff80002de2b900 x28: ffff1082aa412000
    [  214.593291][  C240] x27: ffff3062a0348c08 x26: ffff80003a9f6000
    [  214.599284][  C240] x25: ffff1062bbac5c40 x24: 0000000000001000
    [  214.605277][  C240] x23: 000000000000000a x22: 0000000000000001
    [  214.611270][  C240] x21: 0000000000001000 x20: 0000000000000000
    [  214.617262][  C240] x19: ffff3062a41ae580 x18: 0000000000010000
    [  214.623255][  C240] x17: 0000000000000001 x16: ffffdb3a6efe5fc0
    [  214.629248][  C240] x15: ffffffffffffffff x14: 0000000003ffffff
    [  214.635241][  C240] x13: 000000000000ffff x12: 000000000000029c
    [  214.641234][  C240] x11: 0000000000000006 x10: ffff80003a9f7fd0
    [  214.647226][  C240] x9 : ffffdb3a6f0482fc x8 : 0000000000000001
    [  214.653219][  C240] x7 : 0000000000000002 x6 : 0000000000000080
    [  214.659212][  C240] x5 : ffff55480ee9b000 x4 : fffffde7f94c6554
    [  214.665205][  C240] x3 : 0000000000000002 x2 : 0000000000000020
    [  214.671198][  C240] x1 : 0000000000000021 x0 : ffff3062a41ae5b8
    [  214.677191][  C240] Call trace:
    [  214.680320][  C240]  fput_many+0x8c/0xdc
    [  214.684230][  C240]  fput+0x1c/0xf0
    [  214.687707][  C240]  aio_complete_rw+0xd8/0x1fc
    [  214.692225][  C240]  blkdev_bio_end_io+0x98/0x140
    [  214.696917][  C240]  bio_endio+0x160/0x1bc
    [  214.701001][  C240]  blk_update_request+0x1c8/0x3bc
    [  214.705867][  C240]  scsi_end_request+0x3c/0x1f0
    [  214.710471][  C240]  scsi_io_completion+0x7c/0x1a0
    [  214.715249][  C240]  scsi_finish_command+0x104/0x140
    [  214.720200][  C240]  scsi_softirq_done+0x90/0x180
    [  214.724892][  C240]  blk_mq_complete_request+0x5c/0x70
    [  214.730016][  C240]  scsi_mq_done+0x48/0xac
    [  214.734194][  C240]  sas_scsi_task_done+0xbc/0x16c [libsas]
    [  214.739758][  C240]  slot_complete_v3_hw+0x260/0x760 [hisi_sas_v3_hw]
    [  214.746185][  C240]  cq_thread_v3_hw+0xbc/0x190 [hisi_sas_v3_hw]
    [  214.752179][  C240]  irq_thread_fn+0x34/0xa4
    [  214.756435][  C240]  irq_thread+0xc4/0x130
    [  214.760520][  C240]  kthread+0x108/0x13c
    [  214.764430][  C240]  ret_from_fork+0x10/0x18
    
    This is because in the hisi_sas driver, both the hardware interrupt
    handler and the interrupt thread are executed on the same CPU. In the
    performance test scenario, function irq_wait_for_interrupt() will always
    return 0 if lots of interrupts occurs and the CPU will be continuously
    consumed. As a result, the CPU cannot run the watchdog thread. When the
    watchdog time exceeds the specified time, call trace occurs.
    
    To fix it, add cond_resched() to execute the watchdog thread.
    
    Signed-off-by: Yihang Li <liyihang9@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20241008021822.2617339-8-liyihang9@xxxxxxxxxx
    Reviewed-by: Xiang Chen <chenxiang66@xxxxxxxxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
index f03a09c9e865e..fdd765d41f190 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
@@ -2381,6 +2381,7 @@ static irqreturn_t  cq_thread_v3_hw(int irq_no, void *p)
 	/* update rd_point */
 	cq->rd_point = rd_point;
 	hisi_sas_write32(hisi_hba, COMPL_Q_0_RD_PTR + (0x14 * queue), rd_point);
+	cond_resched();
 
 	return IRQ_HANDLED;
 }




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux