linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/30] Optimize the hot path in the UFS driver
@ 2025-08-11 17:34 Bart Van Assche
  2025-08-11 17:34 ` [PATCH v2 01/30] scsi: core: Support allocating reserved commands Bart Van Assche
                   ` (30 more replies)
  0 siblings, 31 replies; 59+ messages in thread
From: Bart Van Assche @ 2025-08-11 17:34 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 ufshcd_queuecommand() 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.
* Start with allocating 32 command slots and increase this number later
  after it is clear whether or not the UFS device supports more than 32
  command slots. Introduce scsi_host_update_can_queue() to support this
  approach.

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 (27):
  scsi: core: Do not allocate a budget token for reserved commands
  scsi: core: Introduce scsi_host_update_can_queue()
  scsi_debug: Set .alloc_pseudo_sdev
  ufs: core: Move an assignment
  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: Cache the DMA buffer sizes
  ufs: core: Add an argument to ufshcd_mcq_decide_queue_depth()
  ufs: core: Add an argument to ufshcd_alloc_mcq()
  ufs: core: Call ufshcd_mcq_init() once
  ufs: core: Allocate the SCSI host earlier
  ufs: core: Make ufshcd_mcq_init() independent of hba->nutrs
  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: Remove the ufshcd_lrb task_tag member
  ufs: core: Initialize the 'hwq' variable earlier
  ufs: core: Make blk_mq_tagset_busy_iter() skip reserved requests
  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

 drivers/scsi/hosts.c             |  11 +
 drivers/scsi/scsi.c              |  52 +-
 drivers/scsi/scsi_debug.c        |   1 +
 drivers/scsi/scsi_lib.c          |  97 +++-
 drivers/scsi/scsi_priv.h         |   2 +
 drivers/scsi/scsi_scan.c         |  70 ++-
 drivers/scsi/scsi_sysfs.c        |   4 +-
 drivers/ufs/core/ufs-mcq.c       |  50 +-
 drivers/ufs/core/ufshcd-crypto.h |  18 +-
 drivers/ufs/core/ufshcd-priv.h   |  20 +-
 drivers/ufs/core/ufshcd.c        | 845 ++++++++++++++++---------------
 include/scsi/scsi_cmnd.h         |   2 +
 include/scsi/scsi_device.h       |  23 +
 include/scsi/scsi_host.h         |  33 +-
 include/ufs/ufshcd.h             |  17 +-
 15 files changed, 783 insertions(+), 462 deletions(-)


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

end of thread, other threads:[~2025-08-21 18:20 UTC | newest]

Thread overview: 59+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-11 17:34 [PATCH v2 00/30] Optimize the hot path in the UFS driver Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 01/30] scsi: core: Support allocating reserved commands Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 02/30] scsi: core: Support allocating a pseudo SCSI device Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 03/30] scsi: core: Do not allocate a budget token for reserved commands Bart Van Assche
2025-08-18 12:23   ` Hannes Reinecke
2025-08-18 13:16     ` John Garry
2025-08-18 13:21       ` Hannes Reinecke
2025-08-18 15:58         ` Bart Van Assche
2025-08-19  6:34           ` Hannes Reinecke
2025-08-19 19:49             ` Bart Van Assche
2025-08-20  6:54               ` Hannes Reinecke
2025-08-20 17:53                 ` Bart Van Assche
2025-08-21  6:42                   ` Hannes Reinecke
2025-08-21 15:54                     ` Bart Van Assche
2025-08-18 16:01     ` Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 04/30] scsi: core: Add scsi_{get,put}_internal_cmd() helpers Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 05/30] scsi: core: Introduce scsi_host_update_can_queue() Bart Van Assche
2025-08-13  9:47   ` John Garry
2025-08-13 15:23     ` Bart Van Assche
2025-08-14  8:24       ` John Garry
2025-08-14 16:17         ` Bart Van Assche
2025-08-14 17:03           ` John Garry
2025-08-15 17:13             ` Bart Van Assche
2025-08-18 13:29   ` Hannes Reinecke
2025-08-18 16:05     ` Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 06/30] scsi_debug: Set .alloc_pseudo_sdev Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 07/30] ufs: core: Move an assignment Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 08/30] ufs: core: Change the type of one ufshcd_add_cmd_upiu_trace() argument Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 09/30] ufs: core: Only call ufshcd_add_command_trace() for SCSI commands Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 10/30] ufs: core: Change the type of one ufshcd_add_command_trace() argument Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 11/30] ufs: core: Change the type of one ufshcd_send_command() argument Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 12/30] ufs: core: Only call ufshcd_should_inform_monitor() for SCSI commands Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 13/30] ufs: core: Change the monitor function argument types Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 14/30] ufs: core: Rework ufshcd_mcq_compl_pending_transfer() Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 15/30] ufs: core: Rework ufshcd_eh_device_reset_handler() Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 16/30] ufs: core: Cache the DMA buffer sizes Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 17/30] ufs: core: Add an argument to ufshcd_mcq_decide_queue_depth() Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 18/30] ufs: core: Add an argument to ufshcd_alloc_mcq() Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 19/30] ufs: core: Call ufshcd_mcq_init() once Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 20/30] ufs: core: Allocate the SCSI host earlier Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 21/30] ufs: core: Make ufshcd_mcq_init() independent of hba->nutrs Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 22/30] ufs: core: Call ufshcd_init_lrb() later Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 23/30] ufs: core: Use hba->reserved_slot Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 24/30] ufs: core: Make the reserved slot a reserved request Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 25/30] ufs: core: Do not clear driver-private command data Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 26/30] ufs: core: Optimize the hot path Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 27/30] ufs: core: Remove the ufshcd_lrb task_tag member Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 28/30] ufs: core: Initialize the 'hwq' variable earlier Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 29/30] ufs: core: Make blk_mq_tagset_busy_iter() skip reserved requests Bart Van Assche
2025-08-11 17:34 ` [PATCH v2 30/30] ufs: core: Switch to scsi_get_internal_cmd() Bart Van Assche
2025-08-13  9:49 ` [PATCH v2 00/30] Optimize the hot path in the UFS driver John Garry
2025-08-13 15:06   ` Bart Van Assche
2025-08-14  8:40     ` John Garry
2025-08-14 16:51       ` Bart Van Assche
2025-08-15  7:50         ` John Garry
2025-08-15 17:30           ` Bart Van Assche
2025-08-16  8:37             ` John Garry
2025-08-18 16:25               ` Bart Van Assche
2025-08-21 18:20           ` Bart Van Assche

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).