public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v8 00/28] Optimize the hot path in the UFS driver
@ 2025-10-31 20:39 Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 01/28] scsi: core: Support allocating reserved commands Bart Van Assche
                   ` (30 more replies)
  0 siblings, 31 replies; 63+ messages in thread
From: Bart Van Assche @ 2025-10-31 20:39 UTC (permalink / raw)
  To: Martin K . Petersen; +Cc: linux-scsi, Bart Van Assche

Hi Martin,

This patch series optimizes the hot path of the UFS driver by making
struct scsi_cmnd and struct ufshcd_lrb adjacent. Making these two data
structures adjacent is realized as follows:

@@ -9040,6 +9046,7 @@ static const struct scsi_host_template ufshcd_driver_template = {
     .name           = UFSHCD,
     .proc_name      = UFSHCD,
     .map_queues     = ufshcd_map_queues,
+    .cmd_size       = sizeof(struct ufshcd_lrb),
     .init_cmd_priv  = ufshcd_init_cmd_priv,
     .queuecommand   = ufshcd_queuecommand,
     .mq_poll        = ufshcd_poll,

The following changes had to be made prior to making these two data
structures adjacent:
* Add support for driver-internal and reserved commands in the SCSI core.
* Instead of making the reserved command slot (hba->reserved_slot)
  invisible to the SCSI core, let the SCSI core allocate a reserved command.
* Remove all UFS data structure members that are no longer needed
  because struct scsi_cmnd and struct ufshcd_lrb are now adjacent
* Call ufshcd_init_lrb() from inside the code for queueing a command instead of
  calling this function before I/O starts. This is necessary because
  ufshcd_memory_alloc() allocates fewer instances than the block layer
  allocates requests. See also the following code in the block layer
  core:

    if (blk_mq_init_request(set, hctx->fq->flush_rq, hctx_idx,
                hctx->numa_node))

  Although the UFS driver could be modified such that ufshcd_init_lrb()
  is called from ufshcd_init_cmd_priv(), realizing this would require
  moving the memory allocations that happen from inside
  ufshcd_memory_alloc() into ufshcd_init_cmd_priv(). That would make
  this patch series even larger. Although ufshcd_init_lrb() is called for each
  command, the benefits of reduced indirection and better cache efficiency
  outweigh the small overhead of per-command lrb initialization.
* ufshcd_add_scsi_host() happens now before any device management
  commands are submitted. This change is necessary because this patch
  makes device management command allocation happen when the SCSI host
  is allocated.
* Allocate as many command slots as the host controller supports. Decrease
  host->cmds_per_lun if necessary once it is clear whether or not the UFS
  device supports less command slots than the host controller.

Please consider this patch series for the next merge window.

Thanks,

Bart.

Changes compared to v7:
 - Fixed a bug in __ufshcd_setup_cmd() that could cause encryption to be
   enabled for device management commands. The difference between v7 and v8
   is as follows:

--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2952,6 +2952,7 @@ static void __ufshcd_setup_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd,
 	memset(lrbp->ucd_req_ptr, 0, sizeof(*lrbp->ucd_req_ptr));
 
 	lrbp->lun = lun;
-	ufshcd_prepare_lrbp_crypto(cmd ? scsi_cmd_to_rq(cmd) : NULL, lrbp);
+	ufshcd_prepare_lrbp_crypto(ufshcd_is_scsi_cmd(cmd) ?
+				   scsi_cmd_to_rq(cmd) : NULL, lrbp);
 }
 
Changes compared to v6:
 - Renamed scsi_get_pseudo_dev() into scsi_get_pseudo_sdev().
 - Improved variable names and source code comments in the scsi_debug patch.
 - Removed scsi_alloc_request_hctx().
 - Fixed two error paths in the UFSHCI driver that skipped a
  ufshcd_put_dev_mgmt_cmd() call.

Changes compared to v5:
 - Removed the "|| sht->queue_reserved_command" test from
   scsi_add_host_with_dma().
 - Removed "WARN_ON_ONCE" from "WARN_ON_ONCE(!sdev->budget_map.map)" in
   scsi_change_queue_depth().
 - Removed "if (WARN_ON_ONCE(!sdev->budget_map.map)) return -EINVAL;" from
   scsi_realloc_sdev_budget_map().
 - Simplified and improved the scsi_debug abort implementation.
 - Removed the scsi_device_is_pseudo_dev() declaration from
   drivers/scsi/scsi_priv.h.
 - Fixed ufshcd_get_hba_mac(): "Failed to get mac" is no longer reported if the
   function succeeds.
 - In the UFS driver, set .nr_reserved_cmds in the SCSI host template instead of
   in ufshcd_init().

Changes compared to v4:
 - Dropped the scsi_execute_cmd() changes.
 - Restored patch "scsi: core: Add scsi_{get,put}_internal_cmd() helpers".
 - Switched back from scsi_execute_cmd() to blk_execute_rq() for submitting
   device management commands in the UFS driver.
 - As suggested by John Garry, modified the scsi_debug patch such that aborting
   a SCSI command happens by submitting a reserved command.

Changes compared to v3:
 - Fixed a spelling error in patch 1 and left out a superfluous if-statement.
 - Left out scsi_host_template.alloc_pseudo_sdev and allocate a pseudo SCSI
   device if either nr_reserved_cmds > 0 or .queue_reserved_commands has been
   set.
 - Left out the 'pseudo_sdev' local variable from scsi_forget_host().
 - Removed a backwards jump from scsi_get_pseudo_dev().
 - Included a bug fix for synchronous scanning.
 - Skip scsi_track_queue_full() and scsi_handle_queue_ramp_up() for pseudo SCSI
   devices.
 - Extended the scsi_execute_rq() functionality.
 - Use scsi_execute_rq() for submitting reserved commands instead of
   blk_execute_rq().
 - Dropped the patch that introduces scsi_get_internal_cmd() and
   scsi_put_internal_cmd().

Changes compared to v2:
 - Removed scsi_host_update_can_queue() and also the UFS driver refactoring
   patches that were introduced to support this call.
 - Added .queue_reserved_command(). Added ufshcd_queue_reserved_command().
 - Removed a BUG_ON() statement from ufshcd_get_dev_mgmt_cmd().
 - Modified and renamed ufshcd_mcq_decide_queue_depth().

Changes compared to v1:
 - Left out the kernel patches related to support for const SCSI command
   arguments.
 - Added SCSI core patches for allocating a pseudo SCSI device and reserved
   command support.
 - Added several kernel patches to switch the UFS driver from a hardcoded
   reserved slot to calling scsi_get_internal_cmd().
 - Enable .alloc_pseudo_sdev in the scsi_debug driver.

Bart Van Assche (24):
  scsi: core: Move two statements
  scsi: core: Make the budget map optional
  scsi_debug: Abort SCSI commands via an internal command
  ufs: core: Move an assignment in ufshcd_mcq_process_cqe()
  ufs: core: Change the type of one ufshcd_add_cmd_upiu_trace() argument
  ufs: core: Only call ufshcd_add_command_trace() for SCSI commands
  ufs: core: Change the type of one ufshcd_add_command_trace() argument
  ufs: core: Change the type of one ufshcd_send_command() argument
  ufs: core: Only call ufshcd_should_inform_monitor() for SCSI commands
  ufs: core: Change the monitor function argument types
  ufs: core: Rework ufshcd_mcq_compl_pending_transfer()
  ufs: core: Rework ufshcd_eh_device_reset_handler()
  ufs: core: Rework the SCSI host queue depth calculation code
  ufs: core: Allocate the SCSI host earlier
  ufs: core: Call ufshcd_init_lrb() later
  ufs: core: Use hba->reserved_slot
  ufs: core: Make the reserved slot a reserved request
  ufs: core: Do not clear driver-private command data
  ufs: core: Optimize the hot path
  ufs: core: Pass a SCSI pointer instead of an LRB pointer
  ufs: core: Remove the ufshcd_lrb task_tag member
  ufs: core: Make blk_mq_tagset_busy_iter() skip reserved requests
  ufs: core: Move code out of ufshcd_wait_for_dev_cmd()
  ufs: core: Switch to scsi_get_internal_cmd()

Hannes Reinecke (3):
  scsi: core: Support allocating reserved commands
  scsi: core: Support allocating a pseudo SCSI device
  scsi: core: Add scsi_{get,put}_internal_cmd() helpers

John Garry (1):
  scsi: core: Introduce .queue_reserved_command()

 drivers/scsi/hosts.c             |  15 +
 drivers/scsi/scsi.c              |  12 +-
 drivers/scsi/scsi_debug.c        | 116 ++++-
 drivers/scsi/scsi_error.c        |   3 +
 drivers/scsi/scsi_lib.c          | 104 +++-
 drivers/scsi/scsi_priv.h         |   1 +
 drivers/scsi/scsi_scan.c         |  74 ++-
 drivers/scsi/scsi_sysfs.c        |   5 +-
 drivers/ufs/core/ufs-mcq.c       |  56 +--
 drivers/ufs/core/ufshcd-crypto.h |  18 +-
 drivers/ufs/core/ufshcd-priv.h   |  20 +-
 drivers/ufs/core/ufshcd.c        | 800 ++++++++++++++++---------------
 include/scsi/scsi_device.h       |  20 +
 include/scsi/scsi_host.h         |  33 +-
 include/ufs/ufshcd.h             |  12 -
 15 files changed, 815 insertions(+), 474 deletions(-)


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

end of thread, other threads:[~2025-12-17 17:29 UTC | newest]

Thread overview: 63+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 01/28] scsi: core: Support allocating reserved commands Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 02/28] scsi: core: Move two statements Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 03/28] scsi: core: Make the budget map optional Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 04/28] scsi: core: Support allocating a pseudo SCSI device Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 05/28] scsi: core: Introduce .queue_reserved_command() Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 06/28] scsi: core: Add scsi_{get,put}_internal_cmd() helpers Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 07/28] scsi_debug: Abort SCSI commands via an internal command Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 08/28] ufs: core: Move an assignment in ufshcd_mcq_process_cqe() Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 09/28] ufs: core: Change the type of one ufshcd_add_cmd_upiu_trace() argument Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 10/28] ufs: core: Only call ufshcd_add_command_trace() for SCSI commands Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 11/28] ufs: core: Change the type of one ufshcd_add_command_trace() argument Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 12/28] ufs: core: Change the type of one ufshcd_send_command() argument Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 13/28] ufs: core: Only call ufshcd_should_inform_monitor() for SCSI commands Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 14/28] ufs: core: Change the monitor function argument types Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 15/28] ufs: core: Rework ufshcd_mcq_compl_pending_transfer() Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 16/28] ufs: core: Rework ufshcd_eh_device_reset_handler() Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 17/28] ufs: core: Rework the SCSI host queue depth calculation code Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 18/28] ufs: core: Allocate the SCSI host earlier Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 19/28] ufs: core: Call ufshcd_init_lrb() later Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 20/28] ufs: core: Use hba->reserved_slot Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request Bart Van Assche
2025-11-14 10:12   ` Marek Szyprowski
2025-11-14 17:32     ` André Draszik
2025-11-14 18:39       ` Bart Van Assche
2025-11-14 19:11         ` Marek Szyprowski
2025-11-16 15:40         ` David Heidelberg
2025-11-16 22:30           ` Bart Van Assche
2025-11-16 22:45             ` David Heidelberg
2025-11-27 16:59   ` Manivannan Sadhasivam
2025-11-29  2:31     ` Bart Van Assche
2025-11-29  2:51       ` Manivannan Sadhasivam
2025-12-02  1:29         ` Bart Van Assche
2025-12-02  4:46           ` Manivannan Sadhasivam
2025-12-02  7:37             ` Bart Van Assche
2025-12-02  8:51               ` Manivannan Sadhasivam
2025-12-02 16:03                 ` Bart Van Assche
2025-12-02 16:32                   ` Manivannan Sadhasivam
2025-12-02 20:03                     ` Bart Van Assche
2025-12-03  0:56                   ` Roger Shimizu
2025-12-03  5:46                     ` Bart Van Assche
2025-12-03 16:47                       ` Nitin Rawat
2025-12-03 18:27                         ` Bart Van Assche
2025-12-03 19:43                           ` Roger Shimizu
2025-12-03 21:32                             ` Bart Van Assche
2025-12-03 22:40                       ` Nitin Rawat
2025-12-03 23:26                         ` Bart Van Assche
2025-12-04 14:36                           ` Nitin Rawat
2025-12-04 17:06                             ` Bart Van Assche
2025-12-16 20:53                             ` Bart Van Assche
2025-12-17 17:29                               ` Nitin Rawat
2025-12-02  8:12           ` Roger Shimizu
2025-10-31 20:39 ` [PATCH v8 22/28] ufs: core: Do not clear driver-private command data Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 23/28] ufs: core: Optimize the hot path Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 24/28] ufs: core: Pass a SCSI pointer instead of an LRB pointer Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 25/28] ufs: core: Remove the ufshcd_lrb task_tag member Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 26/28] ufs: core: Make blk_mq_tagset_busy_iter() skip reserved requests Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 27/28] ufs: core: Move code out of ufshcd_wait_for_dev_cmd() Bart Van Assche
2025-10-31 20:39 ` [PATCH v8 28/28] ufs: core: Switch to scsi_get_internal_cmd() Bart Van Assche
2025-11-06 17:00 ` [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
2025-11-06 18:23   ` Martin K. Petersen
2025-11-12 22:11 ` Martin K. Petersen
2025-11-20  4:15 ` Martin K. Petersen

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