From nobody Sat Oct 4 00:32:13 2025 Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 96D6C2D249A; Fri, 22 Aug 2025 07:59:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.191 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755849599; cv=none; b=G95TitsEWIYREBGNEi+zpO2gCa0WIz7Z/gVweD+U48G8+JrysK8xP1+SxTvfdAZ71XYXeKXmThdHoswlaH4Q8V+wF2sXTpj6/9P/ZPpuKll2WYWkBY/T2hKPq3itdqRUorJUzWKmAN8zV739V2ejWxLepZsbZs+YkzRkcwN4lcI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755849599; c=relaxed/simple; bh=ctM+YoZw4/ZxbDDzVBuf5gyabHtTS0tWuMfb+jMkbDk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=khHa+QA46ANh2GLXM+byH2/PGHTuvy22/D/NcPkppZ7bPATbP5+XAcKZXKl7o4rL+evmq2d+UJGk4+HdibuUkI3Je4AorbE5kM0C6lCpGMBsiW2uSx9zOfXd84BH/4uv/z09R3jH1vI02EMuYPDnsVZ1Lohkl9jOTka2VsbWe7w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=h-partners.com; spf=pass smtp.mailfrom=h-partners.com; arc=none smtp.client-ip=45.249.212.191 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=h-partners.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=h-partners.com Received: from mail.maildlp.com (unknown [172.19.162.112]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4c7Xb15W7Gz2Dc4D; Fri, 22 Aug 2025 15:57:01 +0800 (CST) Received: from kwepemh200005.china.huawei.com (unknown [7.202.181.112]) by mail.maildlp.com (Postfix) with ESMTPS id D3D3E140258; Fri, 22 Aug 2025 15:59:52 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by kwepemh200005.china.huawei.com (7.202.181.112) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Fri, 22 Aug 2025 15:59:52 +0800 From: Yihang Li To: , CC: , , , , , Subject: [PATCH 1/4] scsi: hisi_sas: Use tasklet to process CQ interrupts Date: Fri, 22 Aug 2025 15:59:48 +0800 Message-ID: <20250822075951.2051639-2-liyihang9@h-partners.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250822075951.2051639-1-liyihang9@h-partners.com> References: <20250822075951.2051639-1-liyihang9@h-partners.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: kwepems200001.china.huawei.com (7.221.188.67) To kwepemh200005.china.huawei.com (7.202.181.112) Content-Type: text/plain; charset="utf-8" Since commit 81f338e9709d ("scsi: hisi_sas: use threaded irq to process CQ interrupts") hisi_sas driver has been using threaded irq to process CQ interrupts. However, we found that when the CPU handling the interrupt thread is occupied by other high-priority processes, the interrupt thread will not be scheduled. This results in the response of IO commands issued through the hisi_sas driver not being effectively processed, triggering the timeout mechanism at the SCSI layer and leading to the SCSI error handler being invoked. We believe that the method of handling CQ interrupts through threaded irq will inevitably encounter this issue, where the CPU bound to the interrupt thread cannot be scheduled to handle other processes/threads when occupied by high-priority processes or tasks. Therefore, we have reverted the interrupt handling in the hisi_sas driver back to tasklet. Signed-off-by: Yihang Li --- drivers/scsi/hisi_sas/hisi_sas.h | 2 +- drivers/scsi/hisi_sas/hisi_sas_main.c | 16 ++++++------ drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 36 ++++++++++++++++---------- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 27 ++++++++++--------- 4 files changed, 45 insertions(+), 36 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_= sas.h index 1323ed8aa717..493a1b2124d1 100644 --- a/drivers/scsi/hisi_sas/hisi_sas.h +++ b/drivers/scsi/hisi_sas/hisi_sas.h @@ -214,9 +214,9 @@ struct hisi_sas_port { struct hisi_sas_cq { struct hisi_hba *hisi_hba; const struct cpumask *irq_mask; + struct tasklet_struct tasklet; int rd_point; int id; - int irq_no; spinlock_t poll_lock; }; =20 diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index 30a9c6612651..693198b7027e 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -740,7 +740,7 @@ static void hisi_sas_sync_cq(struct hisi_sas_cq *cq) if (hisi_sas_queue_is_poll(cq)) hisi_sas_sync_poll_cq(cq); else - synchronize_irq(cq->irq_no); + tasklet_kill(&cq->tasklet); } =20 void hisi_sas_sync_poll_cqs(struct hisi_hba *hisi_hba) @@ -779,7 +779,7 @@ static void hisi_sas_tmf_aborted(struct sas_task *task) struct hisi_sas_cq *cq =3D &hisi_hba->cq[slot->dlvry_queue]; /* - * sync irq or poll queue to avoid free'ing task + * flush tasklet or poll queue to avoid free'ing task * before using task in IO completion */ hisi_sas_sync_cq(cq); @@ -1705,8 +1705,8 @@ static int hisi_sas_abort_task(struct sas_task *task) =20 if (slot) { /* - * sync irq or poll queue to avoid free'ing task - * before using task in IO completion + * flush tasklet or poll queue to avoid free'ing + * task before using task in IO completion */ cq =3D &hisi_hba->cq[slot->dlvry_queue]; hisi_sas_sync_cq(cq); @@ -1779,8 +1779,8 @@ static int hisi_sas_abort_task(struct sas_task *task) if (((rc < 0) || (rc =3D=3D TMF_RESP_FUNC_FAILED)) && task->lldd_task) { /* - * sync irq or poll queue to avoid free'ing task - * before using task in IO completion + * flush tasklet or poll queue to avoid free'ing + * task before using task in IO completion */ hisi_sas_sync_cq(cq); slot->task =3D NULL; @@ -2042,8 +2042,8 @@ static bool hisi_sas_internal_abort_timeout(struct sa= s_task *task, struct hisi_sas_cq *cq =3D &hisi_hba->cq[slot->dlvry_queue]; /* - * sync irq or poll queue to avoid free'ing task - * before using task in IO completion + * flush tasklet or poll queue to avoid free'ing + * task before using task in IO completion */ hisi_sas_sync_cq(cq); slot->task =3D NULL; diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas= /hisi_sas_v2_hw.c index f3516a0611dd..4c7d026a44a8 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c @@ -3110,9 +3110,9 @@ static irqreturn_t fatal_axi_int_v2_hw(int irq_no, vo= id *p) return IRQ_HANDLED; } =20 -static irqreturn_t cq_thread_v2_hw(int irq_no, void *p) +static void cq_tasklet_v2_hw(unsigned long val) { - struct hisi_sas_cq *cq =3D p; + struct hisi_sas_cq *cq =3D (struct hisi_sas_cq *)val; struct hisi_hba *hisi_hba =3D cq->hisi_hba; struct hisi_sas_slot *slot; struct hisi_sas_itct *itct; @@ -3180,8 +3180,6 @@ static irqreturn_t cq_thread_v2_hw(int irq_no, void *= p) /* update rd_point */ cq->rd_point =3D rd_point; hisi_sas_write32(hisi_hba, COMPL_Q_0_RD_PTR + (0x14 * queue), rd_point); - - return IRQ_HANDLED; } =20 static irqreturn_t cq_interrupt_v2_hw(int irq_no, void *p) @@ -3191,8 +3189,9 @@ static irqreturn_t cq_interrupt_v2_hw(int irq_no, voi= d *p) int queue =3D cq->id; =20 hisi_sas_write32(hisi_hba, OQ_INT_SRC, 1 << queue); + tasklet_schedule(&cq->tasklet); =20 - return IRQ_WAKE_THREAD; + return IRQ_HANDLED; } =20 static irqreturn_t sata_int_v2_hw(int irq_no, void *p) @@ -3373,19 +3372,20 @@ static int interrupt_init_v2_hw(struct hisi_hba *hi= si_hba) =20 for (queue_no =3D 0; queue_no < hisi_hba->cq_nvecs; queue_no++) { struct hisi_sas_cq *cq =3D &hisi_hba->cq[queue_no]; + struct tasklet_struct *t =3D &cq->tasklet; =20 - cq->irq_no =3D hisi_hba->irq_map[queue_no + 96]; - rc =3D devm_request_threaded_irq(dev, cq->irq_no, - cq_interrupt_v2_hw, - cq_thread_v2_hw, IRQF_ONESHOT, - DRV_NAME " cq", cq); + irq =3D hisi_hba->irq_map[queue_no + 96]; + rc =3D devm_request_irq(dev, irq, cq_interrupt_v2_hw, 0, + DRV_NAME " cq", cq); if (rc) { dev_err(dev, "irq init: could not request cq interrupt %d, rc=3D%d\n", - cq->irq_no, rc); + irq, rc); rc =3D -ENOENT; goto err_out; } - cq->irq_mask =3D irq_get_affinity_mask(cq->irq_no); + + cq->irq_mask =3D irq_get_affinity_mask(irq); + tasklet_init(t, cq_tasklet_v2_hw, (unsigned long)cq); } err_out: return rc; @@ -3443,6 +3443,7 @@ static int soft_reset_v2_hw(struct hisi_hba *hisi_hba) =20 interrupt_disable_v2_hw(hisi_hba); hisi_sas_write32(hisi_hba, DLVRY_QUEUE_ENABLE, 0x0); + hisi_sas_sync_cqs(hisi_hba); =20 hisi_sas_stop_phys(hisi_hba); =20 @@ -3635,6 +3636,15 @@ static int hisi_sas_v2_probe(struct platform_device = *pdev) return hisi_sas_probe(pdev, &hisi_sas_v2_hw); } =20 +static void hisi_sas_v2_remove(struct platform_device *pdev) +{ + struct sas_ha_struct *sha =3D platform_get_drvdata(pdev); + struct hisi_hba *hisi_hba =3D sha->lldd_ha; + + hisi_sas_sync_cqs(hisi_hba); + hisi_sas_remove(pdev); +} + static const struct of_device_id sas_v2_of_match[] =3D { { .compatible =3D "hisilicon,hip06-sas-v2",}, { .compatible =3D "hisilicon,hip07-sas-v2",}, @@ -3651,7 +3661,7 @@ MODULE_DEVICE_TABLE(acpi, sas_v2_acpi_match); =20 static struct platform_driver hisi_sas_v2_driver =3D { .probe =3D hisi_sas_v2_probe, - .remove =3D hisi_sas_remove, + .remove =3D hisi_sas_v2_remove, .driver =3D { .name =3D DRV_NAME, .of_match_table =3D sas_v2_of_match, diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas= /hisi_sas_v3_hw.c index 2f9e01717ef3..2778ebe117bb 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c @@ -2569,13 +2569,11 @@ static int queue_complete_v3_hw(struct Scsi_Host *s= host, unsigned int queue) return completed; } =20 -static irqreturn_t cq_thread_v3_hw(int irq_no, void *p) +static void cq_tasklet_v3_hw(unsigned long val) { - struct hisi_sas_cq *cq =3D p; + struct hisi_sas_cq *cq =3D (struct hisi_sas_cq *)val; =20 complete_v3_hw(cq); - - return IRQ_HANDLED; } =20 static irqreturn_t cq_interrupt_v3_hw(int irq_no, void *p) @@ -2585,8 +2583,9 @@ static irqreturn_t cq_interrupt_v3_hw(int irq_no, voi= d *p) int queue =3D cq->id; =20 hisi_sas_write32(hisi_hba, OQ_INT_SRC, 1 << queue); + tasklet_schedule(&cq->tasklet); =20 - return IRQ_WAKE_THREAD; + return IRQ_HANDLED; } =20 static void hisi_sas_v3_free_vectors(void *data) @@ -2657,16 +2656,13 @@ static int interrupt_init_v3_hw(struct hisi_hba *hi= si_hba) =20 for (i =3D 0; i < hisi_hba->cq_nvecs; i++) { struct hisi_sas_cq *cq =3D &hisi_hba->cq[i]; + struct tasklet_struct *t =3D &cq->tasklet; int nr =3D hisi_sas_intr_conv ? BASE_VECTORS_V3_HW : BASE_VECTORS_V3_HW + i; - unsigned long irqflags =3D hisi_sas_intr_conv ? IRQF_SHARED : - IRQF_ONESHOT; - - cq->irq_no =3D pci_irq_vector(pdev, nr); - rc =3D devm_request_threaded_irq(dev, cq->irq_no, - cq_interrupt_v3_hw, - cq_thread_v3_hw, - irqflags, + unsigned long irqflags =3D hisi_sas_intr_conv ? IRQF_SHARED : 0; + + rc =3D devm_request_irq(dev, pci_irq_vector(pdev, nr), + cq_interrupt_v3_hw, irqflags, DRV_NAME " cq", cq); if (rc) { dev_err(dev, "could not request cq%d interrupt, rc=3D%d\n", @@ -2678,6 +2674,8 @@ static int interrupt_init_v3_hw(struct hisi_hba *hisi= _hba) dev_err(dev, "could not get cq%d irq affinity!\n", i); return -ENOENT; } + + tasklet_init(t, cq_tasklet_v3_hw, (unsigned long)cq); } =20 return 0; @@ -2750,8 +2748,8 @@ static int disable_host_v3_hw(struct hisi_hba *hisi_h= ba) u32 status, reg_val; int rc; =20 - hisi_sas_sync_poll_cqs(hisi_hba); hisi_sas_write32(hisi_hba, DLVRY_QUEUE_ENABLE, 0x0); + hisi_sas_sync_cqs(hisi_hba); =20 hisi_sas_stop_phys(hisi_hba); =20 @@ -5100,6 +5098,7 @@ static void hisi_sas_v3_remove(struct pci_dev *pdev) sas_remove_host(shost); =20 hisi_sas_v3_destroy_irqs(pdev, hisi_hba); + hisi_sas_sync_cqs(hisi_hba); hisi_sas_free(hisi_hba); scsi_host_put(shost); } --=20 2.33.0 From nobody Sat Oct 4 00:32:13 2025 Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 96DD92E7BDF; Fri, 22 Aug 2025 07:59:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.191 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755849598; cv=none; b=n0BpErQjN7Kz9+ea5+qgz6CeeQWqZPJWy5JLLljmxyYYjqBDYOXNfZarFyDMm9LAL5uUvlXvHhjvFxIIDsxjxs5SoQhjw9wzclfAlpQLa4gdvubp9DO+qKz1FoUfObHqAyRubS9okUXdQniIBYZq1ltUJWExkMlY8WHDyZU6+qA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755849598; c=relaxed/simple; bh=xFCNNOvk+CIvgtSwTkc8/AB+SBLiFCFcgMeEscR6wQM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=EZO9bTKnqY0qy1mIrFrFxrGXNvP7zluFxmP3LoJKmSvclQcr9/3uJe8ECK+EeEQPUcAJmSYZ+1caVQN6NqAn8qzdglk0qhsJHwVFy7HIBvl45PESN0dIlCT/E6lRMUdSQDq2oU9U7PH/daebB7WH+SHar9u2oeDJklbhy+4ZYzg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=h-partners.com; spf=pass smtp.mailfrom=h-partners.com; arc=none smtp.client-ip=45.249.212.191 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=h-partners.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=h-partners.com Received: from mail.maildlp.com (unknown [172.19.88.214]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4c7XZz2JyBz1R8s9; Fri, 22 Aug 2025 15:56:59 +0800 (CST) Received: from kwepemh200005.china.huawei.com (unknown [7.202.181.112]) by mail.maildlp.com (Postfix) with ESMTPS id 3A56A1A016C; Fri, 22 Aug 2025 15:59:53 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by kwepemh200005.china.huawei.com (7.202.181.112) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Fri, 22 Aug 2025 15:59:52 +0800 From: Yihang Li To: , CC: , , , , , Subject: [PATCH 2/4] scsi: hisi_sas: replace spin_lock/spin_unlock with spin_lock_irqsave/spin_unlock_restore Date: Fri, 22 Aug 2025 15:59:49 +0800 Message-ID: <20250822075951.2051639-3-liyihang9@h-partners.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250822075951.2051639-1-liyihang9@h-partners.com> References: <20250822075951.2051639-1-liyihang9@h-partners.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: kwepems200001.china.huawei.com (7.221.188.67) To kwepemh200005.china.huawei.com (7.202.181.112) Content-Type: text/plain; charset="utf-8" After changing threaded irq to tasklet, some critical resources are used on interrupt or bottom half of interrupt, so replace spin_lock/spin_unlock with spin_lock_irqsave/spin_unlock_restore to protect those critical resources. Signed-off-by: Yihang Li --- drivers/scsi/hisi_sas/hisi_sas_main.c | 47 +++++++++++++++----------- drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 12 ++++--- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 15 ++++---- 3 files changed, 44 insertions(+), 30 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index 693198b7027e..cd24b7d4ef0f 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -193,11 +193,13 @@ static void hisi_sas_slot_index_clear(struct hisi_hba= *hisi_hba, int slot_idx) =20 static void hisi_sas_slot_index_free(struct hisi_hba *hisi_hba, int slot_i= dx) { + unsigned long flags; + if (hisi_hba->hw->slot_index_alloc || slot_idx < HISI_SAS_RESERVED_IPTT) { - spin_lock(&hisi_hba->lock); + spin_lock_irqsave(&hisi_hba->lock, flags); hisi_sas_slot_index_clear(hisi_hba, slot_idx); - spin_unlock(&hisi_hba->lock); + spin_unlock_irqrestore(&hisi_hba->lock, flags); } } =20 @@ -213,11 +215,12 @@ static int hisi_sas_slot_index_alloc(struct hisi_hba = *hisi_hba, { int index; void *bitmap =3D hisi_hba->slot_index_tags; + unsigned long flags; =20 if (rq) return rq->tag + HISI_SAS_RESERVED_IPTT; =20 - spin_lock(&hisi_hba->lock); + spin_lock_irqsave(&hisi_hba->lock, flags); index =3D find_next_zero_bit(bitmap, HISI_SAS_RESERVED_IPTT, hisi_hba->last_slot_index + 1); if (index >=3D HISI_SAS_RESERVED_IPTT) { @@ -225,13 +228,13 @@ static int hisi_sas_slot_index_alloc(struct hisi_hba = *hisi_hba, HISI_SAS_RESERVED_IPTT, 0); if (index >=3D HISI_SAS_RESERVED_IPTT) { - spin_unlock(&hisi_hba->lock); + spin_unlock_irqrestore(&hisi_hba->lock, flags); return -SAS_QUEUE_FULL; } } hisi_sas_slot_index_set(hisi_hba, index); hisi_hba->last_slot_index =3D index; - spin_unlock(&hisi_hba->lock); + spin_unlock_irqrestore(&hisi_hba->lock, flags); =20 return index; } @@ -239,6 +242,7 @@ static int hisi_sas_slot_index_alloc(struct hisi_hba *h= isi_hba, void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *t= ask, struct hisi_sas_slot *slot, bool need_lock) { + unsigned long flags; int device_id =3D slot->device_id; struct hisi_sas_device *sas_dev =3D &hisi_hba->devices[device_id]; =20 @@ -272,9 +276,9 @@ void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba,= struct sas_task *task, } =20 if (need_lock) { - spin_lock(&sas_dev->lock); + spin_lock_irqsave(&sas_dev->lock, flags); list_del_init(&slot->entry); - spin_unlock(&sas_dev->lock); + spin_unlock_irqrestore(&sas_dev->lock, flags); } else { list_del_init(&slot->entry); } @@ -436,15 +440,16 @@ void hisi_sas_task_deliver(struct hisi_hba *hisi_hba, int dlvry_queue_slot, dlvry_queue; struct sas_task *task =3D slot->task; int wr_q_index; + unsigned long flags; =20 - spin_lock(&dq->lock); + spin_lock_irqsave(&dq->lock, flags); wr_q_index =3D dq->wr_point; dq->wr_point =3D (dq->wr_point + 1) % HISI_SAS_QUEUE_SLOTS; list_add_tail(&slot->delivery, &dq->list); - spin_unlock(&dq->lock); - spin_lock(&sas_dev->lock); + spin_unlock_irqrestore(&dq->lock, flags); + spin_lock_irqsave(&sas_dev->lock, flags); list_add_tail(&slot->entry, &sas_dev->list); - spin_unlock(&sas_dev->lock); + spin_unlock_irqrestore(&sas_dev->lock, flags); =20 dlvry_queue =3D dq->id; dlvry_queue_slot =3D wr_q_index; @@ -485,9 +490,9 @@ void hisi_sas_task_deliver(struct hisi_hba *hisi_hba, smp_wmb(); WRITE_ONCE(slot->ready, 1); =20 - spin_lock(&dq->lock); + spin_lock_irqsave(&dq->lock, flags); hisi_hba->hw->start_delivery(dq); - spin_unlock(&dq->lock); + spin_unlock_irqrestore(&dq->lock, flags); } =20 static int hisi_sas_queue_command(struct sas_task *task, gfp_t gfp_flags) @@ -690,11 +695,12 @@ static struct hisi_sas_device *hisi_sas_alloc_dev(str= uct domain_device *device) { struct hisi_hba *hisi_hba =3D dev_to_hisi_hba(device); struct hisi_sas_device *sas_dev =3D NULL; + unsigned long flags; int last =3D hisi_hba->last_dev_id; int first =3D (hisi_hba->last_dev_id + 1) % HISI_SAS_MAX_DEVICES; int i; =20 - spin_lock(&hisi_hba->lock); + spin_lock_irqsave(&hisi_hba->lock, flags); for (i =3D first; i !=3D last; i %=3D HISI_SAS_MAX_DEVICES) { if (hisi_hba->devices[i].dev_type =3D=3D SAS_PHY_UNUSED) { int queue =3D i % hisi_hba->queue_count; @@ -714,16 +720,18 @@ static struct hisi_sas_device *hisi_sas_alloc_dev(str= uct domain_device *device) i++; } hisi_hba->last_dev_id =3D i; - spin_unlock(&hisi_hba->lock); + spin_unlock_irqrestore(&hisi_hba->lock, flags); =20 return sas_dev; } =20 static void hisi_sas_sync_poll_cq(struct hisi_sas_cq *cq) { + unsigned long flags; + /* make sure CQ entries being processed are processed to completion */ - spin_lock(&cq->poll_lock); - spin_unlock(&cq->poll_lock); + spin_lock_irqsave(&cq->poll_lock, flags); + spin_unlock_irqrestore(&cq->poll_lock, flags); } =20 static bool hisi_sas_queue_is_poll(struct hisi_sas_cq *cq) @@ -1155,12 +1163,13 @@ static void hisi_sas_release_task(struct hisi_hba *= hisi_hba, { struct hisi_sas_slot *slot, *slot2; struct hisi_sas_device *sas_dev =3D device->lldd_dev; + unsigned long flags; =20 - spin_lock(&sas_dev->lock); + spin_lock_irqsave(&sas_dev->lock, flags); list_for_each_entry_safe(slot, slot2, &sas_dev->list, entry) hisi_sas_do_release_task(hisi_hba, slot->task, slot, false); =20 - spin_unlock(&sas_dev->lock); + spin_unlock_irqrestore(&sas_dev->lock, flags); } =20 void hisi_sas_release_tasks(struct hisi_hba *hisi_hba) diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas= /hisi_sas_v2_hw.c index 4c7d026a44a8..d2d226ac4164 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c @@ -773,6 +773,7 @@ slot_index_alloc_quirk_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_device *sas_dev =3D device->lldd_dev; int sata_idx =3D sas_dev->sata_idx; int start, end; + unsigned long flags; =20 if (!sata_dev) { /* @@ -796,12 +797,12 @@ slot_index_alloc_quirk_v2_hw(struct hisi_hba *hisi_hb= a, end =3D 64 * (sata_idx + 2); } =20 - spin_lock(&hisi_hba->lock); + spin_lock_irqsave(&hisi_hba->lock, flags); while (1) { start =3D find_next_zero_bit(bitmap, hisi_hba->slot_index_count, start); if (start >=3D end) { - spin_unlock(&hisi_hba->lock); + spin_unlock_irqrestore(&hisi_hba->lock, flags); return -SAS_QUEUE_FULL; } /* @@ -813,7 +814,7 @@ slot_index_alloc_quirk_v2_hw(struct hisi_hba *hisi_hba, } =20 set_bit(start, bitmap); - spin_unlock(&hisi_hba->lock); + spin_unlock_irqrestore(&hisi_hba->lock, flags); return start; } =20 @@ -842,8 +843,9 @@ hisi_sas_device *alloc_dev_quirk_v2_hw(struct domain_de= vice *device) struct hisi_sas_device *sas_dev =3D NULL; int i, sata_dev =3D dev_is_sata(device); int sata_idx =3D -1; + unsigned long flags; =20 - spin_lock(&hisi_hba->lock); + spin_lock_irqsave(&hisi_hba->lock, flags); =20 if (sata_dev) if (!sata_index_alloc_v2_hw(hisi_hba, &sata_idx)) @@ -874,7 +876,7 @@ hisi_sas_device *alloc_dev_quirk_v2_hw(struct domain_de= vice *device) } =20 out: - spin_unlock(&hisi_hba->lock); + spin_unlock_irqrestore(&hisi_hba->lock, flags); =20 return sas_dev; } diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas= /hisi_sas_v3_hw.c index 2778ebe117bb..967cf5181fed 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c @@ -954,10 +954,11 @@ static void dereg_device_v3_hw(struct hisi_hba *hisi_= hba, struct hisi_sas_slot *slot, *slot2; struct hisi_sas_device *sas_dev =3D device->lldd_dev; u32 cfg_abt_set_query_iptt; + unsigned long flags; =20 cfg_abt_set_query_iptt =3D hisi_sas_read32(hisi_hba, CFG_ABT_SET_QUERY_IPTT); - spin_lock(&sas_dev->lock); + spin_lock_irqsave(&sas_dev->lock, flags); list_for_each_entry_safe(slot, slot2, &sas_dev->list, entry) { cfg_abt_set_query_iptt &=3D ~CFG_SET_ABORTED_IPTT_MSK; cfg_abt_set_query_iptt |=3D (1 << CFG_SET_ABORTED_EN_OFF) | @@ -965,7 +966,7 @@ static void dereg_device_v3_hw(struct hisi_hba *hisi_hb= a, hisi_sas_write32(hisi_hba, CFG_ABT_SET_QUERY_IPTT, cfg_abt_set_query_iptt); } - spin_unlock(&sas_dev->lock); + spin_unlock_irqrestore(&sas_dev->lock, flags); cfg_abt_set_query_iptt &=3D ~(1 << CFG_SET_ABORTED_EN_OFF); hisi_sas_write32(hisi_hba, CFG_ABT_SET_QUERY_IPTT, cfg_abt_set_query_iptt); @@ -1587,6 +1588,7 @@ static irqreturn_t phy_up_v3_hw(int phy_no, struct hi= si_hba *hisi_hba) struct hisi_sas_phy *phy =3D &hisi_hba->phy[phy_no]; struct asd_sas_phy *sas_phy =3D &phy->sas_phy; struct device *dev =3D hisi_hba->dev; + unsigned long flags; =20 hisi_sas_phy_write32(hisi_hba, phy_no, PHYCTRL_PHY_ENA_MSK, 1); =20 @@ -1664,11 +1666,11 @@ static irqreturn_t phy_up_v3_hw(int phy_no, struct = hisi_hba *hisi_hba) } =20 phy->port_id =3D port_id; - spin_lock(&phy->lock); + spin_lock_irqsave(&phy->lock, flags); /* Delete timer and set phy_attached atomically */ timer_delete(&phy->timer); phy->phy_attached =3D 1; - spin_unlock(&phy->lock); + spin_unlock_irqrestore(&phy->lock, flags); =20 /* * Call pm_runtime_get_noresume() which pairs with @@ -2560,11 +2562,12 @@ static int queue_complete_v3_hw(struct Scsi_Host *s= host, unsigned int queue) { struct hisi_hba *hisi_hba =3D shost_priv(shost); struct hisi_sas_cq *cq =3D &hisi_hba->cq[queue]; + unsigned long flags; int completed; =20 - spin_lock(&cq->poll_lock); + spin_lock_irqsave(&cq->poll_lock, flags); completed =3D complete_v3_hw(cq); - spin_unlock(&cq->poll_lock); + spin_unlock_irqrestore(&cq->poll_lock, flags); =20 return completed; } --=20 2.33.0 From nobody Sat Oct 4 00:32:13 2025 Received: from szxga06-in.huawei.com (szxga06-in.huawei.com [45.249.212.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 29EFA2E8E17; Fri, 22 Aug 2025 07:59:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.32 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755849598; cv=none; b=CJIy6g2W9U2yob8DjZaJb+c9fbCPB6B8LGQRcTl8GVZ2HMU49x7XqJvs/afTprD0A5/XPkH6rdO6bTP0SLtnURVDfBYlYmagEQ8iW7/dL9O1So00Zx2vRj+ziy+BhsW0JuCM7uXJGh15oa3Vq34Dze0rGgKTI0fcM3TotHmOWgU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755849598; c=relaxed/simple; bh=2mNK/G+UdmLd/wUnzViK9h4iThwB6qlPneYAKY4e6CY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UwJ/O7UsF6ZHGxXyqMxf0Ox6/JrJovNRchdNY3bOw5KzA3HgBoMgwYmV0vi8wf3LgKfxSo78J8g95Smu2XqUpi6p14wB0VD2cxr55uPMissUzqf6O2ZSYzZsQJIEJ76N1K/JyGNlrZk5RzaGuo8Eb4nU7ZM1MMycXqD7uYnosWI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=h-partners.com; spf=pass smtp.mailfrom=h-partners.com; arc=none smtp.client-ip=45.249.212.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=h-partners.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=h-partners.com Received: from mail.maildlp.com (unknown [172.19.163.17]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4c7Xgb2KRvz27jGV; Fri, 22 Aug 2025 16:00:59 +0800 (CST) Received: from kwepemh200005.china.huawei.com (unknown [7.202.181.112]) by mail.maildlp.com (Postfix) with ESMTPS id 9657F1A0188; Fri, 22 Aug 2025 15:59:53 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by kwepemh200005.china.huawei.com (7.202.181.112) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Fri, 22 Aug 2025 15:59:53 +0800 From: Yihang Li To: , CC: , , , , , Subject: [PATCH 3/4] scsi: hisi_sas: Remove cond_resched() in bottom half of interrupt Date: Fri, 22 Aug 2025 15:59:50 +0800 Message-ID: <20250822075951.2051639-4-liyihang9@h-partners.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250822075951.2051639-1-liyihang9@h-partners.com> References: <20250822075951.2051639-1-liyihang9@h-partners.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: kwepems200001.china.huawei.com (7.221.188.67) To kwepemh200005.china.huawei.com (7.202.181.112) Content-Type: text/plain; charset="utf-8" After changing threaded irq to tasklet, the tasklet function executes in the soft interrupt context, and soft interrupt handlers cannot sleep or be scheduled. Therefore, remove cond_resched() in complete_v3_hw(). Signed-off-by: Yihang Li --- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas= /hisi_sas_v3_hw.c index 967cf5181fed..58bdff8b3665 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c @@ -2553,7 +2553,6 @@ static int complete_v3_hw(struct hisi_sas_cq *cq) /* update rd_point */ cq->rd_point =3D rd_point; hisi_sas_write32(hisi_hba, COMPL_Q_0_RD_PTR + (0x14 * queue), rd_point); - cond_resched(); =20 return completed; } --=20 2.33.0 From nobody Sat Oct 4 00:32:13 2025 Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 871FD2EA48B; Fri, 22 Aug 2025 07:59:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.189 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755849599; cv=none; b=Yxgk8tnrkV+CJtvqahFi3eNbC14rKhq8xqXoil4kUt5DGhF/6yMKcmAqRS7ztqiNAR8h61rKScNy6OtM55I4/9prTpPtoytKaHiNdFV3tYWbkEmIBlO80c6zTcJMVrQhf8yPirnzAp9O1a6U/unpaEI5k5ZA69iBK6XLfylvZ2s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755849599; c=relaxed/simple; bh=nsZJ2eg5NO/9LP5H5mGlr9Mh6ZEFV6Uo7z/Dvs2ySYU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ttNKCDaMlBLgAnom1gxz679plqLog14P8+cKYNpYY/zuBrNy/JfXj2XEzXfeGh6I6RhOLNTKaiOMgaOfmtg8P3T7Wlin+9shn3bg5m5XcUSHF9Y8m6FBckXcbP1c7A4wHPSNQBnhIUjaiV0YZu3AiV0y0VX4e3w7xXdqil/cbFo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=h-partners.com; spf=pass smtp.mailfrom=h-partners.com; arc=none smtp.client-ip=45.249.212.189 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=h-partners.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=h-partners.com Received: from mail.maildlp.com (unknown [172.19.163.174]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4c7XYG1BkWzdcKP; Fri, 22 Aug 2025 15:55:30 +0800 (CST) Received: from kwepemh200005.china.huawei.com (unknown [7.202.181.112]) by mail.maildlp.com (Postfix) with ESMTPS id 014F71400CD; Fri, 22 Aug 2025 15:59:54 +0800 (CST) Received: from localhost.localdomain (10.50.165.33) by kwepemh200005.china.huawei.com (7.202.181.112) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Fri, 22 Aug 2025 15:59:53 +0800 From: Yihang Li To: , CC: , , , , , Subject: [PATCH 4/4] scsi: hisi_sas: Remove unused hisi_sas_sync_poll_cqs() Date: Fri, 22 Aug 2025 15:59:51 +0800 Message-ID: <20250822075951.2051639-5-liyihang9@h-partners.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250822075951.2051639-1-liyihang9@h-partners.com> References: <20250822075951.2051639-1-liyihang9@h-partners.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: kwepems200001.china.huawei.com (7.221.188.67) To kwepemh200005.china.huawei.com (7.202.181.112) Content-Type: text/plain; charset="utf-8" hisi_sas_sync_poll_cqs() is no longer used anywhere, so remove it. Signed-off-by: Yihang Li --- drivers/scsi/hisi_sas/hisi_sas_main.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index cd24b7d4ef0f..4296fa45da22 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -751,19 +751,6 @@ static void hisi_sas_sync_cq(struct hisi_sas_cq *cq) tasklet_kill(&cq->tasklet); } =20 -void hisi_sas_sync_poll_cqs(struct hisi_hba *hisi_hba) -{ - int i; - - for (i =3D 0; i < hisi_hba->queue_count; i++) { - struct hisi_sas_cq *cq =3D &hisi_hba->cq[i]; - - if (hisi_sas_queue_is_poll(cq)) - hisi_sas_sync_poll_cq(cq); - } -} -EXPORT_SYMBOL_GPL(hisi_sas_sync_poll_cqs); - void hisi_sas_sync_cqs(struct hisi_hba *hisi_hba) { int i; --=20 2.33.0