From: Bart Van Assche <bvanassche@acm.org>
To: "Martin K . Petersen" <martin.petersen@oracle.com>
Cc: linux-scsi@vger.kernel.org, Bart Van Assche <bvanassche@acm.org>,
"James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>,
Peter Wang <peter.wang@mediatek.com>,
Alok Tiwari <alok.a.tiwari@oracle.com>,
Avri Altman <avri.altman@sandisk.com>,
Chenyuan Yang <chenyuan0y@gmail.com>,
"ping.gao" <ping.gao@samsung.com>, Bean Huo <beanhuo@micron.com>,
Can Guo <quic_cang@quicinc.com>,
Manivannan Sadhasivam <mani@kernel.org>,
"Bao D. Nguyen" <quic_nguyenb@quicinc.com>,
Ziqi Chen <quic_ziqichen@quicinc.com>,
Adrian Hunter <adrian.hunter@intel.com>
Subject: [PATCH v7 17/28] ufs: core: Rework the SCSI host queue depth calculation code
Date: Thu, 30 Oct 2025 12:36:16 -0700 [thread overview]
Message-ID: <20251030193720.871635-18-bvanassche@acm.org> (raw)
In-Reply-To: <20251030193720.871635-1-bvanassche@acm.org>
Prepare for allocating the SCSI host earlier by making the SCSI host
queue depth independent of the queue depth supported by the UFS device.
This patch may increase the queue depth of the UFS SCSI host.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
drivers/ufs/core/ufs-mcq.c | 25 ++++++-------------------
drivers/ufs/core/ufshcd-priv.h | 2 +-
drivers/ufs/core/ufshcd.c | 17 +++++++++++++++--
3 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index bae35d0f99c5..00b043b54419 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -134,17 +134,15 @@ unsigned int ufshcd_mcq_queue_cfg_addr(struct ufs_hba *hba)
EXPORT_SYMBOL_GPL(ufshcd_mcq_queue_cfg_addr);
/**
- * ufshcd_mcq_decide_queue_depth - decide the queue depth
+ * ufshcd_get_hba_mac - Maximum number of commands supported by the host
+ * controller.
* @hba: per adapter instance
*
- * Return: queue-depth on success, non-zero on error
+ * Return: queue depth on success; negative upon error.
*
- * MAC - Max. Active Command of the Host Controller (HC)
- * HC wouldn't send more than this commands to the device.
- * Calculates and adjusts the queue depth based on the depth
- * supported by the HC and ufs device.
+ * MAC = Maximum number of Active Commands supported by the Host Controller.
*/
-int ufshcd_mcq_decide_queue_depth(struct ufs_hba *hba)
+int ufshcd_get_hba_mac(struct ufs_hba *hba)
{
int mac;
@@ -162,18 +160,7 @@ int ufshcd_mcq_decide_queue_depth(struct ufs_hba *hba)
mac = hba->vops->get_hba_mac(hba);
}
if (mac < 0)
- goto err;
-
- WARN_ON_ONCE(!hba->dev_info.bqueuedepth);
- /*
- * max. value of bqueuedepth = 256, mac is host dependent.
- * It is mandatory for UFS device to define bQueueDepth if
- * shared queuing architecture is enabled.
- */
- return min_t(int, mac, hba->dev_info.bqueuedepth);
-
-err:
- dev_err(hba->dev, "Failed to get mac, err=%d\n", mac);
+ dev_err(hba->dev, "Failed to get mac, err=%d\n", mac);
return mac;
}
diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
index 1f0d38aa37f9..749c0ab2a4ca 100644
--- a/drivers/ufs/core/ufshcd-priv.h
+++ b/drivers/ufs/core/ufshcd-priv.h
@@ -67,7 +67,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
struct cq_entry *cqe);
int ufshcd_mcq_init(struct ufs_hba *hba);
void ufshcd_mcq_disable(struct ufs_hba *hba);
-int ufshcd_mcq_decide_queue_depth(struct ufs_hba *hba);
+int ufshcd_get_hba_mac(struct ufs_hba *hba);
int ufshcd_mcq_memory_alloc(struct ufs_hba *hba);
struct ufs_hw_queue *ufshcd_mcq_req_to_hwq(struct ufs_hba *hba,
struct request *req);
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index f64192c672e2..93f2853ff5df 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -8466,10 +8466,11 @@ static void ufs_init_rtc(struct ufs_hba *hba, u8 *desc_buf)
static int ufs_get_device_desc(struct ufs_hba *hba)
{
+ struct ufs_dev_info *dev_info = &hba->dev_info;
+ struct Scsi_Host *shost = hba->host;
int err;
u8 model_index;
u8 *desc_buf;
- struct ufs_dev_info *dev_info = &hba->dev_info;
desc_buf = kzalloc(QUERY_DESC_MAX_SIZE, GFP_KERNEL);
if (!desc_buf) {
@@ -8497,6 +8498,18 @@ static int ufs_get_device_desc(struct ufs_hba *hba)
desc_buf[DEVICE_DESC_PARAM_SPEC_VER + 1];
dev_info->bqueuedepth = desc_buf[DEVICE_DESC_PARAM_Q_DPTH];
+ /*
+ * According to the UFS standard, the UFS device queue depth
+ * (bQueueDepth) must be in the range 1..255 if the shared queueing
+ * architecture is supported. bQueueDepth is zero if the shared queueing
+ * architecture is not supported.
+ */
+ if (dev_info->bqueuedepth)
+ shost->cmd_per_lun = min(hba->nutrs, dev_info->bqueuedepth) -
+ UFSHCD_NUM_RESERVED;
+ else
+ shost->cmd_per_lun = shost->can_queue;
+
dev_info->rtt_cap = desc_buf[DEVICE_DESC_PARAM_RTT_CAP];
dev_info->hid_sup = get_unaligned_be32(desc_buf +
@@ -8905,7 +8918,7 @@ static int ufshcd_alloc_mcq(struct ufs_hba *hba)
int ret;
int old_nutrs = hba->nutrs;
- ret = ufshcd_mcq_decide_queue_depth(hba);
+ ret = ufshcd_get_hba_mac(hba);
if (ret < 0)
return ret;
next prev parent reply other threads:[~2025-10-30 19:40 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-30 19:35 [PATCH v7 00/28] Optimize the hot path in the UFS driver Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 01/28] scsi: core: Support allocating reserved commands Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 02/28] scsi: core: Move two statements Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 03/28] scsi: core: Make the budget map optional Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 04/28] scsi: core: Support allocating a pseudo SCSI device Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 05/28] scsi: core: Introduce .queue_reserved_command() Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 06/28] scsi: core: Add scsi_{get,put}_internal_cmd() helpers Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 07/28] scsi_debug: Abort SCSI commands via an internal command Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 08/28] ufs: core: Move an assignment in ufshcd_mcq_process_cqe() Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 09/28] ufs: core: Change the type of one ufshcd_add_cmd_upiu_trace() argument Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 10/28] ufs: core: Only call ufshcd_add_command_trace() for SCSI commands Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 11/28] ufs: core: Change the type of one ufshcd_add_command_trace() argument Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 12/28] ufs: core: Change the type of one ufshcd_send_command() argument Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 13/28] ufs: core: Only call ufshcd_should_inform_monitor() for SCSI commands Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 14/28] ufs: core: Change the monitor function argument types Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 15/28] ufs: core: Rework ufshcd_mcq_compl_pending_transfer() Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 16/28] ufs: core: Rework ufshcd_eh_device_reset_handler() Bart Van Assche
2025-10-30 19:36 ` Bart Van Assche [this message]
2025-10-30 19:36 ` [PATCH v7 18/28] ufs: core: Allocate the SCSI host earlier Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 19/28] ufs: core: Call ufshcd_init_lrb() later Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 20/28] ufs: core: Use hba->reserved_slot Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 21/28] ufs: core: Make the reserved slot a reserved request Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 22/28] ufs: core: Do not clear driver-private command data Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 23/28] ufs: core: Optimize the hot path Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 24/28] ufs: core: Pass a SCSI pointer instead of an LRB pointer Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 25/28] ufs: core: Remove the ufshcd_lrb task_tag member Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 26/28] ufs: core: Make blk_mq_tagset_busy_iter() skip reserved requests Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 27/28] ufs: core: Move code out of ufshcd_wait_for_dev_cmd() Bart Van Assche
2025-10-30 19:36 ` [PATCH v7 28/28] ufs: core: Switch to scsi_get_internal_cmd() Bart Van Assche
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251030193720.871635-18-bvanassche@acm.org \
--to=bvanassche@acm.org \
--cc=James.Bottomley@HansenPartnership.com \
--cc=adrian.hunter@intel.com \
--cc=alok.a.tiwari@oracle.com \
--cc=avri.altman@sandisk.com \
--cc=beanhuo@micron.com \
--cc=chenyuan0y@gmail.com \
--cc=linux-scsi@vger.kernel.org \
--cc=mani@kernel.org \
--cc=martin.petersen@oracle.com \
--cc=peter.wang@mediatek.com \
--cc=ping.gao@samsung.com \
--cc=quic_cang@quicinc.com \
--cc=quic_nguyenb@quicinc.com \
--cc=quic_ziqichen@quicinc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox