From nobody Mon Apr 6 13:29:23 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C6AEAC433FE for ; Fri, 30 Sep 2022 09:05:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231294AbiI3JE7 (ORCPT ); Fri, 30 Sep 2022 05:04:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32858 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231360AbiI3JEW (ORCPT ); Fri, 30 Sep 2022 05:04:22 -0400 Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9C1521FBC86; Fri, 30 Sep 2022 02:04:07 -0700 (PDT) Received: from fraeml710-chm.china.huawei.com (unknown [172.18.147.226]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4Mf43j0tZlz67N4y; Fri, 30 Sep 2022 17:01:53 +0800 (CST) Received: from lhrpeml500003.china.huawei.com (7.191.162.67) by fraeml710-chm.china.huawei.com (10.206.15.59) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Fri, 30 Sep 2022 11:04:04 +0200 Received: from localhost.localdomain (10.69.192.58) by lhrpeml500003.china.huawei.com (7.191.162.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Fri, 30 Sep 2022 10:04:01 +0100 From: John Garry To: , , , CC: , , , , , , , , John Garry Subject: [PATCH v2 6/6] scsi: mvsas: Use sas_task_find_rq() for tagging Date: Fri, 30 Sep 2022 16:56:24 +0800 Message-ID: <1664528184-162714-7-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1664528184-162714-1-git-send-email-john.garry@huawei.com> References: <1664528184-162714-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) To lhrpeml500003.china.huawei.com (7.191.162.67) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The request associated with a scsi command coming from the block layer has a unique tag, so use that when possible for getting a slot. Unfortunately we don't support reserved commands in the SCSI midlayer yet. As such, SMP tasks - as an example - will not have a request associated, so in the interim continue to manage those tags for that type of sas_task internally. We reserve an arbitrary 4 tags for these internal tags. Indeed, we already decrement MVS_RSVD_SLOTS by 2 for the shost can_queue when flag MVF_FLAG_SOC is set. This change was made in commit 20b09c2992fef ("[PATCH] [SCSI] mvsas: add support for 94xx; layout change; bug fixes"), but what those 2 slots are used for is not obvious. Also make the tag management functions static, where possible. Signed-off-by: John Garry --- drivers/scsi/mvsas/mv_defs.h | 1 + drivers/scsi/mvsas/mv_init.c | 9 +++++---- drivers/scsi/mvsas/mv_sas.c | 38 ++++++++++++++++++++++++------------ drivers/scsi/mvsas/mv_sas.h | 7 +------ 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/drivers/scsi/mvsas/mv_defs.h b/drivers/scsi/mvsas/mv_defs.h index 7123a2efbf58..8ef174cd4d37 100644 --- a/drivers/scsi/mvsas/mv_defs.h +++ b/drivers/scsi/mvsas/mv_defs.h @@ -40,6 +40,7 @@ enum driver_configuration { MVS_ATA_CMD_SZ =3D 96, /* SATA command table buffer size */ MVS_OAF_SZ =3D 64, /* Open address frame buffer size */ MVS_QUEUE_SIZE =3D 64, /* Support Queue depth */ + MVS_RSVD_SLOTS =3D 4, MVS_SOC_CAN_QUEUE =3D MVS_SOC_SLOTS - 2, }; =20 diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c index c85fb812ad43..cfe84473a515 100644 --- a/drivers/scsi/mvsas/mv_init.c +++ b/drivers/scsi/mvsas/mv_init.c @@ -142,7 +142,7 @@ static void mvs_free(struct mvs_info *mvi) scsi_host_put(mvi->shost); list_for_each_entry(mwq, &mvi->wq_list, entry) cancel_delayed_work(&mwq->work_q); - kfree(mvi->tags); + kfree(mvi->rsvd_tags); kfree(mvi); } =20 @@ -284,7 +284,6 @@ static int mvs_alloc(struct mvs_info *mvi, struct Scsi_= Host *shost) printk(KERN_DEBUG "failed to create dma pool %s.\n", pool_name); goto err_out; } - mvi->tags_num =3D slot_nr; =20 return 0; err_out: @@ -367,8 +366,8 @@ static struct mvs_info *mvs_pci_alloc(struct pci_dev *p= dev, mvi->sas =3D sha; mvi->shost =3D shost; =20 - mvi->tags =3D kzalloc(MVS_CHIP_SLOT_SZ>>3, GFP_KERNEL); - if (!mvi->tags) + mvi->rsvd_tags =3D bitmap_zalloc(MVS_RSVD_SLOTS, GFP_KERNEL); + if (!mvi->rsvd_tags) goto err_out; =20 if (MVS_CHIP_DISP->chip_ioremap(mvi)) @@ -469,6 +468,8 @@ static void mvs_post_sas_ha_init(struct Scsi_Host *sho= st, else can_queue =3D MVS_CHIP_SLOT_SZ; =20 + can_queue -=3D MVS_RSVD_SLOTS; + shost->sg_tablesize =3D min_t(u16, SG_ALL, MVS_MAX_SG); shost->can_queue =3D can_queue; mvi->shost->cmd_per_lun =3D MVS_QUEUE_SIZE; diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index 0810e6c930e1..00b3a2781d21 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c @@ -20,33 +20,39 @@ static int mvs_find_tag(struct mvs_info *mvi, struct sa= s_task *task, u32 *tag) return 0; } =20 -void mvs_tag_clear(struct mvs_info *mvi, u32 tag) +static void mvs_tag_clear(struct mvs_info *mvi, u32 tag) { - void *bitmap =3D mvi->tags; + void *bitmap =3D mvi->rsvd_tags; clear_bit(tag, bitmap); } =20 -void mvs_tag_free(struct mvs_info *mvi, u32 tag) +static void mvs_tag_free(struct mvs_info *mvi, u32 tag) { + if (tag < mvi->shost->can_queue) + return; + + tag -=3D mvi->shost->can_queue; + mvs_tag_clear(mvi, tag); } =20 -void mvs_tag_set(struct mvs_info *mvi, unsigned int tag) +static void mvs_tag_set(struct mvs_info *mvi, unsigned int tag) { - void *bitmap =3D mvi->tags; + void *bitmap =3D mvi->rsvd_tags; set_bit(tag, bitmap); } =20 -inline int mvs_tag_alloc(struct mvs_info *mvi, u32 *tag_out) +static int mvs_tag_alloc(struct mvs_info *mvi, u32 *tag_out) { unsigned int index, tag; - void *bitmap =3D mvi->tags; + void *bitmap =3D mvi->rsvd_tags; =20 - index =3D find_first_zero_bit(bitmap, mvi->tags_num); + index =3D find_first_zero_bit(bitmap, MVS_RSVD_SLOTS); tag =3D index; - if (tag >=3D mvi->tags_num) + if (tag >=3D MVS_RSVD_SLOTS) return -SAS_QUEUE_FULL; mvs_tag_set(mvi, tag); + tag +=3D mvi->shost->can_queue; *tag_out =3D tag; return 0; } @@ -696,6 +702,7 @@ static int mvs_task_prep(struct sas_task *task, struct = mvs_info *mvi, int is_tmf struct mvs_task_exec_info tei; struct mvs_slot_info *slot; u32 tag =3D 0xdeadbeef, n_elem =3D 0; + struct request *rq; int rc =3D 0; =20 if (!dev->port) { @@ -760,9 +767,14 @@ static int mvs_task_prep(struct sas_task *task, struct= mvs_info *mvi, int is_tmf n_elem =3D task->num_scatter; } =20 - rc =3D mvs_tag_alloc(mvi, &tag); - if (rc) - goto err_out; + rq =3D sas_task_find_rq(task); + if (rq) { + tag =3D rq->tag; + } else { + rc =3D mvs_tag_alloc(mvi, &tag); + if (rc) + goto err_out; + } =20 slot =3D &mvi->slot_info[tag]; =20 @@ -857,7 +869,7 @@ int mvs_queue_command(struct sas_task *task, gfp_t gfp_= flags) static void mvs_slot_free(struct mvs_info *mvi, u32 rx_desc) { u32 slot_idx =3D rx_desc & RXQ_SLOT_MASK; - mvs_tag_clear(mvi, slot_idx); + mvs_tag_free(mvi, slot_idx); } =20 static void mvs_slot_task_free(struct mvs_info *mvi, struct sas_task *task, diff --git a/drivers/scsi/mvsas/mv_sas.h b/drivers/scsi/mvsas/mv_sas.h index fe57665bdb50..68df771e2975 100644 --- a/drivers/scsi/mvsas/mv_sas.h +++ b/drivers/scsi/mvsas/mv_sas.h @@ -370,8 +370,7 @@ struct mvs_info { u32 chip_id; const struct mvs_chip_info *chip; =20 - int tags_num; - unsigned long *tags; + unsigned long *rsvd_tags; /* further per-slot information */ struct mvs_phy phy[MVS_MAX_PHYS]; struct mvs_port port[MVS_MAX_PHYS]; @@ -424,10 +423,6 @@ struct mvs_task_exec_info { =20 /******************** function prototype *********************/ void mvs_get_sas_addr(void *buf, u32 buflen); -void mvs_tag_clear(struct mvs_info *mvi, u32 tag); -void mvs_tag_free(struct mvs_info *mvi, u32 tag); -void mvs_tag_set(struct mvs_info *mvi, unsigned int tag); -int mvs_tag_alloc(struct mvs_info *mvi, u32 *tag_out); void mvs_iounmap(void __iomem *regs); int mvs_ioremap(struct mvs_info *mvi, int bar, int bar_ex); void mvs_phys_reset(struct mvs_info *mvi, u32 phy_mask, int hard); --=20 2.35.3