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

* [PATCH v8 01/28] scsi: core: Support allocating reserved commands
  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 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 02/28] scsi: core: Move two statements Bart Van Assche
                   ` (29 subsequent siblings)
  30 siblings, 0 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, Hannes Reinecke, John Garry,
	James E.J. Bottomley

From: Hannes Reinecke <hare@suse.de>

Quite some drivers are using management commands internally. These
commands typically use the same tag pool as regular SCSI commands. Tags
for these management commands are set aside before allocating the
block-mq tag bitmap for regular SCSI commands. The block layer already
supports this via the reserved tag mechanism. Add a new field
'nr_reserved_cmds' to the SCSI host template to instruct the block layer
to set aside a tag space for these management commands by using reserved
tags. Exclude reserved commands from .can_queue because .can_queue is
visible in sysfs.

Signed-off-by: Hannes Reinecke <hare@suse.de>
[ bvanassche: modified patch title and patch description. Left out the
  following statements: "if (sht->nr_reserved_cmds)" and also
  "if (sdev->host->nr_reserved_cmds) flags |= BLK_MQ_REQ_RESERVED;". Moved
  nr_reserved_cmds declarations and statements close to the
  corresponding can_queue declarations and statements. See also
  https://lore.kernel.org/linux-scsi/20210503150333.130310-11-hare@suse.de/ ]
Reviewed-by: John Garry <john.g.garry@oracle.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/hosts.c     |  1 +
 drivers/scsi/scsi_lib.c  |  3 ++-
 include/scsi/scsi_host.h | 21 ++++++++++++++++++++-
 3 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index eb224a338fa2..8b7f5fafa9e0 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -436,6 +436,7 @@ struct Scsi_Host *scsi_host_alloc(const struct scsi_host_template *sht, int priv
 	shost->hostt = sht;
 	shost->this_id = sht->this_id;
 	shost->can_queue = sht->can_queue;
+	shost->nr_reserved_cmds = sht->nr_reserved_cmds;
 	shost->sg_tablesize = sht->sg_tablesize;
 	shost->sg_prot_tablesize = sht->sg_prot_tablesize;
 	shost->cmd_per_lun = sht->cmd_per_lun;
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index d7e42293b864..d52bbbe5a357 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2083,7 +2083,8 @@ int scsi_mq_setup_tags(struct Scsi_Host *shost)
 		tag_set->ops = &scsi_mq_ops_no_commit;
 	tag_set->nr_hw_queues = shost->nr_hw_queues ? : 1;
 	tag_set->nr_maps = shost->nr_maps ? : 1;
-	tag_set->queue_depth = shost->can_queue;
+	tag_set->queue_depth = shost->can_queue + shost->nr_reserved_cmds;
+	tag_set->reserved_tags = shost->nr_reserved_cmds;
 	tag_set->cmd_size = cmd_size;
 	tag_set->numa_node = dev_to_node(shost->dma_dev);
 	if (shost->hostt->tag_alloc_policy_rr)
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index f5a243261236..7b8f144ccf7d 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -375,10 +375,19 @@ struct scsi_host_template {
 	/*
 	 * This determines if we will use a non-interrupt driven
 	 * or an interrupt driven scheme.  It is set to the maximum number
-	 * of simultaneous commands a single hw queue in HBA will accept.
+	 * of simultaneous commands a single hw queue in HBA will accept
+	 * excluding internal commands.
 	 */
 	int can_queue;
 
+	/*
+	 * This determines how many commands the HBA will set aside
+	 * for internal commands. This number will be added to
+	 * @can_queue to calculate the maximum number of simultaneous
+	 * commands sent to the host.
+	 */
+	int nr_reserved_cmds;
+
 	/*
 	 * In many instances, especially where disconnect / reconnect are
 	 * supported, our host also has an ID on the SCSI bus.  If this is
@@ -611,7 +620,17 @@ struct Scsi_Host {
 	unsigned short max_cmd_len;
 
 	int this_id;
+
+	/*
+	 * Number of commands this host can handle at the same time.
+	 * This excludes reserved commands as specified by nr_reserved_cmds.
+	 */
 	int can_queue;
+	/*
+	 * Number of reserved commands to allocate, if any.
+	 */
+	unsigned int nr_reserved_cmds;
+
 	short cmd_per_lun;
 	short unsigned int sg_tablesize;
 	short unsigned int sg_prot_tablesize;

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

* [PATCH v8 02/28] scsi: core: Move two statements
  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 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 03/28] scsi: core: Make the budget map optional Bart Van Assche
                   ` (28 subsequent siblings)
  30 siblings, 0 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, John Garry, Hannes Reinecke,
	James E.J. Bottomley

Move two statements that will be needed for pseudo SCSI devices in front
of code that won't be needed for pseudo SCSI devices. No functionality
has been changed.

Reviewed-by: John Garry <john.g.garry@oracle.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/scsi_scan.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 3c6e089e80c3..de039efef290 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -347,6 +347,8 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,
 	kref_get(&sdev->host->tagset_refcnt);
 	sdev->request_queue = q;
 
+	scsi_sysfs_device_initialize(sdev);
+
 	depth = sdev->host->cmd_per_lun ?: 1;
 
 	/*
@@ -363,8 +365,6 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,
 
 	scsi_change_queue_depth(sdev, depth);
 
-	scsi_sysfs_device_initialize(sdev);
-
 	if (shost->hostt->sdev_init) {
 		ret = shost->hostt->sdev_init(sdev);
 		if (ret) {
@@ -1068,6 +1068,8 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
 
 	transport_configure_device(&sdev->sdev_gendev);
 
+	sdev->sdev_bflags = *bflags;
+
 	/*
 	 * No need to freeze the queue as it isn't reachable to anyone else yet.
 	 */
@@ -1113,7 +1115,6 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
 
 	sdev->max_queue_depth = sdev->queue_depth;
 	WARN_ON_ONCE(sdev->max_queue_depth > sdev->budget_map.depth);
-	sdev->sdev_bflags = *bflags;
 
 	/*
 	 * Ok, the device is now all set up, we can

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

* [PATCH v8 03/28] scsi: core: Make the budget map optional
  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 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 04/28] scsi: core: Support allocating a pseudo SCSI device Bart Van Assche
                   ` (27 subsequent siblings)
  30 siblings, 0 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, Hannes Reinecke, John Garry,
	Ming Lei, James E.J. Bottomley

Prepare for not allocating a budget map for pseudo SCSI devices by
checking whether a budget map has been allocated before using it.

Reviewed-by: Hannes Reinecke <hare@suse.de>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/scsi.c       | 5 +++++
 drivers/scsi/scsi_error.c | 3 +++
 drivers/scsi/scsi_lib.c   | 9 +++++++--
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 9a0f467264b3..589ae28b2c8b 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -216,6 +216,9 @@ int scsi_device_max_queue_depth(struct scsi_device *sdev)
  */
 int scsi_change_queue_depth(struct scsi_device *sdev, int depth)
 {
+	if (!sdev->budget_map.map)
+		return -EINVAL;
+
 	depth = min_t(int, depth, scsi_device_max_queue_depth(sdev));
 
 	if (depth > 0) {
@@ -255,6 +258,8 @@ EXPORT_SYMBOL(scsi_change_queue_depth);
  */
 int scsi_track_queue_full(struct scsi_device *sdev, int depth)
 {
+	if (!sdev->budget_map.map)
+		return 0;
 
 	/*
 	 * Don't let QUEUE_FULLs on the same
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 746ff6a1f309..87636068cd37 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -749,6 +749,9 @@ static void scsi_handle_queue_ramp_up(struct scsi_device *sdev)
 	const struct scsi_host_template *sht = sdev->host->hostt;
 	struct scsi_device *tmp_sdev;
 
+	if (!sdev->budget_map.map)
+		return;
+
 	if (!sht->track_queue_depth ||
 	    sdev->queue_depth >= sdev->max_queue_depth)
 		return;
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index d52bbbe5a357..53ff348b3a4c 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -396,7 +396,8 @@ void scsi_device_unbusy(struct scsi_device *sdev, struct scsi_cmnd *cmd)
 	if (starget->can_queue > 0)
 		atomic_dec(&starget->target_busy);
 
-	sbitmap_put(&sdev->budget_map, cmd->budget_token);
+	if (sdev->budget_map.map)
+		sbitmap_put(&sdev->budget_map, cmd->budget_token);
 	cmd->budget_token = -1;
 }
 
@@ -1360,6 +1361,9 @@ static inline int scsi_dev_queue_ready(struct request_queue *q,
 {
 	int token;
 
+	if (!sdev->budget_map.map)
+		return INT_MAX;
+
 	token = sbitmap_get(&sdev->budget_map);
 	if (token < 0)
 		return -1;
@@ -1749,7 +1753,8 @@ static void scsi_mq_put_budget(struct request_queue *q, int budget_token)
 {
 	struct scsi_device *sdev = q->queuedata;
 
-	sbitmap_put(&sdev->budget_map, budget_token);
+	if (sdev->budget_map.map)
+		sbitmap_put(&sdev->budget_map, budget_token);
 }
 
 /*

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

* [PATCH v8 04/28] scsi: core: Support allocating a pseudo SCSI device
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (2 preceding siblings ...)
  2025-10-31 20:39 ` [PATCH v8 03/28] scsi: core: Make the budget map optional Bart Van Assche
@ 2025-10-31 20:39 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 05/28] scsi: core: Introduce .queue_reserved_command() Bart Van Assche
                   ` (26 subsequent siblings)
  30 siblings, 0 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, Hannes Reinecke, John Garry,
	James E.J. Bottomley

From: Hannes Reinecke <hare@suse.de>

Allocate a pseudo SCSI device if 'nr_reserved_cmds' has been set. Pseudo
SCSI devices have the SCSI ID <max_id>:U64_MAX so they won't clash with
any devices the LLD might create. Pseudo SCSI devices are excluded from
scanning and will not show up in sysfs. Additionally, pseudo SCSI
devices are skipped by shost_for_each_device(). This prevents that the
SCSI error handler tries to submit a reset to a non-existent logical unit.

Do not allocate a budget map for pseudo SCSI devices since the
cmd_per_lun limit does not apply to pseudo SCSI devices.

Do not perform queue depth ramp up / ramp down for pseudo SCSI devices.

Pseudo SCSI devices will be used to send internal commands to a storage
device.

Reviewed-by: John Garry <john.g.garry@oracle.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
[ bvanassche: edited patch description / renamed host_sdev into
  pseudo_sdev / unexported scsi_get_host_dev() / modified error path in
  scsi_get_pseudo_dev() / skip pseudo devices in __scsi_iterate_devices()
  and also when calling sdev_init(), sdev_configure() and sdev_destroy().
  See also
  https://lore.kernel.org/linux-scsi/20211125151048.103910-2-hare@suse.de/ ]
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/hosts.c       |  8 +++++
 drivers/scsi/scsi.c        |  7 ++--
 drivers/scsi/scsi_priv.h   |  1 +
 drivers/scsi/scsi_scan.c   | 67 +++++++++++++++++++++++++++++++++++++-
 drivers/scsi/scsi_sysfs.c  |  5 ++-
 include/scsi/scsi_device.h | 16 +++++++++
 include/scsi/scsi_host.h   |  6 ++++
 7 files changed, 106 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 8b7f5fafa9e0..ad1476fb5035 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -307,6 +307,14 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
 	if (error)
 		goto out_del_dev;
 
+	if (shost->nr_reserved_cmds) {
+		shost->pseudo_sdev = scsi_get_pseudo_sdev(shost);
+		if (!shost->pseudo_sdev) {
+			error = -ENOMEM;
+			goto out_del_dev;
+		}
+	}
+
 	scsi_proc_host_add(shost);
 	scsi_autopm_put_host(shost);
 	return error;
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 589ae28b2c8b..76cdad063f7b 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -831,8 +831,11 @@ struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *shost,
 	spin_lock_irqsave(shost->host_lock, flags);
 	while (list->next != &shost->__devices) {
 		next = list_entry(list->next, struct scsi_device, siblings);
-		/* skip devices that we can't get a reference to */
-		if (!scsi_device_get(next))
+		/*
+		 * Skip pseudo devices and also devices we can't get a
+		 * reference to.
+		 */
+		if (!scsi_device_is_pseudo_dev(next) && !scsi_device_get(next))
 			break;
 		next = NULL;
 		list = list->next;
diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
index 5b2b19f5e8ec..d07ec15d6c00 100644
--- a/drivers/scsi/scsi_priv.h
+++ b/drivers/scsi/scsi_priv.h
@@ -135,6 +135,7 @@ extern int scsi_complete_async_scans(void);
 extern int scsi_scan_host_selected(struct Scsi_Host *, unsigned int,
 				   unsigned int, u64, enum scsi_scan_mode);
 extern void scsi_forget_host(struct Scsi_Host *);
+struct scsi_device *scsi_get_pseudo_sdev(struct Scsi_Host *);
 
 /* scsi_sysctl.c */
 #ifdef CONFIG_SYSCTL
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index de039efef290..7acbfcfc2172 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -349,6 +349,9 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,
 
 	scsi_sysfs_device_initialize(sdev);
 
+	if (scsi_device_is_pseudo_dev(sdev))
+		return sdev;
+
 	depth = sdev->host->cmd_per_lun ?: 1;
 
 	/*
@@ -1070,6 +1073,9 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
 
 	sdev->sdev_bflags = *bflags;
 
+	if (scsi_device_is_pseudo_dev(sdev))
+		return SCSI_SCAN_LUN_PRESENT;
+
 	/*
 	 * No need to freeze the queue as it isn't reachable to anyone else yet.
 	 */
@@ -1213,6 +1219,12 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget,
 	if (!sdev)
 		goto out;
 
+	if (scsi_device_is_pseudo_dev(sdev)) {
+		if (bflagsp)
+			*bflagsp = BLIST_NOLUN;
+		return SCSI_SCAN_LUN_PRESENT;
+	}
+
 	result = kmalloc(result_len, GFP_KERNEL);
 	if (!result)
 		goto out_free_sdev;
@@ -2084,12 +2096,65 @@ void scsi_forget_host(struct Scsi_Host *shost)
  restart:
 	spin_lock_irqsave(shost->host_lock, flags);
 	list_for_each_entry(sdev, &shost->__devices, siblings) {
-		if (sdev->sdev_state == SDEV_DEL)
+		if (scsi_device_is_pseudo_dev(sdev) ||
+		    sdev->sdev_state == SDEV_DEL)
 			continue;
 		spin_unlock_irqrestore(shost->host_lock, flags);
 		__scsi_remove_device(sdev);
 		goto restart;
 	}
 	spin_unlock_irqrestore(shost->host_lock, flags);
+
+	/*
+	 * Remove the pseudo device last since it may be needed during removal
+	 * of other SCSI devices.
+	 */
+	if (shost->pseudo_sdev)
+		__scsi_remove_device(shost->pseudo_sdev);
 }
 
+/**
+ * scsi_get_pseudo_sdev() - Attach a pseudo SCSI device to a SCSI host
+ * @shost: Host that needs a pseudo SCSI device
+ *
+ * Lock status: None assumed.
+ *
+ * Returns:     The scsi_device or NULL
+ *
+ * Notes:
+ *	Attach a single scsi_device to the Scsi_Host. The primary aim for this
+ *	device is to serve as a container from which SCSI commands can be
+ *	allocated. Each SCSI command will carry a command tag allocated by the
+ *	block layer. These SCSI commands can be used by the LLDD to send
+ *	internal or passthrough commands without having to manage tag allocation
+ *	inside the LLDD.
+ */
+struct scsi_device *scsi_get_pseudo_sdev(struct Scsi_Host *shost)
+{
+	struct scsi_device *sdev = NULL;
+	struct scsi_target *starget;
+
+	guard(mutex)(&shost->scan_mutex);
+
+	if (!scsi_host_scan_allowed(shost))
+		goto out;
+
+	starget = scsi_alloc_target(&shost->shost_gendev, 0, shost->max_id);
+	if (!starget)
+		goto out;
+
+	sdev = scsi_alloc_sdev(starget, U64_MAX, NULL);
+	if (!sdev) {
+		scsi_target_reap(starget);
+		goto put_target;
+	}
+
+	sdev->borken = 0;
+
+put_target:
+	/* See also the get_device(dev) call in scsi_alloc_target(). */
+	put_device(&starget->dev);
+
+out:
+	return sdev;
+}
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index 15ba493d2138..c37992147847 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -1406,6 +1406,9 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev)
 	int error;
 	struct scsi_target *starget = sdev->sdev_target;
 
+	if (WARN_ON_ONCE(scsi_device_is_pseudo_dev(sdev)))
+		return -EINVAL;
+
 	error = scsi_target_add(starget);
 	if (error)
 		return error;
@@ -1513,7 +1516,7 @@ void __scsi_remove_device(struct scsi_device *sdev)
 	kref_put(&sdev->host->tagset_refcnt, scsi_mq_free_tags);
 	cancel_work_sync(&sdev->requeue_work);
 
-	if (sdev->host->hostt->sdev_destroy)
+	if (!scsi_device_is_pseudo_dev(sdev) && sdev->host->hostt->sdev_destroy)
 		sdev->host->hostt->sdev_destroy(sdev);
 	transport_destroy_device(dev);
 
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index 4c106342c4ae..918631088711 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -589,6 +589,22 @@ static inline unsigned int sdev_id(struct scsi_device *sdev)
 #define scmd_id(scmd) sdev_id((scmd)->device)
 #define scmd_channel(scmd) sdev_channel((scmd)->device)
 
+/**
+ * scsi_device_is_pseudo_dev() - Whether a device is a pseudo SCSI device.
+ * @sdev: SCSI device to examine
+ *
+ * A pseudo SCSI device can be used to allocate SCSI commands but does not show
+ * up in sysfs. Additionally, the logical unit information in *@sdev is made up.
+ *
+ * This function tests the LUN number instead of comparing @sdev with
+ * @sdev->host->pseudo_sdev because this function may be called before
+ * @sdev->host->pseudo_sdev has been initialized.
+ */
+static inline bool scsi_device_is_pseudo_dev(struct scsi_device *sdev)
+{
+	return sdev->lun == U64_MAX;
+}
+
 /*
  * checks for positions of the SCSI state machine
  */
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index 7b8f144ccf7d..4f945a20d198 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -721,6 +721,12 @@ struct Scsi_Host {
 	/* ldm bits */
 	struct device		shost_gendev, shost_dev;
 
+	/*
+	 * A SCSI device structure used for sending internal commands to the
+	 * HBA. There is no corresponding logical unit inside the SCSI device.
+	 */
+	struct scsi_device *pseudo_sdev;
+
 	/*
 	 * Points to the transport data (if any) which is allocated
 	 * separately

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

* [PATCH v8 05/28] scsi: core: Introduce .queue_reserved_command()
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (3 preceding siblings ...)
  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 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 06/28] scsi: core: Add scsi_{get,put}_internal_cmd() helpers Bart Van Assche
                   ` (25 subsequent siblings)
  30 siblings, 0 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, John Garry, Hannes Reinecke,
	James E.J. Bottomley

From: John Garry <john.garry@huawei.com>

Reserved commands will be used by SCSI LLDs for submitting internal
commands. Since the SCSI host, target and device limits do not apply to
the reserved command use cases, bypass the SCSI host limit checks for
reserved commands. Introduce the .queue_reserved_command() callback for
reserved commands. Additionally, do not activate the SCSI error handler
if a reserved command fails such that reserved commands can be submitted
from inside the SCSI error handler.

Cc: Hannes Reinecke <hare@suse.de>
Signed-off-by: John Garry <john.garry@huawei.com>
[ bvanassche: modified patch title and patch description. Renamed
  .reserved_queuecommand() into .queue_reserved_command(). Changed
  the second argument of __blk_mq_end_request() from 0 into error
  code in the completion path if cmd->result != 0. Rewrote the
  scsi_queue_rq() changes. See also
  https://lore.kernel.org/linux-scsi/1666693096-180008-5-git-send-email-john.garry@huawei.com/ ]
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/hosts.c     |  6 +++++
 drivers/scsi/scsi_lib.c  | 54 ++++++++++++++++++++++++++++------------
 include/scsi/scsi_host.h |  6 +++++
 3 files changed, 50 insertions(+), 16 deletions(-)

diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index ad1476fb5035..e047747d4ecf 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -231,6 +231,12 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
 		goto fail;
 	}
 
+	if (shost->nr_reserved_cmds && !sht->queue_reserved_command) {
+		shost_printk(KERN_ERR, shost,
+			     "nr_reserved_cmds set but no method to queue\n");
+		goto fail;
+	}
+
 	/* Use min_t(int, ...) in case shost->can_queue exceeds SHRT_MAX */
 	shost->cmd_per_lun = min_t(int, shost->cmd_per_lun,
 				   shost->can_queue);
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 53ff348b3a4c..d4e874bbf2ea 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1534,6 +1534,14 @@ static void scsi_complete(struct request *rq)
 	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
 	enum scsi_disposition disposition;
 
+	if (blk_mq_is_reserved_rq(rq)) {
+		/* Only pass-through requests are supported in this code path. */
+		WARN_ON_ONCE(!blk_rq_is_passthrough(scsi_cmd_to_rq(cmd)));
+		scsi_mq_uninit_cmd(cmd);
+		__blk_mq_end_request(rq, scsi_result_to_blk_status(cmd->result));
+		return;
+	}
+
 	INIT_LIST_HEAD(&cmd->eh_entry);
 
 	atomic_inc(&cmd->device->iodone_cnt);
@@ -1823,25 +1831,31 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx,
 	WARN_ON_ONCE(cmd->budget_token < 0);
 
 	/*
-	 * If the device is not in running state we will reject some or all
-	 * commands.
+	 * Bypass the SCSI device, SCSI target and SCSI host checks for
+	 * reserved commands.
 	 */
-	if (unlikely(sdev->sdev_state != SDEV_RUNNING)) {
-		ret = scsi_device_state_check(sdev, req);
-		if (ret != BLK_STS_OK)
-			goto out_put_budget;
-	}
+	if (!blk_mq_is_reserved_rq(req)) {
+		/*
+		 * If the device is not in running state we will reject some or
+		 * all commands.
+		 */
+		if (unlikely(sdev->sdev_state != SDEV_RUNNING)) {
+			ret = scsi_device_state_check(sdev, req);
+			if (ret != BLK_STS_OK)
+				goto out_put_budget;
+		}
 
-	ret = BLK_STS_RESOURCE;
-	if (!scsi_target_queue_ready(shost, sdev))
-		goto out_put_budget;
-	if (unlikely(scsi_host_in_recovery(shost))) {
-		if (cmd->flags & SCMD_FAIL_IF_RECOVERING)
-			ret = BLK_STS_OFFLINE;
-		goto out_dec_target_busy;
+		ret = BLK_STS_RESOURCE;
+		if (!scsi_target_queue_ready(shost, sdev))
+			goto out_put_budget;
+		if (unlikely(scsi_host_in_recovery(shost))) {
+			if (cmd->flags & SCMD_FAIL_IF_RECOVERING)
+				ret = BLK_STS_OFFLINE;
+			goto out_dec_target_busy;
+		}
+		if (!scsi_host_queue_ready(q, shost, sdev, cmd))
+			goto out_dec_target_busy;
 	}
-	if (!scsi_host_queue_ready(q, shost, sdev, cmd))
-		goto out_dec_target_busy;
 
 	/*
 	 * Only clear the driver-private command data if the LLD does not supply
@@ -1870,6 +1884,14 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx,
 	cmd->submitter = SUBMITTED_BY_BLOCK_LAYER;
 
 	blk_mq_start_request(req);
+	if (blk_mq_is_reserved_rq(req)) {
+		reason = shost->hostt->queue_reserved_command(shost, cmd);
+		if (reason) {
+			ret = BLK_STS_RESOURCE;
+			goto out_put_budget;
+		}
+		return BLK_STS_OK;
+	}
 	reason = scsi_dispatch_cmd(cmd);
 	if (reason) {
 		scsi_set_blocked(cmd, reason);
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index 4f945a20d198..e87cf7eadd26 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -86,6 +86,12 @@ struct scsi_host_template {
 	 */
 	int (* queuecommand)(struct Scsi_Host *, struct scsi_cmnd *);
 
+	/*
+	 * Queue a reserved command (BLK_MQ_REQ_RESERVED). The .queuecommand()
+	 * documentation also applies to the .queue_reserved_command() callback.
+	 */
+	int (*queue_reserved_command)(struct Scsi_Host *, struct scsi_cmnd *);
+
 	/*
 	 * The commit_rqs function is used to trigger a hardware
 	 * doorbell after some requests have been queued with

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

* [PATCH v8 06/28] scsi: core: Add scsi_{get,put}_internal_cmd() helpers
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (4 preceding siblings ...)
  2025-10-31 20:39 ` [PATCH v8 05/28] scsi: core: Introduce .queue_reserved_command() Bart Van Assche
@ 2025-10-31 20:39 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 07/28] scsi_debug: Abort SCSI commands via an internal command Bart Van Assche
                   ` (24 subsequent siblings)
  30 siblings, 0 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, Hannes Reinecke, John Garry,
	James E.J. Bottomley

From: Hannes Reinecke <hare@suse.de>

Add helper functions to allow LLDDs to allocate and free internal commands.

Reviewed-by: John Garry <john.g.garry@oracle.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
[ bvanassche: changed the 'nowait' argument into a 'flags' argument. See also
  https://lore.kernel.org/linux-scsi/20211125151048.103910-3-hare@suse.de/ ]
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/scsi_lib.c    | 38 ++++++++++++++++++++++++++++++++++++++
 include/scsi/scsi_device.h |  4 ++++
 2 files changed, 42 insertions(+)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index d4e874bbf2ea..51ad2ad07e43 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2134,6 +2134,44 @@ void scsi_mq_free_tags(struct kref *kref)
 	complete(&shost->tagset_freed);
 }
 
+/**
+ * scsi_get_internal_cmd() - Allocate an internal SCSI command.
+ * @sdev: SCSI device from which to allocate the command
+ * @data_direction: Data direction for the allocated command
+ * @flags: request allocation flags, e.g. BLK_MQ_REQ_RESERVED or
+ *	BLK_MQ_REQ_NOWAIT.
+ *
+ * Allocates a SCSI command for internal LLDD use.
+ */
+struct scsi_cmnd *scsi_get_internal_cmd(struct scsi_device *sdev,
+					enum dma_data_direction data_direction,
+					blk_mq_req_flags_t flags)
+{
+	enum req_op op = data_direction == DMA_TO_DEVICE ? REQ_OP_DRV_OUT :
+							   REQ_OP_DRV_IN;
+	struct scsi_cmnd *scmd;
+	struct request *rq;
+
+	rq = scsi_alloc_request(sdev->request_queue, op, flags);
+	if (IS_ERR(rq))
+		return NULL;
+	scmd = blk_mq_rq_to_pdu(rq);
+	scmd->device = sdev;
+
+	return scmd;
+}
+EXPORT_SYMBOL_GPL(scsi_get_internal_cmd);
+
+/**
+ * scsi_put_internal_cmd() - Free an internal SCSI command.
+ * @scmd: SCSI command to be freed
+ */
+void scsi_put_internal_cmd(struct scsi_cmnd *scmd)
+{
+	blk_mq_free_request(blk_mq_rq_from_pdu(scmd));
+}
+EXPORT_SYMBOL_GPL(scsi_put_internal_cmd);
+
 /**
  * scsi_device_from_queue - return sdev associated with a request_queue
  * @q: The request queue to return the sdev from
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index 918631088711..1e2e599517e9 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -558,6 +558,10 @@ int scsi_execute_cmd(struct scsi_device *sdev, const unsigned char *cmd,
 		     const struct scsi_exec_args *args);
 void scsi_failures_reset_retries(struct scsi_failures *failures);
 
+struct scsi_cmnd *scsi_get_internal_cmd(struct scsi_device *sdev,
+					enum dma_data_direction data_direction,
+					blk_mq_req_flags_t flags);
+void scsi_put_internal_cmd(struct scsi_cmnd *scmd);
 extern void sdev_disable_disk_events(struct scsi_device *sdev);
 extern void sdev_enable_disk_events(struct scsi_device *sdev);
 extern int scsi_vpd_lun_id(struct scsi_device *, char *, size_t);

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

* [PATCH v8 07/28] scsi_debug: Abort SCSI commands via an internal command
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (5 preceding siblings ...)
  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 ` 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
                   ` (23 subsequent siblings)
  30 siblings, 0 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, John Garry, James E.J. Bottomley

Add a .queue_reserved_command() implementation and call it from the code
path that aborts SCSI commands. This ensures that the code for
allocating a pseudo SCSI device and also the code for allocating and
processing reserved commands gets triggered while running blktests.

Most of the code in this patch is a modified version of code from John
Garry. See also
https://lore.kernel.org/linux-scsi/75018e17-4dea-4e1b-8c92-7a224a1e13b9@oracle.com/

Reviewed-by: John Garry <john.g.garry@oracle.com>
Suggested-by: John Garry <john.g.garry@oracle.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/scsi_debug.c | 116 ++++++++++++++++++++++++++++++++++----
 1 file changed, 105 insertions(+), 11 deletions(-)

diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index b2ab97be5db3..7291b7a7f1b0 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -6752,20 +6752,59 @@ static bool scsi_debug_stop_cmnd(struct scsi_cmnd *cmnd)
 	return false;
 }
 
+struct sdebug_abort_cmd {
+	u32 unique_tag;
+};
+
+enum sdebug_internal_cmd_type {
+	SCSI_DEBUG_ABORT_CMD,
+};
+
+struct sdebug_internal_cmd {
+	enum sdebug_internal_cmd_type type;
+
+	union {
+		struct sdebug_abort_cmd abort_cmd;
+	};
+};
+
+union sdebug_priv {
+	struct sdebug_scsi_cmd cmd;
+	struct sdebug_internal_cmd internal_cmd;
+};
+
 /*
- * Called from scsi_debug_abort() only, which is for timed-out cmd.
+ * Abort SCSI command @cmnd. Only called from scsi_debug_abort(). Although
+ * it would be possible to call scsi_debug_stop_cmnd() directly, an internal
+ * command is allocated and submitted to trigger the reserved command
+ * infrastructure.
  */
 static bool scsi_debug_abort_cmnd(struct scsi_cmnd *cmnd)
 {
-	struct sdebug_scsi_cmd *sdsc = scsi_cmd_priv(cmnd);
-	unsigned long flags;
-	bool res;
-
-	spin_lock_irqsave(&sdsc->lock, flags);
-	res = scsi_debug_stop_cmnd(cmnd);
-	spin_unlock_irqrestore(&sdsc->lock, flags);
-
-	return res;
+	struct Scsi_Host *shost = cmnd->device->host;
+	struct request *rq = scsi_cmd_to_rq(cmnd);
+	u32 unique_tag = blk_mq_unique_tag(rq);
+	struct sdebug_internal_cmd *internal_cmd;
+	struct scsi_cmnd *abort_cmd;
+	struct request *abort_rq;
+	blk_status_t res;
+
+	abort_cmd = scsi_get_internal_cmd(shost->pseudo_sdev, DMA_NONE,
+					  BLK_MQ_REQ_RESERVED);
+	if (!abort_cmd)
+		return false;
+	internal_cmd = scsi_cmd_priv(abort_cmd);
+	*internal_cmd = (struct sdebug_internal_cmd) {
+		.type = SCSI_DEBUG_ABORT_CMD,
+		.abort_cmd = {
+			.unique_tag = unique_tag,
+		},
+	};
+	abort_rq = scsi_cmd_to_rq(abort_cmd);
+	abort_rq->timeout = secs_to_jiffies(3);
+	res = blk_execute_rq(abort_rq, true);
+	scsi_put_internal_cmd(abort_cmd);
+	return res == BLK_STS_OK;
 }
 
 /*
@@ -9220,6 +9259,56 @@ static int sdebug_fail_cmd(struct scsi_cmnd *cmnd, int *retval,
 	return ret;
 }
 
+/* Process @scp, a request to abort a SCSI command by tag. */
+static void scsi_debug_abort_cmd(struct Scsi_Host *shost, struct scsi_cmnd *scp)
+{
+	struct sdebug_internal_cmd *internal_cmd = scsi_cmd_priv(scp);
+	struct sdebug_abort_cmd *abort_cmd = &internal_cmd->abort_cmd;
+	const u32 unique_tag = abort_cmd->unique_tag;
+	struct scsi_cmnd *to_be_aborted_scmd =
+		scsi_host_find_tag(shost, unique_tag);
+	struct sdebug_scsi_cmd *to_be_aborted_sdsc =
+		scsi_cmd_priv(to_be_aborted_scmd);
+	bool res = false;
+
+	if (!to_be_aborted_scmd) {
+		pr_err("%s: command with tag %#x not found\n", __func__,
+		       unique_tag);
+		return;
+	}
+
+	scoped_guard(spinlock_irqsave, &to_be_aborted_sdsc->lock)
+		res = scsi_debug_stop_cmnd(to_be_aborted_scmd);
+
+	if (res)
+		pr_info("%s: aborted command with tag %#x\n",
+			__func__, unique_tag);
+	else
+		pr_err("%s: failed to abort command with tag %#x\n",
+		       __func__, unique_tag);
+
+	set_host_byte(scp, res ? DID_OK : DID_ERROR);
+}
+
+static int scsi_debug_process_reserved_command(struct Scsi_Host *shost,
+					       struct scsi_cmnd *scp)
+{
+	struct sdebug_internal_cmd *internal_cmd = scsi_cmd_priv(scp);
+
+	switch (internal_cmd->type) {
+	case SCSI_DEBUG_ABORT_CMD:
+		scsi_debug_abort_cmd(shost, scp);
+		break;
+	default:
+		WARN_ON_ONCE(true);
+		set_host_byte(scp, DID_ERROR);
+		break;
+	}
+
+	scsi_done(scp);
+	return 0;
+}
+
 static int scsi_debug_queuecommand(struct Scsi_Host *shost,
 				   struct scsi_cmnd *scp)
 {
@@ -9420,6 +9509,9 @@ static int sdebug_init_cmd_priv(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
 	struct sdebug_scsi_cmd *sdsc = scsi_cmd_priv(cmd);
 	struct sdebug_defer *sd_dp = &sdsc->sd_dp;
 
+	if (blk_mq_is_reserved_rq(scsi_cmd_to_rq(cmd)))
+		return 0;
+
 	spin_lock_init(&sdsc->lock);
 	hrtimer_setup(&sd_dp->hrt, sdebug_q_cmd_hrt_complete, CLOCK_MONOTONIC,
 		      HRTIMER_MODE_REL_PINNED);
@@ -9439,6 +9531,7 @@ static const struct scsi_host_template sdebug_driver_template = {
 	.sdev_destroy =		scsi_debug_sdev_destroy,
 	.ioctl =		scsi_debug_ioctl,
 	.queuecommand =		scsi_debug_queuecommand,
+	.queue_reserved_command = scsi_debug_process_reserved_command,
 	.change_queue_depth =	sdebug_change_qdepth,
 	.map_queues =		sdebug_map_queues,
 	.mq_poll =		sdebug_blk_mq_poll,
@@ -9448,6 +9541,7 @@ static const struct scsi_host_template sdebug_driver_template = {
 	.eh_bus_reset_handler = scsi_debug_bus_reset,
 	.eh_host_reset_handler = scsi_debug_host_reset,
 	.can_queue =		SDEBUG_CANQUEUE,
+	.nr_reserved_cmds =	1,
 	.this_id =		7,
 	.sg_tablesize =		SG_MAX_SEGMENTS,
 	.cmd_per_lun =		DEF_CMD_PER_LUN,
@@ -9456,7 +9550,7 @@ static const struct scsi_host_template sdebug_driver_template = {
 	.module =		THIS_MODULE,
 	.skip_settle_delay =	1,
 	.track_queue_depth =	1,
-	.cmd_size = sizeof(struct sdebug_scsi_cmd),
+	.cmd_size = sizeof(union sdebug_priv),
 	.init_cmd_priv = sdebug_init_cmd_priv,
 	.target_alloc =		sdebug_target_alloc,
 	.target_destroy =	sdebug_target_destroy,

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

* [PATCH v8 08/28] ufs: core: Move an assignment in ufshcd_mcq_process_cqe()
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (6 preceding siblings ...)
  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 ` 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
                   ` (22 subsequent siblings)
  30 siblings, 0 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, Avri Altman, James E.J. Bottomley,
	Peter Wang, ping.gao, Alok Tiwari, Chenyuan Yang

Since 'tag' is only used inside the if-statement, move the 'tag'
assignment into the if-statement. This patch prepares for introducing a
WARN_ON_ONCE() call in ufshcd_mcq_get_tag() if the tag lookup fails.

Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufs-mcq.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index d04662b57cd1..bae35d0f99c5 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -307,9 +307,10 @@ static void ufshcd_mcq_process_cqe(struct ufs_hba *hba,
 				   struct ufs_hw_queue *hwq)
 {
 	struct cq_entry *cqe = ufshcd_mcq_cur_cqe(hwq);
-	int tag = ufshcd_mcq_get_tag(hba, cqe);
 
 	if (cqe->command_desc_base_addr) {
+		int tag = ufshcd_mcq_get_tag(hba, cqe);
+
 		ufshcd_compl_one_cqe(hba, tag, cqe);
 		/* After processed the cqe, mark it empty (invalid) entry */
 		cqe->command_desc_base_addr = 0;

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

* [PATCH v8 09/28] ufs: core: Change the type of one ufshcd_add_cmd_upiu_trace() argument
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (7 preceding siblings ...)
  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 ` 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
                   ` (21 subsequent siblings)
  30 siblings, 0 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, Avri Altman, Peter Wang,
	James E.J. Bottomley, Matthias Brugger,
	AngeloGioacchino Del Regno, Bean Huo, Bao D. Nguyen,
	Adrian Hunter

Change the 'tag' argument into an LRB pointer. This patch prepares for the
removal of the hba->lrb[] array.

Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index fc4d1b6576dc..cdb8147fceb9 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -403,10 +403,11 @@ static void ufshcd_configure_wb(struct ufs_hba *hba)
 		ufshcd_wb_toggle_buf_flush(hba, true);
 }
 
-static void ufshcd_add_cmd_upiu_trace(struct ufs_hba *hba, unsigned int tag,
+static void ufshcd_add_cmd_upiu_trace(struct ufs_hba *hba,
+				      struct ufshcd_lrb *lrb,
 				      enum ufs_trace_str_t str_t)
 {
-	struct utp_upiu_req *rq = hba->lrb[tag].ucd_req_ptr;
+	struct utp_upiu_req *rq = lrb->ucd_req_ptr;
 	struct utp_upiu_header *header;
 
 	if (!trace_ufshcd_upiu_enabled())
@@ -415,7 +416,7 @@ static void ufshcd_add_cmd_upiu_trace(struct ufs_hba *hba, unsigned int tag,
 	if (str_t == UFS_CMD_SEND)
 		header = &rq->header;
 	else
-		header = &hba->lrb[tag].ucd_rsp_ptr->header;
+		header = &lrb->ucd_rsp_ptr->header;
 
 	trace_ufshcd_upiu(hba, str_t, header, &rq->sc.cdb,
 			  UFS_TSF_CDB);
@@ -489,7 +490,7 @@ static void ufshcd_add_command_trace(struct ufs_hba *hba, unsigned int tag,
 		return;
 
 	/* trace UPIU also */
-	ufshcd_add_cmd_upiu_trace(hba, tag, str_t);
+	ufshcd_add_cmd_upiu_trace(hba, lrbp, str_t);
 	if (!trace_ufshcd_command_enabled())
 		return;
 

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

* [PATCH v8 10/28] ufs: core: Only call ufshcd_add_command_trace() for SCSI commands
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (8 preceding siblings ...)
  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 ` 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
                   ` (20 subsequent siblings)
  30 siblings, 0 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, Avri Altman, Peter Wang,
	James E.J. Bottomley, Matthias Brugger,
	AngeloGioacchino Del Regno, Bean Huo, Bao D. Nguyen,
	Adrian Hunter

Instead of checking inside ufshcd_add_command_trace() whether 'cmd' points
at a SCSI command, let the caller perform that check. This patch prepares
for removing the lrbp->cmd pointer.

Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index cdb8147fceb9..87892a13ef57 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -486,9 +486,6 @@ static void ufshcd_add_command_trace(struct ufs_hba *hba, unsigned int tag,
 	struct request *rq = scsi_cmd_to_rq(cmd);
 	int transfer_len = -1;
 
-	if (!cmd)
-		return;
-
 	/* trace UPIU also */
 	ufshcd_add_cmd_upiu_trace(hba, lrbp, str_t);
 	if (!trace_ufshcd_command_enabled())
@@ -2369,9 +2366,10 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag,
 		lrbp->compl_time_stamp = ktime_set(0, 0);
 		lrbp->compl_time_stamp_local_clock = 0;
 	}
-	ufshcd_add_command_trace(hba, task_tag, UFS_CMD_SEND);
-	if (lrbp->cmd)
+	if (lrbp->cmd) {
+		ufshcd_add_command_trace(hba, task_tag, UFS_CMD_SEND);
 		ufshcd_clk_scaling_start_busy(hba);
+	}
 	if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
 		ufshcd_start_monitor(hba, lrbp);
 

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

* [PATCH v8 11/28] ufs: core: Change the type of one ufshcd_add_command_trace() argument
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (9 preceding siblings ...)
  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 ` 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
                   ` (19 subsequent siblings)
  30 siblings, 0 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, Avri Altman, Peter Wang,
	James E.J. Bottomley, Matthias Brugger,
	AngeloGioacchino Del Regno, Bean Huo, Bao D. Nguyen,
	Adrian Hunter

Change the 'tag' argument into a SCSI command pointer. This patch prepares
for the removal of the hba->lrb[] array.

Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 87892a13ef57..edf56e9e825b 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -473,7 +473,7 @@ static void ufshcd_add_uic_command_trace(struct ufs_hba *hba,
 				 ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3));
 }
 
-static void ufshcd_add_command_trace(struct ufs_hba *hba, unsigned int tag,
+static void ufshcd_add_command_trace(struct ufs_hba *hba, struct scsi_cmnd *cmd,
 				     enum ufs_trace_str_t str_t)
 {
 	u64 lba = 0;
@@ -481,9 +481,9 @@ static void ufshcd_add_command_trace(struct ufs_hba *hba, unsigned int tag,
 	u32 doorbell = 0;
 	u32 intr;
 	u32 hwq_id = 0;
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
-	struct scsi_cmnd *cmd = lrbp->cmd;
 	struct request *rq = scsi_cmd_to_rq(cmd);
+	unsigned int tag = rq->tag;
+	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
 	int transfer_len = -1;
 
 	/* trace UPIU also */
@@ -501,7 +501,7 @@ static void ufshcd_add_command_trace(struct ufs_hba *hba, unsigned int tag,
 		       be32_to_cpu(lrbp->ucd_req_ptr->sc.exp_data_transfer_len);
 		lba = scsi_get_lba(cmd);
 		if (opcode == WRITE_10)
-			group_id = lrbp->cmd->cmnd[6];
+			group_id = cmd->cmnd[6];
 	} else if (opcode == UNMAP) {
 		/*
 		 * The number of Bytes to be unmapped beginning with the lba.
@@ -2367,7 +2367,7 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag,
 		lrbp->compl_time_stamp_local_clock = 0;
 	}
 	if (lrbp->cmd) {
-		ufshcd_add_command_trace(hba, task_tag, UFS_CMD_SEND);
+		ufshcd_add_command_trace(hba, lrbp->cmd, UFS_CMD_SEND);
 		ufshcd_clk_scaling_start_busy(hba);
 	}
 	if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
@@ -5641,7 +5641,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
 	if (cmd) {
 		if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
 			ufshcd_update_monitor(hba, lrbp);
-		ufshcd_add_command_trace(hba, task_tag, UFS_CMD_COMP);
+		ufshcd_add_command_trace(hba, cmd, UFS_CMD_COMP);
 		cmd->result = ufshcd_transfer_rsp_status(hba, lrbp, cqe);
 		ufshcd_release_scsi_cmd(hba, lrbp);
 		/* Do not touch lrbp after scsi done */

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

* [PATCH v8 12/28] ufs: core: Change the type of one ufshcd_send_command() argument
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (10 preceding siblings ...)
  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 ` 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
                   ` (18 subsequent siblings)
  30 siblings, 0 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, Avri Altman, Peter Wang,
	James E.J. Bottomley, Matthias Brugger,
	AngeloGioacchino Del Regno, Bean Huo, Bao D. Nguyen,
	Adrian Hunter

Change the 'task_tag' argument into an LRB pointer. This patch prepares
for the removal of the hba->lrb[] array.

Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index edf56e9e825b..f478d5b5230d 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2350,14 +2350,13 @@ static void ufshcd_update_monitor(struct ufs_hba *hba, const struct ufshcd_lrb *
 /**
  * ufshcd_send_command - Send SCSI or device management commands
  * @hba: per adapter instance
- * @task_tag: Task tag of the command
+ * @lrbp: Local reference block of SCSI command
  * @hwq: pointer to hardware queue instance
  */
-static inline
-void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag,
-			 struct ufs_hw_queue *hwq)
+static inline void ufshcd_send_command(struct ufs_hba *hba,
+				       struct ufshcd_lrb *lrbp,
+				       struct ufs_hw_queue *hwq)
 {
-	struct ufshcd_lrb *lrbp = &hba->lrb[task_tag];
 	unsigned long flags;
 
 	if (hba->monitor.enabled) {
@@ -3066,7 +3065,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	if (hba->mcq_enabled)
 		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(cmd));
 
-	ufshcd_send_command(hba, tag, hwq);
+	ufshcd_send_command(hba, lrbp, hwq);
 
 out:
 	if (ufs_trigger_eh(hba)) {
@@ -3312,7 +3311,7 @@ static int ufshcd_issue_dev_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 	int err;
 
 	ufshcd_add_query_upiu_trace(hba, UFS_QUERY_SEND, lrbp->ucd_req_ptr);
-	ufshcd_send_command(hba, tag, hba->dev_cmd_queue);
+	ufshcd_send_command(hba, lrbp, hba->dev_cmd_queue);
 	err = ufshcd_wait_for_dev_cmd(hba, lrbp, timeout);
 
 	ufshcd_add_query_upiu_trace(hba, err ? UFS_QUERY_ERR : UFS_QUERY_COMP,

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

* [PATCH v8 13/28] ufs: core: Only call ufshcd_should_inform_monitor() for SCSI commands
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (11 preceding siblings ...)
  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 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 14/28] ufs: core: Change the monitor function argument types Bart Van Assche
                   ` (17 subsequent siblings)
  30 siblings, 0 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, Peter Wang, James E.J. Bottomley,
	Matthias Brugger, AngeloGioacchino Del Regno, Avri Altman,
	Bean Huo, Bao D. Nguyen, Adrian Hunter

ufshcd_should_inform_monitor() only returns 'true' for SCSI commands.
Instead of checking inside ufshcd_should_inform_monitor() whether its
second argument represents a SCSI command, only call this function for
SCSI commands. This patch prepares for removing the lrbp->cmd member.

Reviewed-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index f478d5b5230d..dbdb8c30ca09 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2293,12 +2293,13 @@ static inline int ufshcd_monitor_opcode2dir(u8 opcode)
 		return -EINVAL;
 }
 
+/* Must only be called for SCSI commands. */
 static inline bool ufshcd_should_inform_monitor(struct ufs_hba *hba,
 						struct ufshcd_lrb *lrbp)
 {
 	const struct ufs_hba_monitor *m = &hba->monitor;
 
-	return (m->enabled && lrbp && lrbp->cmd &&
+	return (m->enabled &&
 		(!m->chunk_size || m->chunk_size == lrbp->cmd->sdb.length) &&
 		ktime_before(hba->monitor.enabled_ts, lrbp->issue_time_stamp));
 }
@@ -2368,9 +2369,9 @@ static inline void ufshcd_send_command(struct ufs_hba *hba,
 	if (lrbp->cmd) {
 		ufshcd_add_command_trace(hba, lrbp->cmd, UFS_CMD_SEND);
 		ufshcd_clk_scaling_start_busy(hba);
+		if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
+			ufshcd_start_monitor(hba, lrbp);
 	}
-	if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
-		ufshcd_start_monitor(hba, lrbp);
 
 	if (hba->mcq_enabled) {
 		int utrd_size = sizeof(struct utp_transfer_req_desc);

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

* [PATCH v8 14/28] ufs: core: Change the monitor function argument types
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (12 preceding siblings ...)
  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 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 15/28] ufs: core: Rework ufshcd_mcq_compl_pending_transfer() Bart Van Assche
                   ` (16 subsequent siblings)
  30 siblings, 0 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, Avri Altman, James E.J. Bottomley,
	Peter Wang, Bean Huo, Bao D. Nguyen, Adrian Hunter

Pass a SCSI command pointer instead of a struct ufshcd_lrb pointer. This
patch prepares for combining the SCSI command and ufshcd_lrb data
structures into a single data structure.

Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 44 +++++++++++++++++++--------------------
 1 file changed, 22 insertions(+), 22 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index dbdb8c30ca09..df3f651c8d91 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2295,19 +2295,20 @@ static inline int ufshcd_monitor_opcode2dir(u8 opcode)
 
 /* Must only be called for SCSI commands. */
 static inline bool ufshcd_should_inform_monitor(struct ufs_hba *hba,
-						struct ufshcd_lrb *lrbp)
+						struct scsi_cmnd *cmd)
 {
 	const struct ufs_hba_monitor *m = &hba->monitor;
+	struct request *rq = scsi_cmd_to_rq(cmd);
+	struct ufshcd_lrb *lrbp = &hba->lrb[rq->tag];
 
-	return (m->enabled &&
-		(!m->chunk_size || m->chunk_size == lrbp->cmd->sdb.length) &&
-		ktime_before(hba->monitor.enabled_ts, lrbp->issue_time_stamp));
+	return m->enabled &&
+	       (!m->chunk_size || m->chunk_size == cmd->sdb.length) &&
+	       ktime_before(hba->monitor.enabled_ts, lrbp->issue_time_stamp);
 }
 
-static void ufshcd_start_monitor(struct ufs_hba *hba,
-				 const struct ufshcd_lrb *lrbp)
+static void ufshcd_start_monitor(struct ufs_hba *hba, struct scsi_cmnd *cmd)
 {
-	int dir = ufshcd_monitor_opcode2dir(*lrbp->cmd->cmnd);
+	int dir = ufshcd_monitor_opcode2dir(cmd->cmnd[0]);
 	unsigned long flags;
 
 	spin_lock_irqsave(hba->host->host_lock, flags);
@@ -2316,14 +2317,15 @@ static void ufshcd_start_monitor(struct ufs_hba *hba,
 	spin_unlock_irqrestore(hba->host->host_lock, flags);
 }
 
-static void ufshcd_update_monitor(struct ufs_hba *hba, const struct ufshcd_lrb *lrbp)
+static void ufshcd_update_monitor(struct ufs_hba *hba, struct scsi_cmnd *cmd)
 {
-	int dir = ufshcd_monitor_opcode2dir(*lrbp->cmd->cmnd);
+	struct request *req = scsi_cmd_to_rq(cmd);
+	struct ufshcd_lrb *lrbp = &hba->lrb[req->tag];
+	int dir = ufshcd_monitor_opcode2dir(cmd->cmnd[0]);
 	unsigned long flags;
 
 	spin_lock_irqsave(hba->host->host_lock, flags);
 	if (dir >= 0 && hba->monitor.nr_queued[dir] > 0) {
-		const struct request *req = scsi_cmd_to_rq(lrbp->cmd);
 		struct ufs_hba_monitor *m = &hba->monitor;
 		ktime_t now, inc, lat;
 
@@ -2358,6 +2360,7 @@ static inline void ufshcd_send_command(struct ufs_hba *hba,
 				       struct ufshcd_lrb *lrbp,
 				       struct ufs_hw_queue *hwq)
 {
+	struct scsi_cmnd *cmd = lrbp->cmd;
 	unsigned long flags;
 
 	if (hba->monitor.enabled) {
@@ -2366,11 +2369,11 @@ static inline void ufshcd_send_command(struct ufs_hba *hba,
 		lrbp->compl_time_stamp = ktime_set(0, 0);
 		lrbp->compl_time_stamp_local_clock = 0;
 	}
-	if (lrbp->cmd) {
-		ufshcd_add_command_trace(hba, lrbp->cmd, UFS_CMD_SEND);
+	if (cmd) {
+		ufshcd_add_command_trace(hba, cmd, UFS_CMD_SEND);
 		ufshcd_clk_scaling_start_busy(hba);
-		if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
-			ufshcd_start_monitor(hba, lrbp);
+		if (unlikely(ufshcd_should_inform_monitor(hba, cmd)))
+			ufshcd_start_monitor(hba, cmd);
 	}
 
 	if (hba->mcq_enabled) {
@@ -2386,8 +2389,7 @@ static inline void ufshcd_send_command(struct ufs_hba *hba,
 	} else {
 		spin_lock_irqsave(&hba->outstanding_lock, flags);
 		if (hba->vops && hba->vops->setup_xfer_req)
-			hba->vops->setup_xfer_req(hba, lrbp->task_tag,
-						  !!lrbp->cmd);
+			hba->vops->setup_xfer_req(hba, lrbp->task_tag, !!cmd);
 		__set_bit(lrbp->task_tag, &hba->outstanding_reqs);
 		ufshcd_writel(hba, 1 << lrbp->task_tag,
 			      REG_UTP_TRANSFER_REQ_DOOR_BELL);
@@ -5628,19 +5630,17 @@ void ufshcd_release_scsi_cmd(struct ufs_hba *hba,
 void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
 			  struct cq_entry *cqe)
 {
-	struct ufshcd_lrb *lrbp;
-	struct scsi_cmnd *cmd;
+	struct ufshcd_lrb *lrbp = &hba->lrb[task_tag];
+	struct scsi_cmnd *cmd = lrbp->cmd;
 	enum utp_ocs ocs;
 
-	lrbp = &hba->lrb[task_tag];
 	if (hba->monitor.enabled) {
 		lrbp->compl_time_stamp = ktime_get();
 		lrbp->compl_time_stamp_local_clock = local_clock();
 	}
-	cmd = lrbp->cmd;
 	if (cmd) {
-		if (unlikely(ufshcd_should_inform_monitor(hba, lrbp)))
-			ufshcd_update_monitor(hba, lrbp);
+		if (unlikely(ufshcd_should_inform_monitor(hba, cmd)))
+			ufshcd_update_monitor(hba, cmd);
 		ufshcd_add_command_trace(hba, cmd, UFS_CMD_COMP);
 		cmd->result = ufshcd_transfer_rsp_status(hba, lrbp, cqe);
 		ufshcd_release_scsi_cmd(hba, lrbp);

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

* [PATCH v8 15/28] ufs: core: Rework ufshcd_mcq_compl_pending_transfer()
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (13 preceding siblings ...)
  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 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 16/28] ufs: core: Rework ufshcd_eh_device_reset_handler() Bart Van Assche
                   ` (15 subsequent siblings)
  30 siblings, 0 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, Avri Altman, James E.J. Bottomley,
	Peter Wang, Bean Huo, Bao D. Nguyen, Adrian Hunter

Replace a tag loop with blk_mq_tagset_busy_iter(). This patch prepares
for removing the hba->lrb[] array.

Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 80 ++++++++++++++++++++++-----------------
 1 file changed, 46 insertions(+), 34 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index df3f651c8d91..ed5def669a33 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -5725,6 +5725,48 @@ static int ufshcd_poll(struct Scsi_Host *shost, unsigned int queue_num)
 	return completed_reqs != 0;
 }
 
+static bool ufshcd_mcq_force_compl_one(struct request *rq, void *priv)
+{
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
+	struct scsi_device *sdev = rq->q->queuedata;
+	struct Scsi_Host *shost = sdev->host;
+	struct ufs_hba *hba = shost_priv(shost);
+	struct ufshcd_lrb *lrbp = &hba->lrb[rq->tag];
+	struct ufs_hw_queue *hwq = ufshcd_mcq_req_to_hwq(hba, rq);
+
+	if (!hwq)
+		return true;
+
+	ufshcd_mcq_compl_all_cqes_lock(hba, hwq);
+
+	/*
+	 * For those cmds of which the cqes are not present in the cq, complete
+	 * them explicitly.
+	 */
+	scoped_guard(spinlock_irqsave, &hwq->cq_lock) {
+		if (!test_bit(SCMD_STATE_COMPLETE, &cmd->state)) {
+			set_host_byte(cmd, DID_REQUEUE);
+			ufshcd_release_scsi_cmd(hba, lrbp);
+			scsi_done(cmd);
+		}
+	}
+
+	return true;
+}
+
+static bool ufshcd_mcq_compl_one(struct request *rq, void *priv)
+{
+	struct scsi_device *sdev = rq->q->queuedata;
+	struct Scsi_Host *shost = sdev->host;
+	struct ufs_hba *hba = shost_priv(shost);
+	struct ufs_hw_queue *hwq = ufshcd_mcq_req_to_hwq(hba, rq);
+
+	if (hwq)
+		ufshcd_mcq_poll_cqe_lock(hba, hwq);
+
+	return true;
+}
+
 /**
  * ufshcd_mcq_compl_pending_transfer - MCQ mode function. It is
  * invoked from the error handler context or ufshcd_host_reset_and_restore()
@@ -5739,40 +5781,10 @@ static int ufshcd_poll(struct Scsi_Host *shost, unsigned int queue_num)
 static void ufshcd_mcq_compl_pending_transfer(struct ufs_hba *hba,
 					      bool force_compl)
 {
-	struct ufs_hw_queue *hwq;
-	struct ufshcd_lrb *lrbp;
-	struct scsi_cmnd *cmd;
-	unsigned long flags;
-	int tag;
-
-	for (tag = 0; tag < hba->nutrs; tag++) {
-		lrbp = &hba->lrb[tag];
-		cmd = lrbp->cmd;
-		if (!ufshcd_cmd_inflight(cmd) ||
-		    test_bit(SCMD_STATE_COMPLETE, &cmd->state))
-			continue;
-
-		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(cmd));
-		if (!hwq)
-			continue;
-
-		if (force_compl) {
-			ufshcd_mcq_compl_all_cqes_lock(hba, hwq);
-			/*
-			 * For those cmds of which the cqes are not present
-			 * in the cq, complete them explicitly.
-			 */
-			spin_lock_irqsave(&hwq->cq_lock, flags);
-			if (cmd && !test_bit(SCMD_STATE_COMPLETE, &cmd->state)) {
-				set_host_byte(cmd, DID_REQUEUE);
-				ufshcd_release_scsi_cmd(hba, lrbp);
-				scsi_done(cmd);
-			}
-			spin_unlock_irqrestore(&hwq->cq_lock, flags);
-		} else {
-			ufshcd_mcq_poll_cqe_lock(hba, hwq);
-		}
-	}
+	blk_mq_tagset_busy_iter(&hba->host->tag_set,
+				force_compl ? ufshcd_mcq_force_compl_one :
+					      ufshcd_mcq_compl_one,
+				NULL);
 }
 
 /**

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

* [PATCH v8 16/28] ufs: core: Rework ufshcd_eh_device_reset_handler()
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (14 preceding siblings ...)
  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 ` 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
                   ` (14 subsequent siblings)
  30 siblings, 0 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, Avri Altman, James E.J. Bottomley,
	Peter Wang, Bean Huo, Bao D. Nguyen, Adrian Hunter

Merge the MCQ mode and legacy mode loops into a single loop. This patch
prepares for optimizing the hot path by removing the direct hba->lrb[]
accesses from ufshcd_eh_device_reset_handler().

Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 84 ++++++++++++++++++---------------------
 1 file changed, 38 insertions(+), 46 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index ed5def669a33..f64192c672e2 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -7566,6 +7566,36 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 	return err ? : result;
 }
 
+static bool ufshcd_clear_lu_cmds(struct request *req, void *priv)
+{
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
+	struct scsi_device *sdev = cmd->device;
+	struct Scsi_Host *shost = sdev->host;
+	struct ufs_hba *hba = shost_priv(shost);
+	const u64 lun = *(u64 *)priv;
+	const u32 tag = req->tag;
+
+	if (sdev->lun != lun)
+		return true;
+
+	if (ufshcd_clear_cmd(hba, tag) < 0) {
+		dev_err(hba->dev, "%s: failed to clear request %d\n", __func__,
+			tag);
+		return true;
+	}
+
+	if (hba->mcq_enabled) {
+		struct ufs_hw_queue *hwq = ufshcd_mcq_req_to_hwq(hba, req);
+
+		if (hwq)
+			ufshcd_mcq_poll_cqe_lock(hba, hwq);
+		return true;
+	}
+
+	ufshcd_compl_one_cqe(hba, tag, NULL);
+	return true;
+}
+
 /**
  * ufshcd_eh_device_reset_handler() - Reset a single logical unit.
  * @cmd: SCSI command pointer
@@ -7574,12 +7604,8 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
  */
 static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
 {
-	unsigned long flags, pending_reqs = 0, not_cleared = 0;
 	struct Scsi_Host *host;
 	struct ufs_hba *hba;
-	struct ufs_hw_queue *hwq;
-	struct ufshcd_lrb *lrbp;
-	u32 pos, not_cleared_mask = 0;
 	int err;
 	u8 resp = 0xF, lun;
 
@@ -7588,50 +7614,16 @@ static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
 
 	lun = ufshcd_scsi_to_upiu_lun(cmd->device->lun);
 	err = ufshcd_issue_tm_cmd(hba, lun, 0, UFS_LOGICAL_RESET, &resp);
-	if (err || resp != UPIU_TASK_MANAGEMENT_FUNC_COMPL) {
-		if (!err)
-			err = resp;
-		goto out;
-	}
-
-	if (hba->mcq_enabled) {
-		for (pos = 0; pos < hba->nutrs; pos++) {
-			lrbp = &hba->lrb[pos];
-			if (ufshcd_cmd_inflight(lrbp->cmd) &&
-			    lrbp->lun == lun) {
-				ufshcd_clear_cmd(hba, pos);
-				hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
-				ufshcd_mcq_poll_cqe_lock(hba, hwq);
-			}
-		}
-		err = 0;
-		goto out;
-	}
-
-	/* clear the commands that were pending for corresponding LUN */
-	spin_lock_irqsave(&hba->outstanding_lock, flags);
-	for_each_set_bit(pos, &hba->outstanding_reqs, hba->nutrs)
-		if (hba->lrb[pos].lun == lun)
-			__set_bit(pos, &pending_reqs);
-	hba->outstanding_reqs &= ~pending_reqs;
-	spin_unlock_irqrestore(&hba->outstanding_lock, flags);
-
-	for_each_set_bit(pos, &pending_reqs, hba->nutrs) {
-		if (ufshcd_clear_cmd(hba, pos) < 0) {
-			spin_lock_irqsave(&hba->outstanding_lock, flags);
-			not_cleared = 1U << pos &
-				ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL);
-			hba->outstanding_reqs |= not_cleared;
-			not_cleared_mask |= not_cleared;
-			spin_unlock_irqrestore(&hba->outstanding_lock, flags);
-
-			dev_err(hba->dev, "%s: failed to clear request %d\n",
-				__func__, pos);
-		}
+	if (err) {
+	} else if (resp != UPIU_TASK_MANAGEMENT_FUNC_COMPL) {
+		err = resp;
+	} else {
+		/* clear the commands that were pending for corresponding LUN */
+		blk_mq_tagset_busy_iter(&hba->host->tag_set,
+					ufshcd_clear_lu_cmds,
+					&cmd->device->lun);
 	}
-	__ufshcd_transfer_req_compl(hba, pending_reqs & ~not_cleared_mask);
 
-out:
 	hba->req_abort_count = 0;
 	ufshcd_update_evt_hist(hba, UFS_EVT_DEV_RESET, (u32)err);
 	if (!err) {

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

* [PATCH v8 17/28] ufs: core: Rework the SCSI host queue depth calculation code
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (15 preceding siblings ...)
  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 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 18/28] ufs: core: Allocate the SCSI host earlier Bart Van Assche
                   ` (13 subsequent siblings)
  30 siblings, 0 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, James E.J. Bottomley, Peter Wang,
	Chenyuan Yang, ping.gao, Alok Tiwari, Ziqi Chen, Can Guo,
	Bao D. Nguyen, Manivannan Sadhasivam, Avri Altman, Bean Huo,
	Adrian Hunter

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;
 

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

* [PATCH v8 18/28] ufs: core: Allocate the SCSI host earlier
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (16 preceding siblings ...)
  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 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 19/28] ufs: core: Call ufshcd_init_lrb() later Bart Van Assche
                   ` (12 subsequent siblings)
  30 siblings, 0 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, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter

Call ufshcd_add_scsi_host() before any UPIU commands are sent to the UFS
device. This patch prepares for letting ufshcd_add_scsi_host() allocate
memory for both SCSI and UPIU commands.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 93f2853ff5df..7935aad4ca13 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -10605,6 +10605,9 @@ static int ufshcd_add_scsi_host(struct ufs_hba *hba)
 {
 	int err;
 
+	WARN_ON_ONCE(!hba->host->can_queue);
+	WARN_ON_ONCE(!hba->host->cmd_per_lun);
+
 	if (is_mcq_supported(hba)) {
 		ufshcd_mcq_enable(hba);
 		err = ufshcd_alloc_mcq(hba);
@@ -10765,7 +10768,11 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
 	ufshcd_host_memory_configure(hba);
 
 	host->can_queue = hba->nutrs - UFSHCD_NUM_RESERVED;
-	host->cmd_per_lun = hba->nutrs - UFSHCD_NUM_RESERVED;
+	/*
+	 * Set the queue depth for WLUNs. ufs_get_device_desc() will increase
+	 * host->cmd_per_lun to a larger value.
+	 */
+	host->cmd_per_lun = 1;
 	host->max_id = UFSHCD_MAX_ID;
 	host->max_lun = UFS_MAX_LUNS;
 	host->max_channel = UFSHCD_MAX_CHANNEL;
@@ -10857,6 +10864,10 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
 			    FIELD_PREP(UFSHCI_AHIBERN8_SCALE_MASK, 3);
 	}
 
+	err = ufshcd_add_scsi_host(hba);
+	if (err)
+		goto out_disable;
+
 	/* Hold auto suspend until async scan completes */
 	pm_runtime_get_sync(dev);
 
@@ -10907,10 +10918,6 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
 	if (err)
 		goto out_disable;
 
-	err = ufshcd_add_scsi_host(hba);
-	if (err)
-		goto out_disable;
-
 	async_schedule(ufshcd_async_scan, hba);
 	ufs_sysfs_add_nodes(hba->dev);
 

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

* [PATCH v8 19/28] ufs: core: Call ufshcd_init_lrb() later
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (17 preceding siblings ...)
  2025-10-31 20:39 ` [PATCH v8 18/28] ufs: core: Allocate the SCSI host earlier Bart Van Assche
@ 2025-10-31 20:39 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 20/28] ufs: core: Use hba->reserved_slot Bart Van Assche
                   ` (11 subsequent siblings)
  30 siblings, 0 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, Avri Altman, James E.J. Bottomley,
	Peter Wang, Bean Huo, Bao D. Nguyen, Adrian Hunter

Call ufshcd_init_lrb() from inside ufshcd_setup_dev_cmd() instead of
ufshcd_host_memory_configure(). This patch prepares for calling
ufshcd_host_memory_configure() before the information is available
that is required to call ufshcd_setup_dev_cmd().

Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 53 ++++++++++++++++++++-------------------
 1 file changed, 27 insertions(+), 26 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 7935aad4ca13..f6eecc03282a 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2904,8 +2904,32 @@ static void ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
 	ufshcd_prepare_utp_scsi_cmd_upiu(lrbp, upiu_flags);
 }
 
-static void __ufshcd_setup_cmd(struct ufshcd_lrb *lrbp, struct scsi_cmnd *cmd, u8 lun, int tag)
+static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i)
+{
+	struct utp_transfer_cmd_desc *cmd_descp =
+		(void *)hba->ucdl_base_addr + i * ufshcd_get_ucd_size(hba);
+	struct utp_transfer_req_desc *utrdlp = hba->utrdl_base_addr;
+	dma_addr_t cmd_desc_element_addr =
+		hba->ucdl_dma_addr + i * ufshcd_get_ucd_size(hba);
+	u16 response_offset = le16_to_cpu(utrdlp[i].response_upiu_offset);
+	u16 prdt_offset = le16_to_cpu(utrdlp[i].prd_table_offset);
+
+	lrb->utr_descriptor_ptr = utrdlp + i;
+	lrb->utrd_dma_addr =
+		hba->utrdl_dma_addr + i * sizeof(struct utp_transfer_req_desc);
+	lrb->ucd_req_ptr = (struct utp_upiu_req *)cmd_descp->command_upiu;
+	lrb->ucd_req_dma_addr = cmd_desc_element_addr;
+	lrb->ucd_rsp_ptr = (struct utp_upiu_rsp *)cmd_descp->response_upiu;
+	lrb->ucd_rsp_dma_addr = cmd_desc_element_addr + response_offset;
+	lrb->ucd_prdt_ptr = (struct ufshcd_sg_entry *)cmd_descp->prd_table;
+	lrb->ucd_prdt_dma_addr = cmd_desc_element_addr + prdt_offset;
+}
+
+static void __ufshcd_setup_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
+			       struct scsi_cmnd *cmd, u8 lun, int tag)
 {
+	ufshcd_init_lrb(hba, lrbp, tag);
+
 	memset(lrbp->ucd_req_ptr, 0, sizeof(*lrbp->ucd_req_ptr));
 
 	lrbp->cmd = cmd;
@@ -2917,7 +2941,7 @@ static void __ufshcd_setup_cmd(struct ufshcd_lrb *lrbp, struct scsi_cmnd *cmd, u
 static void ufshcd_setup_scsi_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 				  struct scsi_cmnd *cmd, u8 lun, int tag)
 {
-	__ufshcd_setup_cmd(lrbp, cmd, lun, tag);
+	__ufshcd_setup_cmd(hba, lrbp, cmd, lun, tag);
 	lrbp->intr_cmd = !ufshcd_is_intr_aggr_allowed(hba);
 	lrbp->req_abort_skip = false;
 
@@ -2972,27 +2996,6 @@ static void ufshcd_map_queues(struct Scsi_Host *shost)
 	}
 }
 
-static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i)
-{
-	struct utp_transfer_cmd_desc *cmd_descp = (void *)hba->ucdl_base_addr +
-		i * ufshcd_get_ucd_size(hba);
-	struct utp_transfer_req_desc *utrdlp = hba->utrdl_base_addr;
-	dma_addr_t cmd_desc_element_addr = hba->ucdl_dma_addr +
-		i * ufshcd_get_ucd_size(hba);
-	u16 response_offset = le16_to_cpu(utrdlp[i].response_upiu_offset);
-	u16 prdt_offset = le16_to_cpu(utrdlp[i].prd_table_offset);
-
-	lrb->utr_descriptor_ptr = utrdlp + i;
-	lrb->utrd_dma_addr = hba->utrdl_dma_addr +
-		i * sizeof(struct utp_transfer_req_desc);
-	lrb->ucd_req_ptr = (struct utp_upiu_req *)cmd_descp->command_upiu;
-	lrb->ucd_req_dma_addr = cmd_desc_element_addr;
-	lrb->ucd_rsp_ptr = (struct utp_upiu_rsp *)cmd_descp->response_upiu;
-	lrb->ucd_rsp_dma_addr = cmd_desc_element_addr + response_offset;
-	lrb->ucd_prdt_ptr = (struct ufshcd_sg_entry *)cmd_descp->prd_table;
-	lrb->ucd_prdt_dma_addr = cmd_desc_element_addr + prdt_offset;
-}
-
 /**
  * ufshcd_queuecommand - main entry point for SCSI requests
  * @host: SCSI host pointer
@@ -3085,7 +3088,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 static void ufshcd_setup_dev_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 			     enum dev_cmd_type cmd_type, u8 lun, int tag)
 {
-	__ufshcd_setup_cmd(lrbp, NULL, lun, tag);
+	__ufshcd_setup_cmd(hba, lrbp, NULL, lun, tag);
 	lrbp->intr_cmd = true; /* No interrupt aggregation */
 	hba->dev_cmd.type = cmd_type;
 }
@@ -4048,8 +4051,6 @@ static void ufshcd_host_memory_configure(struct ufs_hba *hba)
 			utrdlp[i].response_upiu_length =
 				cpu_to_le16(ALIGNED_UPIU_SIZE >> 2);
 		}
-
-		ufshcd_init_lrb(hba, &hba->lrb[i], i);
 	}
 }
 

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

* [PATCH v8 20/28] ufs: core: Use hba->reserved_slot
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (18 preceding siblings ...)
  2025-10-31 20:39 ` [PATCH v8 19/28] ufs: core: Call ufshcd_init_lrb() later Bart Van Assche
@ 2025-10-31 20:39 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request Bart Van Assche
                   ` (10 subsequent siblings)
  30 siblings, 0 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, James E.J. Bottomley, Peter Wang,
	Avri Altman, Manivannan Sadhasivam, ping.gao, Chenyuan Yang,
	Alok Tiwari

Use hba->reserved_slot instead of open-coding it. This patch prepares
for changing the value of hba->reserved_slot.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufs-mcq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 00b043b54419..1de3360a7af1 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -544,7 +544,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	if (hba->quirks & UFSHCD_QUIRK_MCQ_BROKEN_RTC)
 		return -ETIMEDOUT;
 
-	if (task_tag != hba->nutrs - UFSHCD_NUM_RESERVED) {
+	if (task_tag != hba->reserved_slot) {
 		if (!cmd)
 			return -EINVAL;
 		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(cmd));

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

* [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (19 preceding siblings ...)
  2025-10-31 20:39 ` [PATCH v8 20/28] ufs: core: Use hba->reserved_slot Bart Van Assche
@ 2025-10-31 20:39 ` Bart Van Assche
  2025-11-14 10:12   ` Marek Szyprowski
  2025-11-27 16:59   ` Manivannan Sadhasivam
  2025-10-31 20:39 ` [PATCH v8 22/28] ufs: core: Do not clear driver-private command data Bart Van Assche
                   ` (9 subsequent siblings)
  30 siblings, 2 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, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter

Instead of letting the SCSI core allocate hba->nutrs - 1 commands, let
the SCSI core allocate hba->nutrs commands, set the number of reserved
tags to 1 and use the reserved tag for device management commands. This
patch changes the 'reserved slot' from hba->nutrs - 1 into 0 because
the block layer reserves the smallest tags for reserved commands.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index f6eecc03282a..20eae5d9487b 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2476,7 +2476,7 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
 	hba->nutrs = (hba->capabilities & MASK_TRANSFER_REQUESTS_SLOTS_SDB) + 1;
 	hba->nutmrs =
 	((hba->capabilities & MASK_TASK_MANAGEMENT_REQUEST_SLOTS) >> 16) + 1;
-	hba->reserved_slot = hba->nutrs - 1;
+	hba->reserved_slot = 0;
 
 	hba->nortt = FIELD_GET(MASK_NUMBER_OUTSTANDING_RTT, hba->capabilities) + 1;
 
@@ -8945,7 +8945,6 @@ static int ufshcd_alloc_mcq(struct ufs_hba *hba)
 		goto err;
 
 	hba->host->can_queue = hba->nutrs - UFSHCD_NUM_RESERVED;
-	hba->reserved_slot = hba->nutrs - UFSHCD_NUM_RESERVED;
 
 	return 0;
 err:
@@ -9184,6 +9183,7 @@ static const struct scsi_host_template ufshcd_driver_template = {
 	.proc_name		= UFSHCD,
 	.map_queues		= ufshcd_map_queues,
 	.queuecommand		= ufshcd_queuecommand,
+	.nr_reserved_cmds	= UFSHCD_NUM_RESERVED,
 	.mq_poll		= ufshcd_poll,
 	.sdev_init		= ufshcd_sdev_init,
 	.sdev_configure		= ufshcd_sdev_configure,

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

* [PATCH v8 22/28] ufs: core: Do not clear driver-private command data
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (20 preceding siblings ...)
  2025-10-31 20:39 ` [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request Bart Van Assche
@ 2025-10-31 20:39 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 23/28] ufs: core: Optimize the hot path Bart Van Assche
                   ` (8 subsequent siblings)
  30 siblings, 0 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, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter

Tell the SCSI core to skip the memset() call that clears driver-private
data because __ufshcd_setup_cmd() performs all necessary initialization.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 20eae5d9487b..1757aa0237da 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2996,6 +2996,15 @@ static void ufshcd_map_queues(struct Scsi_Host *shost)
 	}
 }
 
+/*
+ * The only purpose of this function is to make the SCSI core skip the memset()
+ * call for the private command data.
+ */
+static int ufshcd_init_cmd_priv(struct Scsi_Host *host, struct scsi_cmnd *cmd)
+{
+	return 0;
+}
+
 /**
  * ufshcd_queuecommand - main entry point for SCSI requests
  * @host: SCSI host pointer
@@ -9182,6 +9191,7 @@ static const struct scsi_host_template ufshcd_driver_template = {
 	.name			= UFSHCD,
 	.proc_name		= UFSHCD,
 	.map_queues		= ufshcd_map_queues,
+	.init_cmd_priv		= ufshcd_init_cmd_priv,
 	.queuecommand		= ufshcd_queuecommand,
 	.nr_reserved_cmds	= UFSHCD_NUM_RESERVED,
 	.mq_poll		= ufshcd_poll,

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

* [PATCH v8 23/28] ufs: core: Optimize the hot path
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (21 preceding siblings ...)
  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 ` 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
                   ` (7 subsequent siblings)
  30 siblings, 0 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, James E.J. Bottomley, Peter Wang,
	Alok Tiwari, Manivannan Sadhasivam, Chenyuan Yang, ping.gao,
	Bean Huo, Ziqi Chen, Can Guo, Bao D. Nguyen, Avri Altman,
	Adrian Hunter, Nitin Rawat, Eric Biggers, Neil Armstrong

Set .cmd_size in the SCSI host template such that the SCSI core makes
struct scsi_cmnd and struct ufshcd_lrb adjacent. Convert the cmd->lrbp
and lrbp->cmd memory loads into pointer offset calculations. Remove the
data structure members that became superfluous, namely ufshcd_lrb.cmd
and ufs_hba.lrb. Since ufshcd_lrb.cmd is removed, this pointer cannot
be used anymore to test whether or not a command is a SCSI command.
Introduce a new function for this purpose, namely ufshcd_is_scsi_cmd().

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufs-mcq.c       |   9 +-
 drivers/ufs/core/ufshcd-crypto.h |  18 ++-
 drivers/ufs/core/ufshcd-priv.h   |  41 +++++-
 drivers/ufs/core/ufshcd.c        | 235 ++++++++++++++++---------------
 include/ufs/ufshcd.h             |   5 -
 5 files changed, 179 insertions(+), 129 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 1de3360a7af1..776ff0896a2a 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -534,8 +534,8 @@ static int ufshcd_mcq_sq_start(struct ufs_hba *hba, struct ufs_hw_queue *hwq)
  */
 int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 {
-	struct ufshcd_lrb *lrbp = &hba->lrb[task_tag];
-	struct scsi_cmnd *cmd = lrbp->cmd;
+	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, task_tag);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	struct ufs_hw_queue *hwq;
 	void __iomem *reg, *opr_sqd_base;
 	u32 nexus, id, val;
@@ -618,7 +618,8 @@ static void ufshcd_mcq_nullify_sqe(struct utp_transfer_req_desc *utrd)
 static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba,
 				  struct ufs_hw_queue *hwq, int task_tag)
 {
-	struct ufshcd_lrb *lrbp = &hba->lrb[task_tag];
+	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, task_tag);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	struct utp_transfer_req_desc *utrd;
 	__le64  cmd_desc_base_addr;
 	bool ret = false;
@@ -669,7 +670,7 @@ int ufshcd_mcq_abort(struct scsi_cmnd *cmd)
 	struct Scsi_Host *host = cmd->device->host;
 	struct ufs_hba *hba = shost_priv(host);
 	int tag = scsi_cmd_to_rq(cmd)->tag;
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	struct ufs_hw_queue *hwq;
 	int err;
 
diff --git a/drivers/ufs/core/ufshcd-crypto.h b/drivers/ufs/core/ufshcd-crypto.h
index 89bb97c14c15..c148a5194378 100644
--- a/drivers/ufs/core/ufshcd-crypto.h
+++ b/drivers/ufs/core/ufshcd-crypto.h
@@ -38,10 +38,10 @@ ufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp,
 }
 
 static inline int ufshcd_crypto_fill_prdt(struct ufs_hba *hba,
-					  struct ufshcd_lrb *lrbp)
+					  struct scsi_cmnd *cmd)
 {
-	struct scsi_cmnd *cmd = lrbp->cmd;
 	const struct bio_crypt_ctx *crypt_ctx = scsi_cmd_to_rq(cmd)->crypt_ctx;
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 
 	if (crypt_ctx && hba->vops && hba->vops->fill_crypto_prdt)
 		return hba->vops->fill_crypto_prdt(hba, crypt_ctx,
@@ -51,17 +51,19 @@ static inline int ufshcd_crypto_fill_prdt(struct ufs_hba *hba,
 }
 
 static inline void ufshcd_crypto_clear_prdt(struct ufs_hba *hba,
-					    struct ufshcd_lrb *lrbp)
+					    struct scsi_cmnd *cmd)
 {
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+
 	if (!(hba->quirks & UFSHCD_QUIRK_KEYS_IN_PRDT))
 		return;
 
-	if (!(scsi_cmd_to_rq(lrbp->cmd)->crypt_ctx))
+	if (!(scsi_cmd_to_rq(cmd)->crypt_ctx))
 		return;
 
 	/* Zeroize the PRDT because it can contain cryptographic keys. */
 	memzero_explicit(lrbp->ucd_prdt_ptr,
-			 ufshcd_sg_entry_size(hba) * scsi_sg_count(lrbp->cmd));
+			 ufshcd_sg_entry_size(hba) * scsi_sg_count(cmd));
 }
 
 bool ufshcd_crypto_enable(struct ufs_hba *hba);
@@ -82,13 +84,15 @@ ufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp,
 				   struct request_desc_header *h) { }
 
 static inline int ufshcd_crypto_fill_prdt(struct ufs_hba *hba,
-					  struct ufshcd_lrb *lrbp)
+					  struct scsi_cmnd *cmd)
 {
 	return 0;
 }
 
 static inline void ufshcd_crypto_clear_prdt(struct ufs_hba *hba,
-					    struct ufshcd_lrb *lrbp) { }
+					    struct scsi_cmnd *cmd)
+{
+}
 
 static inline bool ufshcd_crypto_enable(struct ufs_hba *hba)
 {
diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
index 749c0ab2a4ca..72d2766b19e3 100644
--- a/drivers/ufs/core/ufshcd-priv.h
+++ b/drivers/ufs/core/ufshcd-priv.h
@@ -77,8 +77,7 @@ bool ufshcd_cmd_inflight(struct scsi_cmnd *cmd);
 int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag);
 int ufshcd_mcq_abort(struct scsi_cmnd *cmd);
 int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag);
-void ufshcd_release_scsi_cmd(struct ufs_hba *hba,
-			     struct ufshcd_lrb *lrbp);
+void ufshcd_release_scsi_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd);
 
 #define SD_ASCII_STD true
 #define SD_RAW false
@@ -363,6 +362,44 @@ static inline bool ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info, u8
 	return lun == UFS_UPIU_RPMB_WLUN || (lun < dev_info->max_lu_supported);
 }
 
+/*
+ * Convert a block layer tag into a SCSI command pointer. This function is
+ * called once per I/O completion path and is also called from error paths.
+ */
+static inline struct scsi_cmnd *ufshcd_tag_to_cmd(struct ufs_hba *hba, u32 tag)
+{
+	struct blk_mq_tags *tags = hba->host->tag_set.shared_tags;
+	struct request *rq;
+
+	/*
+	 * Handle reserved tags differently because the UFS driver does not
+	 * call blk_mq_alloc_request() for allocating reserved requests.
+	 * Allocating reserved tags with blk_mq_alloc_request() would require
+	 * the following:
+	 * - Allocate an additional request queue from &hba->host->tag_set for
+	 *   allocating reserved requests from.
+	 * - For that request queue, allocate a SCSI device.
+	 * - Calling blk_mq_alloc_request(hba->dev_mgmt_queue, REQ_OP_DRV_OUT,
+	 *   BLK_MQ_REQ_RESERVED) for allocating a reserved request and
+	 *   blk_mq_free_request() for freeing reserved requests.
+	 * - Set the .device pointer for these reserved requests.
+	 * - Submit reserved requests with blk_execute_rq().
+	 * - Modify ufshcd_queuecommand() such that it handles reserved requests
+	 *   in another way than SCSI requests.
+	 * - Modify ufshcd_compl_one_cqe() such that it calls scsi_done() for
+	 *   device management commands.
+	 * - Modify all callback functions called by blk_mq_tagset_busy_iter()
+	 *   calls in the UFS driver and skip device management commands.
+	 */
+	rq = tag < UFSHCD_NUM_RESERVED ? tags->static_rqs[tag] :
+					 blk_mq_tag_to_rq(tags, tag);
+
+	if (WARN_ON_ONCE(!rq))
+		return NULL;
+
+	return blk_mq_rq_to_pdu(rq);
+}
+
 static inline void ufshcd_inc_sq_tail(struct ufs_hw_queue *q)
 	__must_hold(&q->sq_lock)
 {
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 1757aa0237da..ce657b2506fb 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -28,6 +28,7 @@
 #include <scsi/scsi_dbg.h>
 #include <scsi/scsi_driver.h>
 #include <scsi/scsi_eh.h>
+#include <scsi/scsi_tcq.h>
 #include "ufshcd-priv.h"
 #include <ufs/ufs_quirks.h>
 #include <ufs/unipro.h>
@@ -483,7 +484,7 @@ static void ufshcd_add_command_trace(struct ufs_hba *hba, struct scsi_cmnd *cmd,
 	u32 hwq_id = 0;
 	struct request *rq = scsi_cmd_to_rq(cmd);
 	unsigned int tag = rq->tag;
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	int transfer_len = -1;
 
 	/* trace UPIU also */
@@ -594,14 +595,13 @@ static void ufshcd_print_evt_hist(struct ufs_hba *hba)
 	ufshcd_vops_dbg_register_dump(hba);
 }
 
-static
-void ufshcd_print_tr(struct ufs_hba *hba, int tag, bool pr_prdt)
+static void ufshcd_print_tr(struct ufs_hba *hba, struct scsi_cmnd *cmd,
+			    bool pr_prdt)
 {
-	const struct ufshcd_lrb *lrbp;
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+	const int tag = lrbp->task_tag;
 	int prdt_length;
 
-	lrbp = &hba->lrb[tag];
-
 	if (hba->monitor.enabled) {
 		dev_err(hba->dev, "UPIU[%d] - issue time %lld us\n", tag,
 			div_u64(lrbp->issue_time_stamp_local_clock, 1000));
@@ -644,7 +644,7 @@ static bool ufshcd_print_tr_iter(struct request *req, void *priv)
 	struct Scsi_Host *shost = sdev->host;
 	struct ufs_hba *hba = shost_priv(shost);
 
-	ufshcd_print_tr(hba, req->tag, *(bool *)priv);
+	ufshcd_print_tr(hba, blk_mq_rq_to_pdu(req), *(bool *)priv);
 
 	return true;
 }
@@ -2298,8 +2298,7 @@ static inline bool ufshcd_should_inform_monitor(struct ufs_hba *hba,
 						struct scsi_cmnd *cmd)
 {
 	const struct ufs_hba_monitor *m = &hba->monitor;
-	struct request *rq = scsi_cmd_to_rq(cmd);
-	struct ufshcd_lrb *lrbp = &hba->lrb[rq->tag];
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 
 	return m->enabled &&
 	       (!m->chunk_size || m->chunk_size == cmd->sdb.length) &&
@@ -2320,7 +2319,7 @@ static void ufshcd_start_monitor(struct ufs_hba *hba, struct scsi_cmnd *cmd)
 static void ufshcd_update_monitor(struct ufs_hba *hba, struct scsi_cmnd *cmd)
 {
 	struct request *req = scsi_cmd_to_rq(cmd);
-	struct ufshcd_lrb *lrbp = &hba->lrb[req->tag];
+	const struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	int dir = ufshcd_monitor_opcode2dir(cmd->cmnd[0]);
 	unsigned long flags;
 
@@ -2350,17 +2349,26 @@ static void ufshcd_update_monitor(struct ufs_hba *hba, struct scsi_cmnd *cmd)
 	spin_unlock_irqrestore(hba->host->host_lock, flags);
 }
 
+/*
+ * Returns %true for SCSI commands and %false for device management commands.
+ * Must not be called for SCSI commands that have not yet been started.
+ */
+static bool ufshcd_is_scsi_cmd(struct scsi_cmnd *cmd)
+{
+	return blk_mq_request_started(scsi_cmd_to_rq(cmd));
+}
+
 /**
  * ufshcd_send_command - Send SCSI or device management commands
  * @hba: per adapter instance
- * @lrbp: Local reference block of SCSI command
+ * @cmd: SCSI command or device management command pointer
  * @hwq: pointer to hardware queue instance
  */
 static inline void ufshcd_send_command(struct ufs_hba *hba,
-				       struct ufshcd_lrb *lrbp,
+				       struct scsi_cmnd *cmd,
 				       struct ufs_hw_queue *hwq)
 {
-	struct scsi_cmnd *cmd = lrbp->cmd;
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	unsigned long flags;
 
 	if (hba->monitor.enabled) {
@@ -2369,7 +2377,7 @@ static inline void ufshcd_send_command(struct ufs_hba *hba,
 		lrbp->compl_time_stamp = ktime_set(0, 0);
 		lrbp->compl_time_stamp_local_clock = 0;
 	}
-	if (cmd) {
+	if (ufshcd_is_scsi_cmd(cmd)) {
 		ufshcd_add_command_trace(hba, cmd, UFS_CMD_SEND);
 		ufshcd_clk_scaling_start_busy(hba);
 		if (unlikely(ufshcd_should_inform_monitor(hba, cmd)))
@@ -2389,7 +2397,8 @@ static inline void ufshcd_send_command(struct ufs_hba *hba,
 	} else {
 		spin_lock_irqsave(&hba->outstanding_lock, flags);
 		if (hba->vops && hba->vops->setup_xfer_req)
-			hba->vops->setup_xfer_req(hba, lrbp->task_tag, !!cmd);
+			hba->vops->setup_xfer_req(hba, lrbp->task_tag,
+						  ufshcd_is_scsi_cmd(cmd));
 		__set_bit(lrbp->task_tag, &hba->outstanding_reqs);
 		ufshcd_writel(hba, 1 << lrbp->task_tag,
 			      REG_UTP_TRANSFER_REQ_DOOR_BELL);
@@ -2399,11 +2408,12 @@ static inline void ufshcd_send_command(struct ufs_hba *hba,
 
 /**
  * ufshcd_copy_sense_data - Copy sense data in case of check condition
- * @lrbp: pointer to local reference block
+ * @cmd: SCSI command
  */
-static inline void ufshcd_copy_sense_data(struct ufshcd_lrb *lrbp)
+static inline void ufshcd_copy_sense_data(struct scsi_cmnd *cmd)
 {
-	u8 *const sense_buffer = lrbp->cmd->sense_buffer;
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+	u8 *const sense_buffer = cmd->sense_buffer;
 	u16 resp_len;
 	int len;
 
@@ -2708,13 +2718,13 @@ static void ufshcd_sgl_to_prdt(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, int
 /**
  * ufshcd_map_sg - Map scatter-gather list to prdt
  * @hba: per adapter instance
- * @lrbp: pointer to local reference block
+ * @cmd: SCSI command
  *
  * Return: 0 in case of success, non-zero value in case of failure.
  */
-static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
+static int ufshcd_map_sg(struct ufs_hba *hba, struct scsi_cmnd *cmd)
 {
-	struct scsi_cmnd *cmd = lrbp->cmd;
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	int sg_segments = scsi_dma_map(cmd);
 
 	if (sg_segments < 0)
@@ -2722,7 +2732,7 @@ static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
 
 	ufshcd_sgl_to_prdt(hba, lrbp, sg_segments, scsi_sglist(cmd));
 
-	return ufshcd_crypto_fill_prdt(hba, lrbp);
+	return ufshcd_crypto_fill_prdt(hba, cmd);
 }
 
 /**
@@ -2781,13 +2791,13 @@ ufshcd_prepare_req_desc_hdr(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 /**
  * ufshcd_prepare_utp_scsi_cmd_upiu() - fills the utp_transfer_req_desc,
  * for scsi commands
- * @lrbp: local reference block pointer
+ * @cmd: SCSI command
  * @upiu_flags: flags
  */
-static
-void ufshcd_prepare_utp_scsi_cmd_upiu(struct ufshcd_lrb *lrbp, u8 upiu_flags)
+static void ufshcd_prepare_utp_scsi_cmd_upiu(struct scsi_cmnd *cmd,
+					     u8 upiu_flags)
 {
-	struct scsi_cmnd *cmd = lrbp->cmd;
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	struct utp_upiu_req *ucd_req_ptr = lrbp->ucd_req_ptr;
 	unsigned short cdb_len;
 
@@ -2890,22 +2900,25 @@ static int ufshcd_compose_devman_upiu(struct ufs_hba *hba,
  * ufshcd_comp_scsi_upiu - UFS Protocol Information Unit(UPIU)
  *			   for SCSI Purposes
  * @hba: per adapter instance
- * @lrbp: pointer to local reference block
+ * @cmd: SCSI command
  */
-static void ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
+static void ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct scsi_cmnd *cmd)
 {
-	struct request *rq = scsi_cmd_to_rq(lrbp->cmd);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+	struct request *rq = scsi_cmd_to_rq(cmd);
 	unsigned int ioprio_class = IOPRIO_PRIO_CLASS(req_get_ioprio(rq));
 	u8 upiu_flags;
 
-	ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, lrbp->cmd->sc_data_direction, 0);
+	ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags,
+				    cmd->sc_data_direction, 0);
 	if (ioprio_class == IOPRIO_CLASS_RT)
 		upiu_flags |= UPIU_CMD_FLAGS_CP;
-	ufshcd_prepare_utp_scsi_cmd_upiu(lrbp, upiu_flags);
+	ufshcd_prepare_utp_scsi_cmd_upiu(cmd, upiu_flags);
 }
 
-static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i)
+static void ufshcd_init_lrb(struct ufs_hba *hba, struct scsi_cmnd *cmd)
 {
+	const int i = scsi_cmd_to_rq(cmd)->tag;
 	struct utp_transfer_cmd_desc *cmd_descp =
 		(void *)hba->ucdl_base_addr + i * ufshcd_get_ucd_size(hba);
 	struct utp_transfer_req_desc *utrdlp = hba->utrdl_base_addr;
@@ -2913,6 +2926,7 @@ static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i)
 		hba->ucdl_dma_addr + i * ufshcd_get_ucd_size(hba);
 	u16 response_offset = le16_to_cpu(utrdlp[i].response_upiu_offset);
 	u16 prdt_offset = le16_to_cpu(utrdlp[i].prd_table_offset);
+	struct ufshcd_lrb *lrb = scsi_cmd_priv(cmd);
 
 	lrb->utr_descriptor_ptr = utrdlp + i;
 	lrb->utrd_dma_addr =
@@ -2925,27 +2939,31 @@ static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i)
 	lrb->ucd_prdt_dma_addr = cmd_desc_element_addr + prdt_offset;
 }
 
-static void __ufshcd_setup_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
-			       struct scsi_cmnd *cmd, u8 lun, int tag)
+static void __ufshcd_setup_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd,
+			       u8 lun, int tag)
 {
-	ufshcd_init_lrb(hba, lrbp, tag);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+
+	ufshcd_init_lrb(hba, cmd);
 
 	memset(lrbp->ucd_req_ptr, 0, sizeof(*lrbp->ucd_req_ptr));
 
-	lrbp->cmd = cmd;
 	lrbp->task_tag = tag;
 	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);
 }
 
-static void ufshcd_setup_scsi_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
-				  struct scsi_cmnd *cmd, u8 lun, int tag)
+static void ufshcd_setup_scsi_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd,
+				  u8 lun, int tag)
 {
-	__ufshcd_setup_cmd(hba, lrbp, cmd, lun, tag);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+
+	__ufshcd_setup_cmd(hba, cmd, lun, tag);
 	lrbp->intr_cmd = !ufshcd_is_intr_aggr_allowed(hba);
 	lrbp->req_abort_skip = false;
 
-	ufshcd_comp_scsi_upiu(hba, lrbp);
+	ufshcd_comp_scsi_upiu(hba, cmd);
 }
 
 /**
@@ -3016,7 +3034,6 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 {
 	struct ufs_hba *hba = shost_priv(host);
 	int tag = scsi_cmd_to_rq(cmd)->tag;
-	struct ufshcd_lrb *lrbp;
 	int err = 0;
 	struct ufs_hw_queue *hwq = NULL;
 
@@ -3067,11 +3084,10 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 
 	ufshcd_hold(hba);
 
-	lrbp = &hba->lrb[tag];
-
-	ufshcd_setup_scsi_cmd(hba, lrbp, cmd, ufshcd_scsi_to_upiu_lun(cmd->device->lun), tag);
+	ufshcd_setup_scsi_cmd(hba, cmd,
+			      ufshcd_scsi_to_upiu_lun(cmd->device->lun), tag);
 
-	err = ufshcd_map_sg(hba, lrbp);
+	err = ufshcd_map_sg(hba, cmd);
 	if (err) {
 		ufshcd_release(hba);
 		goto out;
@@ -3080,7 +3096,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	if (hba->mcq_enabled)
 		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(cmd));
 
-	ufshcd_send_command(hba, lrbp, hwq);
+	ufshcd_send_command(hba, cmd, hwq);
 
 out:
 	if (ufs_trigger_eh(hba)) {
@@ -3094,10 +3110,12 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	return err;
 }
 
-static void ufshcd_setup_dev_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
-			     enum dev_cmd_type cmd_type, u8 lun, int tag)
+static void ufshcd_setup_dev_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd,
+				 enum dev_cmd_type cmd_type, u8 lun, int tag)
 {
-	__ufshcd_setup_cmd(hba, lrbp, NULL, lun, tag);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+
+	__ufshcd_setup_cmd(hba, cmd, lun, tag);
 	lrbp->intr_cmd = true; /* No interrupt aggregation */
 	hba->dev_cmd.type = cmd_type;
 }
@@ -3105,10 +3123,12 @@ static void ufshcd_setup_dev_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 /*
  * Return: 0 upon success; < 0 upon failure.
  */
-static int ufshcd_compose_dev_cmd(struct ufs_hba *hba,
-		struct ufshcd_lrb *lrbp, enum dev_cmd_type cmd_type, int tag)
+static int ufshcd_compose_dev_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd,
+				  enum dev_cmd_type cmd_type, int tag)
 {
-	ufshcd_setup_dev_cmd(hba, lrbp, cmd_type, 0, tag);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+
+	ufshcd_setup_dev_cmd(hba, cmd, cmd_type, 0, tag);
 
 	return ufshcd_compose_devman_upiu(hba, lrbp);
 }
@@ -3320,13 +3340,14 @@ static void ufshcd_dev_man_unlock(struct ufs_hba *hba)
  * Return: 0 upon success; > 0 in case the UFS device reported an OCS error;
  * < 0 if another error occurred.
  */
-static int ufshcd_issue_dev_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
-			  const u32 tag, int timeout)
+static int ufshcd_issue_dev_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd,
+				const u32 tag, int timeout)
 {
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	int err;
 
 	ufshcd_add_query_upiu_trace(hba, UFS_QUERY_SEND, lrbp->ucd_req_ptr);
-	ufshcd_send_command(hba, lrbp, hba->dev_cmd_queue);
+	ufshcd_send_command(hba, cmd, hba->dev_cmd_queue);
 	err = ufshcd_wait_for_dev_cmd(hba, lrbp, timeout);
 
 	ufshcd_add_query_upiu_trace(hba, err ? UFS_QUERY_ERR : UFS_QUERY_COMP,
@@ -3351,17 +3372,17 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
 		enum dev_cmd_type cmd_type, int timeout)
 {
 	const u32 tag = hba->reserved_slot;
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
+	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, tag);
 	int err;
 
 	/* Protects use of hba->reserved_slot. */
 	lockdep_assert_held(&hba->dev_cmd.lock);
 
-	err = ufshcd_compose_dev_cmd(hba, lrbp, cmd_type, tag);
+	err = ufshcd_compose_dev_cmd(hba, cmd, cmd_type, tag);
 	if (unlikely(err))
 		return err;
 
-	return ufshcd_issue_dev_cmd(hba, lrbp, tag, timeout);
+	return ufshcd_issue_dev_cmd(hba, cmd, tag, timeout);
 }
 
 /**
@@ -3991,14 +4012,6 @@ static int ufshcd_memory_alloc(struct ufs_hba *hba)
 	}
 
 skip_utmrdl:
-	/* Allocate memory for local reference block */
-	hba->lrb = devm_kcalloc(hba->dev,
-				hba->nutrs, sizeof(struct ufshcd_lrb),
-				GFP_KERNEL);
-	if (!hba->lrb) {
-		dev_err(hba->dev, "LRB Memory allocation failed\n");
-		goto out;
-	}
 	return 0;
 out:
 	return -ENOMEM;
@@ -5411,19 +5424,18 @@ static void ufshcd_sdev_destroy(struct scsi_device *sdev)
 
 /**
  * ufshcd_scsi_cmd_status - Update SCSI command result based on SCSI status
- * @lrbp: pointer to local reference block of completed command
+ * @cmd: SCSI command
  * @scsi_status: SCSI command status
  *
  * Return: value base on SCSI command status.
  */
-static inline int
-ufshcd_scsi_cmd_status(struct ufshcd_lrb *lrbp, int scsi_status)
+static inline int ufshcd_scsi_cmd_status(struct scsi_cmnd *cmd, int scsi_status)
 {
 	int result = 0;
 
 	switch (scsi_status) {
 	case SAM_STAT_CHECK_CONDITION:
-		ufshcd_copy_sense_data(lrbp);
+		ufshcd_copy_sense_data(cmd);
 		fallthrough;
 	case SAM_STAT_GOOD:
 		result |= DID_OK << 16 | scsi_status;
@@ -5431,7 +5443,7 @@ ufshcd_scsi_cmd_status(struct ufshcd_lrb *lrbp, int scsi_status)
 	case SAM_STAT_TASK_SET_FULL:
 	case SAM_STAT_BUSY:
 	case SAM_STAT_TASK_ABORTED:
-		ufshcd_copy_sense_data(lrbp);
+		ufshcd_copy_sense_data(cmd);
 		result |= scsi_status;
 		break;
 	default:
@@ -5445,15 +5457,16 @@ ufshcd_scsi_cmd_status(struct ufshcd_lrb *lrbp, int scsi_status)
 /**
  * ufshcd_transfer_rsp_status - Get overall status of the response
  * @hba: per adapter instance
- * @lrbp: pointer to local reference block of completed command
+ * @cmd: SCSI command
  * @cqe: pointer to the completion queue entry
  *
  * Return: result of the command to notify SCSI midlayer.
  */
-static inline int
-ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
-			   struct cq_entry *cqe)
+static inline int ufshcd_transfer_rsp_status(struct ufs_hba *hba,
+					     struct scsi_cmnd *cmd,
+					     struct cq_entry *cqe)
 {
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	int result = 0;
 	int scsi_status;
 	enum utp_ocs ocs;
@@ -5467,7 +5480,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 	 * not set either flag.
 	 */
 	if (resid && !(upiu_flags & UPIU_RSP_FLAG_OVERFLOW))
-		scsi_set_resid(lrbp->cmd, resid);
+		scsi_set_resid(cmd, resid);
 
 	/* overall command status of utrd */
 	ocs = ufshcd_get_tr_ocs(lrbp, cqe);
@@ -5488,7 +5501,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 			 * to notify the SCSI midlayer of the command status
 			 */
 			scsi_status = lrbp->ucd_rsp_ptr->header.status;
-			result = ufshcd_scsi_cmd_status(lrbp, scsi_status);
+			result = ufshcd_scsi_cmd_status(cmd, scsi_status);
 
 			/*
 			 * Currently we are only supporting BKOPs exception
@@ -5553,7 +5566,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
 	    (host_byte(result) != DID_REQUEUE) && !hba->silence_err_logs) {
 		if (cqe)
 			ufshcd_hex_dump("UPIU CQE: ", cqe, sizeof(struct cq_entry));
-		ufshcd_print_tr(hba, lrbp->task_tag, true);
+		ufshcd_print_tr(hba, cmd, true);
 	}
 	return result;
 }
@@ -5620,13 +5633,10 @@ static irqreturn_t ufshcd_uic_cmd_compl(struct ufs_hba *hba, u32 intr_status)
 }
 
 /* Release the resources allocated for processing a SCSI command. */
-void ufshcd_release_scsi_cmd(struct ufs_hba *hba,
-			     struct ufshcd_lrb *lrbp)
+void ufshcd_release_scsi_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd)
 {
-	struct scsi_cmnd *cmd = lrbp->cmd;
-
 	scsi_dma_unmap(cmd);
-	ufshcd_crypto_clear_prdt(hba, lrbp);
+	ufshcd_crypto_clear_prdt(hba, cmd);
 	ufshcd_release(hba);
 	ufshcd_clk_scaling_update_busy(hba);
 }
@@ -5640,20 +5650,20 @@ void ufshcd_release_scsi_cmd(struct ufs_hba *hba,
 void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
 			  struct cq_entry *cqe)
 {
-	struct ufshcd_lrb *lrbp = &hba->lrb[task_tag];
-	struct scsi_cmnd *cmd = lrbp->cmd;
+	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, task_tag);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	enum utp_ocs ocs;
 
 	if (hba->monitor.enabled) {
 		lrbp->compl_time_stamp = ktime_get();
 		lrbp->compl_time_stamp_local_clock = local_clock();
 	}
-	if (cmd) {
+	if (ufshcd_is_scsi_cmd(cmd)) {
 		if (unlikely(ufshcd_should_inform_monitor(hba, cmd)))
 			ufshcd_update_monitor(hba, cmd);
 		ufshcd_add_command_trace(hba, cmd, UFS_CMD_COMP);
-		cmd->result = ufshcd_transfer_rsp_status(hba, lrbp, cqe);
-		ufshcd_release_scsi_cmd(hba, lrbp);
+		cmd->result = ufshcd_transfer_rsp_status(hba, cmd, cqe);
+		ufshcd_release_scsi_cmd(hba, cmd);
 		/* Do not touch lrbp after scsi done */
 		scsi_done(cmd);
 	} else {
@@ -5690,7 +5700,7 @@ static void ufshcd_clear_polled(struct ufs_hba *hba,
 	int tag;
 
 	for_each_set_bit(tag, completed_reqs, hba->nutrs) {
-		struct scsi_cmnd *cmd = hba->lrb[tag].cmd;
+		struct scsi_cmnd *cmd = scsi_host_find_tag(hba->host, tag);
 
 		if (!cmd)
 			continue;
@@ -5741,7 +5751,6 @@ static bool ufshcd_mcq_force_compl_one(struct request *rq, void *priv)
 	struct scsi_device *sdev = rq->q->queuedata;
 	struct Scsi_Host *shost = sdev->host;
 	struct ufs_hba *hba = shost_priv(shost);
-	struct ufshcd_lrb *lrbp = &hba->lrb[rq->tag];
 	struct ufs_hw_queue *hwq = ufshcd_mcq_req_to_hwq(hba, rq);
 
 	if (!hwq)
@@ -5756,7 +5765,7 @@ static bool ufshcd_mcq_force_compl_one(struct request *rq, void *priv)
 	scoped_guard(spinlock_irqsave, &hwq->cq_lock) {
 		if (!test_bit(SCMD_STATE_COMPLETE, &cmd->state)) {
 			set_host_byte(cmd, DID_REQUEUE);
-			ufshcd_release_scsi_cmd(hba, lrbp);
+			ufshcd_release_scsi_cmd(hba, cmd);
 			scsi_done(cmd);
 		}
 	}
@@ -6641,7 +6650,7 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
 
 	*ret = ufshcd_try_to_abort_task(hba, tag);
 	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
-		hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
+		ufshcd_is_scsi_cmd(cmd) ? cmd->cmnd[0] : -1,
 		*ret ? "failed" : "succeeded");
 
 	return *ret == 0;
@@ -7371,14 +7380,15 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 					enum query_opcode desc_op)
 {
 	const u32 tag = hba->reserved_slot;
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
+	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, tag);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	int err = 0;
 	u8 upiu_flags;
 
 	/* Protects use of hba->reserved_slot. */
 	lockdep_assert_held(&hba->dev_cmd.lock);
 
-	ufshcd_setup_dev_cmd(hba, lrbp, cmd_type, 0, tag);
+	ufshcd_setup_dev_cmd(hba, cmd, cmd_type, 0, tag);
 
 	ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE, 0);
 
@@ -7403,7 +7413,7 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 	 * bound to fail since dev_cmd.query and dev_cmd.type were left empty.
 	 * read the response directly ignoring all errors.
 	 */
-	ufshcd_issue_dev_cmd(hba, lrbp, tag, dev_cmd_timeout);
+	ufshcd_issue_dev_cmd(hba, cmd, tag, dev_cmd_timeout);
 
 	/* just copy the upiu response as it is */
 	memcpy(rsp_upiu, lrbp->ucd_rsp_ptr, sizeof(*rsp_upiu));
@@ -7518,7 +7528,8 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 			 enum dma_data_direction dir)
 {
 	const u32 tag = hba->reserved_slot;
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
+	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, tag);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	int err = 0;
 	int result;
 	u8 upiu_flags;
@@ -7529,7 +7540,8 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 	/* Protects use of hba->reserved_slot. */
 	ufshcd_dev_man_lock(hba);
 
-	ufshcd_setup_dev_cmd(hba, lrbp, DEV_CMD_TYPE_RPMB, UFS_UPIU_RPMB_WLUN, tag);
+	ufshcd_setup_dev_cmd(hba, cmd, DEV_CMD_TYPE_RPMB, UFS_UPIU_RPMB_WLUN,
+			     tag);
 
 	ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE, ehs);
 
@@ -7546,7 +7558,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 
 	memset(lrbp->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp));
 
-	err = ufshcd_issue_dev_cmd(hba, lrbp, tag, ADVANCED_RPMB_REQ_TIMEOUT);
+	err = ufshcd_issue_dev_cmd(hba, cmd, tag, ADVANCED_RPMB_REQ_TIMEOUT);
 
 	if (!err) {
 		/* Just copy the upiu response as it is */
@@ -7647,11 +7659,12 @@ static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
 
 static void ufshcd_set_req_abort_skip(struct ufs_hba *hba, unsigned long bitmap)
 {
-	struct ufshcd_lrb *lrbp;
 	int tag;
 
 	for_each_set_bit(tag, &bitmap, hba->nutrs) {
-		lrbp = &hba->lrb[tag];
+		struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, tag);
+		struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+
 		lrbp->req_abort_skip = true;
 	}
 }
@@ -7659,7 +7672,7 @@ static void ufshcd_set_req_abort_skip(struct ufs_hba *hba, unsigned long bitmap)
 /**
  * ufshcd_try_to_abort_task - abort a specific task
  * @hba: Pointer to adapter instance
- * @tag: Task tag/index to be aborted
+ * @tag: Tag of the task to be aborted
  *
  * Abort the pending command in device by sending UFS_ABORT_TASK task management
  * command, and in host controller by clearing the door-bell register. There can
@@ -7671,7 +7684,8 @@ static void ufshcd_set_req_abort_skip(struct ufs_hba *hba, unsigned long bitmap)
  */
 int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
 {
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
+	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, tag);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	int err;
 	int poll_cnt;
 	u8 resp = 0xF;
@@ -7693,7 +7707,7 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
 				hba->dev,
 				"%s: cmd with tag %d not pending in the device.\n",
 				__func__, tag);
-			if (!ufshcd_cmd_inflight(lrbp->cmd)) {
+			if (!ufshcd_cmd_inflight(cmd)) {
 				dev_info(hba->dev,
 					 "%s: cmd with tag=%d completed.\n",
 					 __func__, tag);
@@ -7741,7 +7755,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
 	struct Scsi_Host *host = cmd->device->host;
 	struct ufs_hba *hba = shost_priv(host);
 	int tag = scsi_cmd_to_rq(cmd)->tag;
-	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	unsigned long flags;
 	int err = FAILED;
 	bool outstanding;
@@ -7776,9 +7790,9 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
 		ufshcd_print_evt_hist(hba);
 		ufshcd_print_host_state(hba);
 		ufshcd_print_pwr_info(hba);
-		ufshcd_print_tr(hba, tag, true);
+		ufshcd_print_tr(hba, cmd, true);
 	} else {
-		ufshcd_print_tr(hba, tag, false);
+		ufshcd_print_tr(hba, cmd, false);
 	}
 	hba->req_abort_count++;
 
@@ -7822,7 +7836,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
 		goto release;
 	}
 
-	err = ufshcd_try_to_abort_task(hba, tag);
+	err = ufshcd_try_to_abort_task(hba, lrbp->task_tag);
 	if (err) {
 		dev_err(hba->dev, "%s: failed with err %d\n", __func__, err);
 		ufshcd_set_req_abort_skip(hba, hba->outstanding_reqs);
@@ -7839,7 +7853,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
 	spin_unlock_irqrestore(&hba->outstanding_lock, flags);
 
 	if (outstanding)
-		ufshcd_release_scsi_cmd(hba, lrbp);
+		ufshcd_release_scsi_cmd(hba, cmd);
 
 	err = SUCCESS;
 
@@ -8919,8 +8933,6 @@ static void ufshcd_release_sdb_queue(struct ufs_hba *hba, int nutrs)
 	utrdl_size = sizeof(struct utp_transfer_req_desc) * nutrs;
 	dmam_free_coherent(hba->dev, utrdl_size, hba->utrdl_base_addr,
 			   hba->utrdl_dma_addr);
-
-	devm_kfree(hba->dev, hba->lrb);
 }
 
 static int ufshcd_alloc_mcq(struct ufs_hba *hba)
@@ -9191,6 +9203,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,
 	.nr_reserved_cmds	= UFSHCD_NUM_RESERVED,
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 00152e135fc9..fbed47b6c61f 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -161,7 +161,6 @@ struct ufs_pm_lvl_states {
  * @ucd_prdt_dma_addr: PRDT dma address for debug
  * @ucd_rsp_dma_addr: UPIU response dma address for debug
  * @ucd_req_dma_addr: UPIU request dma address for debug
- * @cmd: pointer to SCSI command
  * @scsi_status: SCSI status of the command
  * @command_type: SCSI, UFS, Query.
  * @task_tag: Task tag of the command
@@ -186,7 +185,6 @@ struct ufshcd_lrb {
 	dma_addr_t ucd_rsp_dma_addr;
 	dma_addr_t ucd_prdt_dma_addr;
 
-	struct scsi_cmnd *cmd;
 	int scsi_status;
 
 	int command_type;
@@ -833,7 +831,6 @@ enum ufshcd_mcq_opr {
  * @spm_lvl: desired UFS power management level during system PM.
  * @pm_op_in_progress: whether or not a PM operation is in progress.
  * @ahit: value of Auto-Hibernate Idle Timer register.
- * @lrb: local reference block
  * @outstanding_tasks: Bits representing outstanding task requests
  * @outstanding_lock: Protects @outstanding_reqs.
  * @outstanding_reqs: Bits representing outstanding transfer requests
@@ -976,8 +973,6 @@ struct ufs_hba {
 	/* Auto-Hibernate Idle Timer register value */
 	u32 ahit;
 
-	struct ufshcd_lrb *lrb;
-
 	unsigned long outstanding_tasks;
 	spinlock_t outstanding_lock;
 	unsigned long outstanding_reqs;

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

* [PATCH v8 24/28] ufs: core: Pass a SCSI pointer instead of an LRB pointer
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (22 preceding siblings ...)
  2025-10-31 20:39 ` [PATCH v8 23/28] ufs: core: Optimize the hot path Bart Van Assche
@ 2025-10-31 20:39 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 25/28] ufs: core: Remove the ufshcd_lrb task_tag member Bart Van Assche
                   ` (6 subsequent siblings)
  30 siblings, 0 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, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter

Pass a pointer to a SCSI command between functions instead of an LRB
pointer. This change prepares for removing the ufshcd_lrb task_tag
member.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index ce657b2506fb..cf2c08baa9ae 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2822,12 +2822,13 @@ static void ufshcd_prepare_utp_scsi_cmd_upiu(struct scsi_cmnd *cmd,
 /**
  * ufshcd_prepare_utp_query_req_upiu() - fill the utp_transfer_req_desc for query request
  * @hba: UFS hba
- * @lrbp: local reference block pointer
+ * @cmd: SCSI command pointer
  * @upiu_flags: flags
  */
 static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba,
-				struct ufshcd_lrb *lrbp, u8 upiu_flags)
+				struct scsi_cmnd *cmd, u8 upiu_flags)
 {
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	struct utp_upiu_req *ucd_req_ptr = lrbp->ucd_req_ptr;
 	struct ufs_query *query = &hba->dev_cmd.query;
 	u16 len = be16_to_cpu(query->request.upiu_req.length);
@@ -2856,8 +2857,9 @@ static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba,
 		memcpy(ucd_req_ptr + 1, query->descriptor, len);
 }
 
-static inline void ufshcd_prepare_utp_nop_upiu(struct ufshcd_lrb *lrbp)
+static inline void ufshcd_prepare_utp_nop_upiu(struct scsi_cmnd *cmd)
 {
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	struct utp_upiu_req *ucd_req_ptr = lrbp->ucd_req_ptr;
 
 	memset(ucd_req_ptr, 0, sizeof(struct utp_upiu_req));
@@ -2872,22 +2874,23 @@ static inline void ufshcd_prepare_utp_nop_upiu(struct ufshcd_lrb *lrbp)
  * ufshcd_compose_devman_upiu - UFS Protocol Information Unit(UPIU)
  *			     for Device Management Purposes
  * @hba: per adapter instance
- * @lrbp: pointer to local reference block
+ * @cmd: SCSI command pointer
  *
  * Return: 0 upon success; < 0 upon failure.
  */
 static int ufshcd_compose_devman_upiu(struct ufs_hba *hba,
-				      struct ufshcd_lrb *lrbp)
+				      struct scsi_cmnd *cmd)
 {
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	u8 upiu_flags;
 	int ret = 0;
 
 	ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE, 0);
 
 	if (hba->dev_cmd.type == DEV_CMD_TYPE_QUERY)
-		ufshcd_prepare_utp_query_req_upiu(hba, lrbp, upiu_flags);
+		ufshcd_prepare_utp_query_req_upiu(hba, cmd, upiu_flags);
 	else if (hba->dev_cmd.type == DEV_CMD_TYPE_NOP)
-		ufshcd_prepare_utp_nop_upiu(lrbp);
+		ufshcd_prepare_utp_nop_upiu(cmd);
 	else
 		ret = -EINVAL;
 
@@ -3126,11 +3129,9 @@ static void ufshcd_setup_dev_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd,
 static int ufshcd_compose_dev_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd,
 				  enum dev_cmd_type cmd_type, int tag)
 {
-	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
-
 	ufshcd_setup_dev_cmd(hba, cmd, cmd_type, 0, tag);
 
-	return ufshcd_compose_devman_upiu(hba, lrbp);
+	return ufshcd_compose_devman_upiu(hba, cmd);
 }
 
 /*

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

* [PATCH v8 25/28] ufs: core: Remove the ufshcd_lrb task_tag member
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (23 preceding siblings ...)
  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 ` 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
                   ` (5 subsequent siblings)
  30 siblings, 0 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, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter,
	Manivannan Sadhasivam, Can Guo, Eric Biggers, Nitin Rawat,
	Neil Armstrong

Remove the ufshcd_lrb task_tag member and use scsi_cmd_to_rq(cmd)->tag
instead. Use rq->tag instead of lrbp->task_tag. This patch reduces the
size of struct ufshcd_lrb.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 62 +++++++++++++++++++--------------------
 include/ufs/ufshcd.h      |  1 -
 2 files changed, 30 insertions(+), 33 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index cf2c08baa9ae..3e0fa433579d 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -599,7 +599,7 @@ static void ufshcd_print_tr(struct ufs_hba *hba, struct scsi_cmnd *cmd,
 			    bool pr_prdt)
 {
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
-	const int tag = lrbp->task_tag;
+	const int tag = scsi_cmd_to_rq(cmd)->tag;
 	int prdt_length;
 
 	if (hba->monitor.enabled) {
@@ -2369,6 +2369,7 @@ static inline void ufshcd_send_command(struct ufs_hba *hba,
 				       struct ufs_hw_queue *hwq)
 {
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+	const int tag = scsi_cmd_to_rq(cmd)->tag;
 	unsigned long flags;
 
 	if (hba->monitor.enabled) {
@@ -2397,11 +2398,10 @@ static inline void ufshcd_send_command(struct ufs_hba *hba,
 	} else {
 		spin_lock_irqsave(&hba->outstanding_lock, flags);
 		if (hba->vops && hba->vops->setup_xfer_req)
-			hba->vops->setup_xfer_req(hba, lrbp->task_tag,
+			hba->vops->setup_xfer_req(hba, tag,
 						  ufshcd_is_scsi_cmd(cmd));
-		__set_bit(lrbp->task_tag, &hba->outstanding_reqs);
-		ufshcd_writel(hba, 1 << lrbp->task_tag,
-			      REG_UTP_TRANSFER_REQ_DOOR_BELL);
+		__set_bit(tag, &hba->outstanding_reqs);
+		ufshcd_writel(hba, 1 << tag, REG_UTP_TRANSFER_REQ_DOOR_BELL);
 		spin_unlock_irqrestore(&hba->outstanding_lock, flags);
 	}
 }
@@ -2798,6 +2798,7 @@ static void ufshcd_prepare_utp_scsi_cmd_upiu(struct scsi_cmnd *cmd,
 					     u8 upiu_flags)
 {
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+	const int tag = scsi_cmd_to_rq(cmd)->tag;
 	struct utp_upiu_req *ucd_req_ptr = lrbp->ucd_req_ptr;
 	unsigned short cdb_len;
 
@@ -2805,11 +2806,11 @@ static void ufshcd_prepare_utp_scsi_cmd_upiu(struct scsi_cmnd *cmd,
 		.transaction_code = UPIU_TRANSACTION_COMMAND,
 		.flags = upiu_flags,
 		.lun = lrbp->lun,
-		.task_tag = lrbp->task_tag,
+		.task_tag = tag,
 		.command_set_type = UPIU_COMMAND_SET_TYPE_SCSI,
 	};
 
-	WARN_ON_ONCE(ucd_req_ptr->header.task_tag != lrbp->task_tag);
+	WARN_ON_ONCE(ucd_req_ptr->header.task_tag != tag);
 
 	ucd_req_ptr->sc.exp_data_transfer_len = cpu_to_be32(cmd->sdb.length);
 
@@ -2830,6 +2831,7 @@ static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba,
 {
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	struct utp_upiu_req *ucd_req_ptr = lrbp->ucd_req_ptr;
+	const int tag = scsi_cmd_to_rq(cmd)->tag;
 	struct ufs_query *query = &hba->dev_cmd.query;
 	u16 len = be16_to_cpu(query->request.upiu_req.length);
 
@@ -2838,7 +2840,7 @@ static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba,
 		.transaction_code = UPIU_TRANSACTION_QUERY_REQ,
 		.flags = upiu_flags,
 		.lun = lrbp->lun,
-		.task_tag = lrbp->task_tag,
+		.task_tag = tag,
 		.query_function = query->request.query_func,
 		/* Data segment length only need for WRITE_DESC */
 		.data_segment_length =
@@ -2861,12 +2863,13 @@ static inline void ufshcd_prepare_utp_nop_upiu(struct scsi_cmnd *cmd)
 {
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	struct utp_upiu_req *ucd_req_ptr = lrbp->ucd_req_ptr;
+	const int tag = scsi_cmd_to_rq(cmd)->tag;
 
 	memset(ucd_req_ptr, 0, sizeof(struct utp_upiu_req));
 
 	ucd_req_ptr->header = (struct utp_upiu_header){
 		.transaction_code = UPIU_TRANSACTION_NOP_OUT,
-		.task_tag = lrbp->task_tag,
+		.task_tag = tag,
 	};
 }
 
@@ -2951,7 +2954,6 @@ 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->task_tag = tag;
 	lrbp->lun = lun;
 	ufshcd_prepare_lrbp_crypto(ufshcd_is_scsi_cmd(cmd) ?
 				   scsi_cmd_to_rq(cmd) : NULL, lrbp);
@@ -3249,6 +3251,8 @@ ufshcd_dev_cmd_completion(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
 static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
 		struct ufshcd_lrb *lrbp, int max_timeout)
 {
+	struct scsi_cmnd *cmd = (struct scsi_cmnd *)lrbp - 1;
+	const int tag = scsi_cmd_to_rq(cmd)->tag;
 	unsigned long time_left = msecs_to_jiffies(max_timeout);
 	unsigned long flags;
 	bool pending;
@@ -3265,18 +3269,18 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
 	} else {
 		err = -ETIMEDOUT;
 		dev_dbg(hba->dev, "%s: dev_cmd request timedout, tag %d\n",
-			__func__, lrbp->task_tag);
+			__func__, tag);
 
 		/* MCQ mode */
 		if (hba->mcq_enabled) {
 			/* successfully cleared the command, retry if needed */
-			if (ufshcd_clear_cmd(hba, lrbp->task_tag) == 0)
+			if (ufshcd_clear_cmd(hba, tag) == 0)
 				err = -EAGAIN;
 			return err;
 		}
 
 		/* SDB mode */
-		if (ufshcd_clear_cmd(hba, lrbp->task_tag) == 0) {
+		if (ufshcd_clear_cmd(hba, tag) == 0) {
 			/* successfully cleared the command, retry if needed */
 			err = -EAGAIN;
 			/*
@@ -3285,11 +3289,9 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
 			 * variable.
 			 */
 			spin_lock_irqsave(&hba->outstanding_lock, flags);
-			pending = test_bit(lrbp->task_tag,
-					   &hba->outstanding_reqs);
+			pending = test_bit(tag, &hba->outstanding_reqs);
 			if (pending)
-				__clear_bit(lrbp->task_tag,
-					    &hba->outstanding_reqs);
+				__clear_bit(tag, &hba->outstanding_reqs);
 			spin_unlock_irqrestore(&hba->outstanding_lock, flags);
 
 			if (!pending) {
@@ -3302,11 +3304,10 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
 			}
 		} else {
 			dev_err(hba->dev, "%s: failed to clear tag %d\n",
-				__func__, lrbp->task_tag);
+				__func__, tag);
 
 			spin_lock_irqsave(&hba->outstanding_lock, flags);
-			pending = test_bit(lrbp->task_tag,
-					   &hba->outstanding_reqs);
+			pending = test_bit(tag, &hba->outstanding_reqs);
 			spin_unlock_irqrestore(&hba->outstanding_lock, flags);
 
 			if (!pending) {
@@ -5468,6 +5469,7 @@ static inline int ufshcd_transfer_rsp_status(struct ufs_hba *hba,
 					     struct cq_entry *cqe)
 {
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+	const int tag = scsi_cmd_to_rq(cmd)->tag;
 	int result = 0;
 	int scsi_status;
 	enum utp_ocs ocs;
@@ -5539,10 +5541,8 @@ static inline int ufshcd_transfer_rsp_status(struct ufs_hba *hba,
 	case OCS_ABORTED:
 	case OCS_INVALID_COMMAND_STATUS:
 		result |= DID_REQUEUE << 16;
-		dev_warn(hba->dev,
-				"OCS %s from controller for tag %d\n",
-				(ocs == OCS_ABORTED ? "aborted" : "invalid"),
-				lrbp->task_tag);
+		dev_warn(hba->dev, "OCS %s from controller for tag %d\n",
+			 ocs == OCS_ABORTED ? "aborted" : "invalid", tag);
 		break;
 	case OCS_INVALID_CMD_TABLE_ATTR:
 	case OCS_INVALID_PRDT_ATTR:
@@ -5555,9 +5555,8 @@ static inline int ufshcd_transfer_rsp_status(struct ufs_hba *hba,
 	case OCS_GENERAL_CRYPTO_ERROR:
 	default:
 		result |= DID_ERROR << 16;
-		dev_err(hba->dev,
-				"OCS error from controller = %x for tag %d\n",
-				ocs, lrbp->task_tag);
+		dev_err(hba->dev, "OCS error from controller = %x for tag %d\n",
+			ocs, tag);
 		ufshcd_print_evt_hist(hba);
 		ufshcd_print_host_state(hba);
 		break;
@@ -7692,8 +7691,8 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
 	u8 resp = 0xF;
 
 	for (poll_cnt = 100; poll_cnt; poll_cnt--) {
-		err = ufshcd_issue_tm_cmd(hba, lrbp->lun, lrbp->task_tag,
-				UFS_QUERY_TASK, &resp);
+		err = ufshcd_issue_tm_cmd(hba, lrbp->lun, tag, UFS_QUERY_TASK,
+					  &resp);
 		if (!err && resp == UPIU_TASK_MANAGEMENT_FUNC_SUCCEEDED) {
 			/* cmd pending in the device */
 			dev_err(hba->dev, "%s: cmd pending in the device. tag = %d\n",
@@ -7726,8 +7725,7 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
 	if (!poll_cnt)
 		return -EBUSY;
 
-	err = ufshcd_issue_tm_cmd(hba, lrbp->lun, lrbp->task_tag,
-			UFS_ABORT_TASK, &resp);
+	err = ufshcd_issue_tm_cmd(hba, lrbp->lun, tag, UFS_ABORT_TASK, &resp);
 	if (err || resp != UPIU_TASK_MANAGEMENT_FUNC_COMPL) {
 		if (!err) {
 			err = resp; /* service response error */
@@ -7837,7 +7835,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
 		goto release;
 	}
 
-	err = ufshcd_try_to_abort_task(hba, lrbp->task_tag);
+	err = ufshcd_try_to_abort_task(hba, tag);
 	if (err) {
 		dev_err(hba->dev, "%s: failed with err %d\n", __func__, err);
 		ufshcd_set_req_abort_skip(hba, hba->outstanding_reqs);
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index fbed47b6c61f..a92062f65455 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -188,7 +188,6 @@ struct ufshcd_lrb {
 	int scsi_status;
 
 	int command_type;
-	int task_tag;
 	u8 lun; /* UPIU LUN id field is only 8-bit wide */
 	bool intr_cmd;
 	bool req_abort_skip;

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

* [PATCH v8 26/28] ufs: core: Make blk_mq_tagset_busy_iter() skip reserved requests
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (24 preceding siblings ...)
  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 ` 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
                   ` (4 subsequent siblings)
  30 siblings, 0 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, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter

A later patch will convert hba->reserved_slot into a reserved tag. Make
blk_mq_tagset_busy_iter() skip reserved requests such that device
management commands are skipped.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 3e0fa433579d..f493f180279f 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -644,7 +644,8 @@ static bool ufshcd_print_tr_iter(struct request *req, void *priv)
 	struct Scsi_Host *shost = sdev->host;
 	struct ufs_hba *hba = shost_priv(shost);
 
-	ufshcd_print_tr(hba, blk_mq_rq_to_pdu(req), *(bool *)priv);
+	if (!blk_mq_is_reserved_rq(req))
+		ufshcd_print_tr(hba, blk_mq_rq_to_pdu(req), *(bool *)priv);
 
 	return true;
 }
@@ -5753,7 +5754,7 @@ static bool ufshcd_mcq_force_compl_one(struct request *rq, void *priv)
 	struct ufs_hba *hba = shost_priv(shost);
 	struct ufs_hw_queue *hwq = ufshcd_mcq_req_to_hwq(hba, rq);
 
-	if (!hwq)
+	if (blk_mq_is_reserved_rq(rq) || !hwq)
 		return true;
 
 	ufshcd_mcq_compl_all_cqes_lock(hba, hwq);
@@ -5780,7 +5781,7 @@ static bool ufshcd_mcq_compl_one(struct request *rq, void *priv)
 	struct ufs_hba *hba = shost_priv(shost);
 	struct ufs_hw_queue *hwq = ufshcd_mcq_req_to_hwq(hba, rq);
 
-	if (hwq)
+	if (!blk_mq_is_reserved_rq(rq) && hwq)
 		ufshcd_mcq_poll_cqe_lock(hba, hwq);
 
 	return true;
@@ -6648,6 +6649,9 @@ static bool ufshcd_abort_one(struct request *rq, void *priv)
 	struct Scsi_Host *shost = sdev->host;
 	struct ufs_hba *hba = shost_priv(shost);
 
+	if (blk_mq_is_reserved_rq(rq))
+		return true;
+
 	*ret = ufshcd_try_to_abort_task(hba, tag);
 	dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
 		ufshcd_is_scsi_cmd(cmd) ? cmd->cmnd[0] : -1,
@@ -7597,7 +7601,7 @@ static bool ufshcd_clear_lu_cmds(struct request *req, void *priv)
 	const u64 lun = *(u64 *)priv;
 	const u32 tag = req->tag;
 
-	if (sdev->lun != lun)
+	if (blk_mq_is_reserved_rq(req) || sdev->lun != lun)
 		return true;
 
 	if (ufshcd_clear_cmd(hba, tag) < 0) {

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

* [PATCH v8 27/28] ufs: core: Move code out of ufshcd_wait_for_dev_cmd()
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (25 preceding siblings ...)
  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 ` Bart Van Assche
  2025-10-31 20:39 ` [PATCH v8 28/28] ufs: core: Switch to scsi_get_internal_cmd() Bart Van Assche
                   ` (3 subsequent siblings)
  30 siblings, 0 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, Avri Altman, James E.J. Bottomley,
	Peter Wang, Bean Huo, Bao D. Nguyen, Adrian Hunter

The ufshcd_dev_cmd_completion() call is useful for some but not for all
ufshcd_wait_for_dev_cmd() callers. Hence, remove the
ufshcd_dev_cmd_completion() call from ufshcd_wait_for_dev_cmd() and move
it past the ufshcd_issue_dev_cmd() calls where appropriate. This makes
it easier to detect timeout errors for UPIU frames submitted through the
BSG interface.

Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufshcd.c | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index f493f180279f..2175b41262c8 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3265,8 +3265,6 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
 
 	if (likely(time_left)) {
 		err = ufshcd_get_tr_ocs(lrbp, NULL);
-		if (!err)
-			err = ufshcd_dev_cmd_completion(hba, lrbp);
 	} else {
 		err = -ETIMEDOUT;
 		dev_dbg(hba->dev, "%s: dev_cmd request timedout, tag %d\n",
@@ -3376,6 +3374,7 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
 {
 	const u32 tag = hba->reserved_slot;
 	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, tag);
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	int err;
 
 	/* Protects use of hba->reserved_slot. */
@@ -3385,7 +3384,11 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
 	if (unlikely(err))
 		return err;
 
-	return ufshcd_issue_dev_cmd(hba, cmd, tag, timeout);
+	err = ufshcd_issue_dev_cmd(hba, cmd, tag, timeout);
+	if (err)
+		return err;
+
+	return ufshcd_dev_cmd_completion(hba, lrbp);
 }
 
 /**
@@ -7412,12 +7415,9 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 
 	memset(lrbp->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp));
 
-	/*
-	 * ignore the returning value here - ufshcd_check_query_response is
-	 * bound to fail since dev_cmd.query and dev_cmd.type were left empty.
-	 * read the response directly ignoring all errors.
-	 */
-	ufshcd_issue_dev_cmd(hba, cmd, tag, dev_cmd_timeout);
+	err = ufshcd_issue_dev_cmd(hba, cmd, tag, dev_cmd_timeout);
+	if (err)
+		return err;
 
 	/* just copy the upiu response as it is */
 	memcpy(rsp_upiu, lrbp->ucd_rsp_ptr, sizeof(*rsp_upiu));
@@ -7563,7 +7563,10 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 	memset(lrbp->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp));
 
 	err = ufshcd_issue_dev_cmd(hba, cmd, tag, ADVANCED_RPMB_REQ_TIMEOUT);
+	if (err)
+		return err;
 
+	err = ufshcd_dev_cmd_completion(hba, lrbp);
 	if (!err) {
 		/* Just copy the upiu response as it is */
 		memcpy(rsp_upiu, lrbp->ucd_rsp_ptr, sizeof(*rsp_upiu));

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

* [PATCH v8 28/28] ufs: core: Switch to scsi_get_internal_cmd()
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (26 preceding siblings ...)
  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 ` Bart Van Assche
  2025-11-06 17:00 ` [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (2 subsequent siblings)
  30 siblings, 0 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, James E.J. Bottomley, Peter Wang,
	Alim Akhtar, Chenyuan Yang, ping.gao, Alok Tiwari, Can Guo,
	Bean Huo, Ziqi Chen, Manivannan Sadhasivam, Bao D. Nguyen,
	Avri Altman, Adrian Hunter, Neil Armstrong, Eric Biggers,
	Nitin Rawat

Instead of storing the tag of the reserved command in hba->reserved_slot,
use scsi_get_internal_cmd() and scsi_put_internal_cmd() to allocate the
tag for the reserved command dynamically. Add
ufshcd_queue_reserved_command() for submitting reserved commands. Add
support in ufshcd_abort() for device management commands. Use
blk_execute_rq() for submitting reserved commands. Remove the code and
data structures that became superfluous. This includes
ufshcd_wait_for_dev_cmd(), hba->reserved_slot and ufs_dev_cmd.complete.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/ufs/core/ufs-mcq.c     |  19 +--
 drivers/ufs/core/ufshcd-priv.h |  25 +---
 drivers/ufs/core/ufshcd.c      | 225 ++++++++++++++++-----------------
 include/ufs/ufshcd.h           |   6 -
 4 files changed, 116 insertions(+), 159 deletions(-)

diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
index 776ff0896a2a..9ab91b4c05b0 100644
--- a/drivers/ufs/core/ufs-mcq.c
+++ b/drivers/ufs/core/ufs-mcq.c
@@ -479,9 +479,6 @@ int ufshcd_mcq_init(struct ufs_hba *hba)
 		mutex_init(&hwq->sq_mutex);
 	}
 
-	/* The very first HW queue serves device commands */
-	hba->dev_cmd_queue = &hba->uhq[0];
-
 	host->host_tagset = 1;
 	return 0;
 }
@@ -536,6 +533,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 {
 	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, task_tag);
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+	struct request *rq = scsi_cmd_to_rq(cmd);
 	struct ufs_hw_queue *hwq;
 	void __iomem *reg, *opr_sqd_base;
 	u32 nexus, id, val;
@@ -544,15 +542,12 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
 	if (hba->quirks & UFSHCD_QUIRK_MCQ_BROKEN_RTC)
 		return -ETIMEDOUT;
 
-	if (task_tag != hba->reserved_slot) {
-		if (!cmd)
-			return -EINVAL;
-		hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(cmd));
-		if (!hwq)
-			return 0;
-	} else {
-		hwq = hba->dev_cmd_queue;
-	}
+	if (!cmd)
+		return -EINVAL;
+
+	hwq = ufshcd_mcq_req_to_hwq(hba, rq);
+	if (!hwq)
+		return 0;
 
 	id = hwq->id;
 
diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
index 72d2766b19e3..2f752a45db87 100644
--- a/drivers/ufs/core/ufshcd-priv.h
+++ b/drivers/ufs/core/ufshcd-priv.h
@@ -369,30 +369,7 @@ static inline bool ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info, u8
 static inline struct scsi_cmnd *ufshcd_tag_to_cmd(struct ufs_hba *hba, u32 tag)
 {
 	struct blk_mq_tags *tags = hba->host->tag_set.shared_tags;
-	struct request *rq;
-
-	/*
-	 * Handle reserved tags differently because the UFS driver does not
-	 * call blk_mq_alloc_request() for allocating reserved requests.
-	 * Allocating reserved tags with blk_mq_alloc_request() would require
-	 * the following:
-	 * - Allocate an additional request queue from &hba->host->tag_set for
-	 *   allocating reserved requests from.
-	 * - For that request queue, allocate a SCSI device.
-	 * - Calling blk_mq_alloc_request(hba->dev_mgmt_queue, REQ_OP_DRV_OUT,
-	 *   BLK_MQ_REQ_RESERVED) for allocating a reserved request and
-	 *   blk_mq_free_request() for freeing reserved requests.
-	 * - Set the .device pointer for these reserved requests.
-	 * - Submit reserved requests with blk_execute_rq().
-	 * - Modify ufshcd_queuecommand() such that it handles reserved requests
-	 *   in another way than SCSI requests.
-	 * - Modify ufshcd_compl_one_cqe() such that it calls scsi_done() for
-	 *   device management commands.
-	 * - Modify all callback functions called by blk_mq_tagset_busy_iter()
-	 *   calls in the UFS driver and skip device management commands.
-	 */
-	rq = tag < UFSHCD_NUM_RESERVED ? tags->static_rqs[tag] :
-					 blk_mq_tag_to_rq(tags, tag);
+	struct request *rq = blk_mq_tag_to_rq(tags, tag);
 
 	if (WARN_ON_ONCE(!rq))
 		return NULL;
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 2175b41262c8..ca17165f6f0e 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2350,13 +2350,10 @@ static void ufshcd_update_monitor(struct ufs_hba *hba, struct scsi_cmnd *cmd)
 	spin_unlock_irqrestore(hba->host->host_lock, flags);
 }
 
-/*
- * Returns %true for SCSI commands and %false for device management commands.
- * Must not be called for SCSI commands that have not yet been started.
- */
+/* Returns %true for SCSI commands and %false for device management commands. */
 static bool ufshcd_is_scsi_cmd(struct scsi_cmnd *cmd)
 {
-	return blk_mq_request_started(scsi_cmd_to_rq(cmd));
+	return !blk_mq_is_reserved_rq(scsi_cmd_to_rq(cmd));
 }
 
 /**
@@ -2487,7 +2484,6 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
 	hba->nutrs = (hba->capabilities & MASK_TRANSFER_REQUESTS_SLOTS_SDB) + 1;
 	hba->nutmrs =
 	((hba->capabilities & MASK_TASK_MANAGEMENT_REQUEST_SLOTS) >> 16) + 1;
-	hba->reserved_slot = 0;
 
 	hba->nortt = FIELD_GET(MASK_NUMBER_OUTSTANDING_RTT, hba->capabilities) + 1;
 
@@ -3116,6 +3112,20 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	return err;
 }
 
+static int ufshcd_queue_reserved_command(struct Scsi_Host *host,
+					 struct scsi_cmnd *cmd)
+{
+	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+	struct request *rq = scsi_cmd_to_rq(cmd);
+	struct ufs_hba *hba = shost_priv(host);
+	struct ufs_hw_queue *hwq =
+		hba->mcq_enabled ? ufshcd_mcq_req_to_hwq(hba, rq) : NULL;
+
+	ufshcd_add_query_upiu_trace(hba, UFS_QUERY_SEND, lrbp->ucd_req_ptr);
+	ufshcd_send_command(hba, cmd, hwq);
+	return 0;
+}
+
 static void ufshcd_setup_dev_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd,
 				 enum dev_cmd_type cmd_type, u8 lun, int tag)
 {
@@ -3245,84 +3255,6 @@ ufshcd_dev_cmd_completion(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
 	return err;
 }
 
-/*
- * Return: 0 upon success; > 0 in case the UFS device reported an OCS error;
- * < 0 if another error occurred.
- */
-static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
-		struct ufshcd_lrb *lrbp, int max_timeout)
-{
-	struct scsi_cmnd *cmd = (struct scsi_cmnd *)lrbp - 1;
-	const int tag = scsi_cmd_to_rq(cmd)->tag;
-	unsigned long time_left = msecs_to_jiffies(max_timeout);
-	unsigned long flags;
-	bool pending;
-	int err;
-
-retry:
-	time_left = wait_for_completion_timeout(&hba->dev_cmd.complete,
-						time_left);
-
-	if (likely(time_left)) {
-		err = ufshcd_get_tr_ocs(lrbp, NULL);
-	} else {
-		err = -ETIMEDOUT;
-		dev_dbg(hba->dev, "%s: dev_cmd request timedout, tag %d\n",
-			__func__, tag);
-
-		/* MCQ mode */
-		if (hba->mcq_enabled) {
-			/* successfully cleared the command, retry if needed */
-			if (ufshcd_clear_cmd(hba, tag) == 0)
-				err = -EAGAIN;
-			return err;
-		}
-
-		/* SDB mode */
-		if (ufshcd_clear_cmd(hba, tag) == 0) {
-			/* successfully cleared the command, retry if needed */
-			err = -EAGAIN;
-			/*
-			 * Since clearing the command succeeded we also need to
-			 * clear the task tag bit from the outstanding_reqs
-			 * variable.
-			 */
-			spin_lock_irqsave(&hba->outstanding_lock, flags);
-			pending = test_bit(tag, &hba->outstanding_reqs);
-			if (pending)
-				__clear_bit(tag, &hba->outstanding_reqs);
-			spin_unlock_irqrestore(&hba->outstanding_lock, flags);
-
-			if (!pending) {
-				/*
-				 * The completion handler ran while we tried to
-				 * clear the command.
-				 */
-				time_left = 1;
-				goto retry;
-			}
-		} else {
-			dev_err(hba->dev, "%s: failed to clear tag %d\n",
-				__func__, tag);
-
-			spin_lock_irqsave(&hba->outstanding_lock, flags);
-			pending = test_bit(tag, &hba->outstanding_reqs);
-			spin_unlock_irqrestore(&hba->outstanding_lock, flags);
-
-			if (!pending) {
-				/*
-				 * The completion handler ran while we tried to
-				 * clear the command.
-				 */
-				time_left = 1;
-				goto retry;
-			}
-		}
-	}
-
-	return err;
-}
-
 static void ufshcd_dev_man_lock(struct ufs_hba *hba)
 {
 	ufshcd_hold(hba);
@@ -3337,6 +3269,24 @@ static void ufshcd_dev_man_unlock(struct ufs_hba *hba)
 	ufshcd_release(hba);
 }
 
+static struct scsi_cmnd *ufshcd_get_dev_mgmt_cmd(struct ufs_hba *hba)
+{
+	/*
+	 * The caller must hold this lock to guarantee that the NOWAIT
+	 * allocation will succeed.
+	 */
+	lockdep_assert_held(&hba->dev_cmd.lock);
+
+	return scsi_get_internal_cmd(
+		hba->host->pseudo_sdev, DMA_TO_DEVICE,
+		BLK_MQ_REQ_RESERVED | BLK_MQ_REQ_NOWAIT);
+}
+
+static void ufshcd_put_dev_mgmt_cmd(struct scsi_cmnd *cmd)
+{
+	scsi_put_internal_cmd(cmd);
+}
+
 /*
  * Return: 0 upon success; > 0 in case the UFS device reported an OCS error;
  * < 0 if another error occurred.
@@ -3345,16 +3295,14 @@ static int ufshcd_issue_dev_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd,
 				const u32 tag, int timeout)
 {
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
-	int err;
-
-	ufshcd_add_query_upiu_trace(hba, UFS_QUERY_SEND, lrbp->ucd_req_ptr);
-	ufshcd_send_command(hba, cmd, hba->dev_cmd_queue);
-	err = ufshcd_wait_for_dev_cmd(hba, lrbp, timeout);
-
-	ufshcd_add_query_upiu_trace(hba, err ? UFS_QUERY_ERR : UFS_QUERY_COMP,
-				    (struct utp_upiu_req *)lrbp->ucd_rsp_ptr);
+	struct request *rq = scsi_cmd_to_rq(cmd);
+	blk_status_t sts;
 
-	return err;
+	rq->timeout = timeout;
+	sts = blk_execute_rq(rq, true);
+	if (sts != BLK_STS_OK)
+		return blk_status_to_errno(sts);
+	return lrbp->utr_descriptor_ptr->header.ocs;
 }
 
 /**
@@ -3372,23 +3320,31 @@ static int ufshcd_issue_dev_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd,
 static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
 		enum dev_cmd_type cmd_type, int timeout)
 {
-	const u32 tag = hba->reserved_slot;
-	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, tag);
+	struct scsi_cmnd *cmd = ufshcd_get_dev_mgmt_cmd(hba);
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+	u32 tag;
 	int err;
 
-	/* Protects use of hba->reserved_slot. */
+	/* Protects use of hba->dev_cmd. */
 	lockdep_assert_held(&hba->dev_cmd.lock);
 
+	if (WARN_ON_ONCE(!cmd))
+		return -ENOMEM;
+
+	tag = scsi_cmd_to_rq(cmd)->tag;
+
 	err = ufshcd_compose_dev_cmd(hba, cmd, cmd_type, tag);
 	if (unlikely(err))
-		return err;
+		goto out;
 
 	err = ufshcd_issue_dev_cmd(hba, cmd, tag, timeout);
-	if (err)
-		return err;
+	if (err == 0)
+		err = ufshcd_dev_cmd_completion(hba, lrbp);
 
-	return ufshcd_dev_cmd_completion(hba, lrbp);
+out:
+	ufshcd_put_dev_mgmt_cmd(cmd);
+
+	return err;
 }
 
 /**
@@ -5658,6 +5614,10 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	enum utp_ocs ocs;
 
+	if (WARN_ONCE(!cmd, "cqe->command_desc_base_addr = %#llx\n",
+		      le64_to_cpu(cqe->command_desc_base_addr)))
+		return;
+
 	if (hba->monitor.enabled) {
 		lrbp->compl_time_stamp = ktime_get();
 		lrbp->compl_time_stamp_local_clock = local_clock();
@@ -5668,15 +5628,21 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
 		ufshcd_add_command_trace(hba, cmd, UFS_CMD_COMP);
 		cmd->result = ufshcd_transfer_rsp_status(hba, cmd, cqe);
 		ufshcd_release_scsi_cmd(hba, cmd);
-		/* Do not touch lrbp after scsi done */
-		scsi_done(cmd);
 	} else {
 		if (cqe) {
 			ocs = cqe->overall_status & MASK_OCS;
 			lrbp->utr_descriptor_ptr->header.ocs = ocs;
+		} else {
+			ocs = lrbp->utr_descriptor_ptr->header.ocs;
 		}
-		complete(&hba->dev_cmd.complete);
+		ufshcd_add_query_upiu_trace(
+			hba,
+			ocs == OCS_SUCCESS ? UFS_QUERY_COMP : UFS_QUERY_ERR,
+			(struct utp_upiu_req *)lrbp->ucd_rsp_ptr);
+		cmd->result = 0;
 	}
+	/* Do not touch lrbp after scsi_done() has been called. */
+	scsi_done(cmd);
 }
 
 /**
@@ -7386,15 +7352,20 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 					enum dev_cmd_type cmd_type,
 					enum query_opcode desc_op)
 {
-	const u32 tag = hba->reserved_slot;
-	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, tag);
+	struct scsi_cmnd *cmd = ufshcd_get_dev_mgmt_cmd(hba);
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+	u32 tag;
 	int err = 0;
 	u8 upiu_flags;
 
-	/* Protects use of hba->reserved_slot. */
+	/* Protects use of hba->dev_cmd. */
 	lockdep_assert_held(&hba->dev_cmd.lock);
 
+	if (WARN_ON_ONCE(!cmd))
+		return -ENOMEM;
+
+	tag = scsi_cmd_to_rq(cmd)->tag;
+
 	ufshcd_setup_dev_cmd(hba, cmd, cmd_type, 0, tag);
 
 	ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE, 0);
@@ -7417,7 +7388,7 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 
 	err = ufshcd_issue_dev_cmd(hba, cmd, tag, dev_cmd_timeout);
 	if (err)
-		return err;
+		goto put_dev_mgmt_cmd;
 
 	/* just copy the upiu response as it is */
 	memcpy(rsp_upiu, lrbp->ucd_rsp_ptr, sizeof(*rsp_upiu));
@@ -7438,6 +7409,9 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 		}
 	}
 
+put_dev_mgmt_cmd:
+	ufshcd_put_dev_mgmt_cmd(cmd);
+
 	return err;
 }
 
@@ -7531,9 +7505,9 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 			 struct ufs_ehs *rsp_ehs, int sg_cnt, struct scatterlist *sg_list,
 			 enum dma_data_direction dir)
 {
-	const u32 tag = hba->reserved_slot;
-	struct scsi_cmnd *cmd = ufshcd_tag_to_cmd(hba, tag);
-	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
+	struct scsi_cmnd *cmd;
+	struct ufshcd_lrb *lrbp;
+	u32 tag;
 	int err = 0;
 	int result;
 	u8 upiu_flags;
@@ -7541,9 +7515,18 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 	u16 ehs_len;
 	int ehs = (hba->capabilities & MASK_EHSLUTRD_SUPPORTED) ? 2 : 0;
 
-	/* Protects use of hba->reserved_slot. */
 	ufshcd_dev_man_lock(hba);
 
+	cmd = ufshcd_get_dev_mgmt_cmd(hba);
+
+	if (WARN_ON_ONCE(!cmd)) {
+		err = -ENOMEM;
+		goto unlock;
+	}
+
+	lrbp = scsi_cmd_priv(cmd);
+	tag = scsi_cmd_to_rq(cmd)->tag;
+
 	ufshcd_setup_dev_cmd(hba, cmd, DEV_CMD_TYPE_RPMB, UFS_UPIU_RPMB_WLUN,
 			     tag);
 
@@ -7564,7 +7547,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 
 	err = ufshcd_issue_dev_cmd(hba, cmd, tag, ADVANCED_RPMB_REQ_TIMEOUT);
 	if (err)
-		return err;
+		goto put_dev_mgmt_cmd;
 
 	err = ufshcd_dev_cmd_completion(hba, lrbp);
 	if (!err) {
@@ -7590,6 +7573,10 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 		}
 	}
 
+put_dev_mgmt_cmd:
+	ufshcd_put_dev_mgmt_cmd(cmd);
+
+unlock:
 	ufshcd_dev_man_unlock(hba);
 
 	return err ? : result;
@@ -7760,7 +7747,8 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
 {
 	struct Scsi_Host *host = cmd->device->host;
 	struct ufs_hba *hba = shost_priv(host);
-	int tag = scsi_cmd_to_rq(cmd)->tag;
+	struct request *rq = scsi_cmd_to_rq(cmd);
+	int tag = rq->tag;
 	struct ufshcd_lrb *lrbp = scsi_cmd_priv(cmd);
 	unsigned long flags;
 	int err = FAILED;
@@ -7790,7 +7778,8 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
 	 * to reduce repeated printouts. For other aborted requests only print
 	 * basic details.
 	 */
-	scsi_print_command(cmd);
+	if (ufshcd_is_scsi_cmd(cmd))
+		scsi_print_command(cmd);
 	if (!hba->req_abort_count) {
 		ufshcd_update_evt_hist(hba, UFS_EVT_ABORT, tag);
 		ufshcd_print_evt_hist(hba);
@@ -7842,7 +7831,10 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
 		goto release;
 	}
 
-	err = ufshcd_try_to_abort_task(hba, tag);
+	if (blk_mq_is_reserved_rq(rq))
+		err = ufshcd_clear_cmd(hba, tag);
+	else
+		err = ufshcd_try_to_abort_task(hba, tag);
 	if (err) {
 		dev_err(hba->dev, "%s: failed with err %d\n", __func__, err);
 		ufshcd_set_req_abort_skip(hba, hba->outstanding_reqs);
@@ -9212,6 +9204,7 @@ static const struct scsi_host_template ufshcd_driver_template = {
 	.cmd_size		= sizeof(struct ufshcd_lrb),
 	.init_cmd_priv		= ufshcd_init_cmd_priv,
 	.queuecommand		= ufshcd_queuecommand,
+	.queue_reserved_command	= ufshcd_queue_reserved_command,
 	.nr_reserved_cmds	= UFSHCD_NUM_RESERVED,
 	.mq_poll		= ufshcd_poll,
 	.sdev_init		= ufshcd_sdev_init,
@@ -10764,8 +10757,6 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
 	 */
 	hba->vcc_off_delay_us = 2000;
 
-	init_completion(&hba->dev_cmd.complete);
-
 	err = ufshcd_hba_init(hba);
 	if (err)
 		goto out_error;
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index a92062f65455..c07ba003a5cb 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -236,13 +236,11 @@ struct ufs_query {
  * struct ufs_dev_cmd - all assosiated fields with device management commands
  * @type: device management command type - Query, NOP OUT
  * @lock: lock to allow one command at a time
- * @complete: internal commands completion
  * @query: Device management query information
  */
 struct ufs_dev_cmd {
 	enum dev_cmd_type type;
 	struct mutex lock;
-	struct completion complete;
 	struct ufs_query query;
 };
 
@@ -838,7 +836,6 @@ enum ufshcd_mcq_opr {
  * @nutrs: Transfer Request Queue depth supported by controller
  * @nortt - Max outstanding RTTs supported by controller
  * @nutmrs: Task Management Queue depth supported by controller
- * @reserved_slot: Used to submit device commands. Protected by @dev_cmd.lock.
  * @ufs_version: UFS Version to which controller complies
  * @vops: pointer to variant specific operations
  * @vps: pointer to variant specific parameters
@@ -929,7 +926,6 @@ enum ufshcd_mcq_opr {
  * @res: array of resource info of MCQ registers
  * @mcq_base: Multi circular queue registers base address
  * @uhq: array of supported hardware queues
- * @dev_cmd_queue: Queue for issuing device management commands
  * @mcq_opr: MCQ operation and runtime registers
  * @ufs_rtc_update_work: A work for UFS RTC periodic update
  * @pm_qos_req: PM QoS request handle
@@ -981,7 +977,6 @@ struct ufs_hba {
 	int nortt;
 	u32 mcq_capabilities;
 	int nutmrs;
-	u32 reserved_slot;
 	u32 ufs_version;
 	const struct ufs_hba_variant_ops *vops;
 	struct ufs_hba_variant_params *vps;
@@ -1099,7 +1094,6 @@ struct ufs_hba {
 	bool mcq_esi_enabled;
 	void __iomem *mcq_base;
 	struct ufs_hw_queue *uhq;
-	struct ufs_hw_queue *dev_cmd_queue;
 	struct ufshcd_mcq_opr_info_t mcq_opr[OPR_MAX];
 
 	struct delayed_work ufs_rtc_update_work;

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

* Re: [PATCH v8 00/28] Optimize the hot path in the UFS driver
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (27 preceding siblings ...)
  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 ` 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
  30 siblings, 1 reply; 63+ messages in thread
From: Bart Van Assche @ 2025-11-06 17:00 UTC (permalink / raw)
  To: Martin K . Petersen; +Cc: linux-scsi

On 10/31/25 1:39 PM, Bart Van Assche wrote:
> 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: [ ... ]

(replying to my own email)

Hi Martin,

The first version of this patch series was posted seven months ago (see
also 
https://lore.kernel.org/linux-scsi/20250403211937.2225615-1-bvanassche@acm.org/).
Is there agreement that everyone who wanted to comment has had the
chance to comment on this patch series and also that this patch series
is ready to be merged?

Thank you,

Bart.

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

* Re: [PATCH v8 00/28] Optimize the hot path in the UFS driver
  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
  0 siblings, 0 replies; 63+ messages in thread
From: Martin K. Petersen @ 2025-11-06 18:23 UTC (permalink / raw)
  To: Bart Van Assche; +Cc: Martin K . Petersen, linux-scsi


Bart,

> Is there agreement that everyone who wanted to comment has had the
> chance to comment on this patch series and also that this patch series
> is ready to be merged?

This series is on my list of things to review this week.

-- 
Martin K. Petersen

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

* Re: [PATCH v8 00/28] Optimize the hot path in the UFS driver
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (28 preceding siblings ...)
  2025-11-06 17:00 ` [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
@ 2025-11-12 22:11 ` Martin K. Petersen
  2025-11-20  4:15 ` Martin K. Petersen
  30 siblings, 0 replies; 63+ messages in thread
From: Martin K. Petersen @ 2025-11-12 22:11 UTC (permalink / raw)
  To: Bart Van Assche; +Cc: Martin K . Petersen, linux-scsi


Bart,

> This patch series optimizes the hot path of the UFS driver by making
> struct scsi_cmnd and struct ufshcd_lrb adjacent.

Applied to 6.19/scsi-staging, thanks!

-- 
Martin K. Petersen

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  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-27 16:59   ` Manivannan Sadhasivam
  1 sibling, 1 reply; 63+ messages in thread
From: Marek Szyprowski @ 2025-11-14 10:12 UTC (permalink / raw)
  To: Bart Van Assche, Martin K . Petersen
  Cc: linux-scsi, James E.J. Bottomley, Peter Wang, Avri Altman,
	Bean Huo, Bao D. Nguyen, Adrian Hunter

Hi,

On 31.10.2025 21:39, Bart Van Assche wrote:
> Instead of letting the SCSI core allocate hba->nutrs - 1 commands, let
> the SCSI core allocate hba->nutrs commands, set the number of reserved
> tags to 1 and use the reserved tag for device management commands. This
> patch changes the 'reserved slot' from hba->nutrs - 1 into 0 because
> the block layer reserves the smallest tags for reserved commands.
>
> Signed-off-by: Bart Van Assche <bvanassche@acm.org>


This patch landed in today's linux-next as commit 1d0af94ffb5d ("scsi: 
ufs: core: Make the reserved slot a reserved request"). In my tests I 
found that it causes boot failure on Qualcomm Robotics RB5 board. Here 
is the log from UFS probe failure:

ufshcd-qcom 1d84000.ufshc: freq-table-hz property not specified
ufshcd-qcom 1d84000.ufshc: ufshcd_populate_vreg: Unable to find 
vdd-hba-supply regulator, assuming enabled
ufshcd-qcom 1d84000.ufshc: freq-table-hz property not specified
ufshcd-qcom 1d84000.ufshc: ufshcd_populate_vreg: Unable to find 
vdd-hba-supply regulator, assuming enabled
scsi host0: ufshcd
scsi host0: nr_reserved_cmds set but no method to queue
ufshcd-qcom 1d84000.ufshc: scsi_add_host failed
ufshcd-qcom 1d84000.ufshc: error -EINVAL: Initialization failed with 
error -22
ufshcd-qcom 1d84000.ufshc: error -EINVAL: ufshcd_pltfrm_init() failed
ufshcd-qcom 1d84000.ufshc: probe with driver ufshcd-qcom failed with 
error -22


The 1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved 
request") is the first commit which breaks UFS probe, but next-20251114 
fails in a bit different way:

ufshcd-qcom 1d84000.ufshc: freq-table-hz property not specified
ufshcd-qcom 1d84000.ufshc: ufshcd_populate_vreg: Unable to find 
vdd-hba-supply regulator, assuming enabled
ufshcd-qcom 1d84000.ufshc: freq-table-hz property not specified
ufshcd-qcom 1d84000.ufshc: ufshcd_populate_vreg: Unable to find 
vdd-hba-supply regulator, assuming enabled
scsi host0: ufshcd
Unable to handle kernel NULL pointer dereference at virtual address 
0000000000000000
Mem abort info:
   ESR = 0x0000000096000004
   EC = 0x25: DABT (current EL), IL = 32 bits
   SET = 0, FnV = 0
   EA = 0, S1PTW = 0
   FSC = 0x04: level 0 translation fault
Data abort info:
   ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000
   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
[0000000000000000] user address but active_mm is swapper
Internal error: Oops: 0000000096000004 [#1]  SMP
Modules linked in:
CPU: 0 UID: 0 PID: 131 Comm: irq/148-ufshcd Not tainted 
6.18.0-rc5-next-20251114 #11692 PREEMPT
Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT)
pstate: 20400005 (nzCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : ufshcd_compl_one_cqe+0x24/0x4ac
lr : __ufshcd_transfer_req_compl+0x24/0x64
...
Call trace:
  ufshcd_compl_one_cqe+0x24/0x4ac (P)
  __ufshcd_transfer_req_compl+0x24/0x64
  ufshcd_poll+0xe4/0x204
  ufshcd_transfer_req_compl+0x44/0x54
  ufshcd_sl_intr+0x1f0/0x670
  ufshcd_threaded_intr+0xb8/0x198
  irq_thread_fn+0x2c/0xa8
  irq_thread+0x1d4/0x410
  kthread+0x150/0x228
  ret_from_fork+0x10/0x20
Code: a9025bf5 aa0203f5 f9401c00 f9413000 (b9400002)
---[ end trace 0000000000000000 ]---
genirq: exiting task "irq/148-ufshcd" (131) is an active IRQ thread (irq 
148)
ufshcd-qcom 1d84000.ufshc: ufshcd_abort: cmd at tag 0 already completed, 
outstanding=0x0, doorbell=0x0
------------[ cut here ]------------
WARNING: drivers/scsi/scsi_error.c:305 at scsi_eh_scmd_add+0x110/0x118, 
CPU#1: kworker/u32:1/61
Modules linked in:
CPU: 1 UID: 0 PID: 61 Comm: kworker/u32:1 Tainted: G D             
6.18.0-rc5-next-20251114 #11692 PREEMPT
Tainted: [D]=DIE
Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT)
Workqueue: scsi_tmf_0 scmd_eh_abort_handler
pstate: 40400005 (nZcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : scsi_eh_scmd_add+0x110/0x118
lr : scmd_eh_abort_handler+0x84/0x1c8
...
Call trace:
  scsi_eh_scmd_add+0x110/0x118 (P)
  scmd_eh_abort_handler+0x84/0x1c8
  process_one_work+0x208/0x604
  worker_thread+0x244/0x388
  kthread+0x150/0x228
  ret_from_fork+0x10/0x20
irq event stamp: 15902
hardirqs last  enabled at (15901): [<ffffd07807e1da44>] 
_raw_spin_unlock_irq+0x30/0x6c
hardirqs last disabled at (15902): [<ffffd07807e12970>] 
__schedule+0x410/0xf94
softirqs last  enabled at (13916): [<ffffd07806b46b64>] 
handle_softirqs+0x4c4/0x4dc
softirqs last disabled at (13905): [<ffffd07806a90688>] 
__do_softirq+0x14/0x20
---[ end trace 0000000000000000 ]---

Let me know how can I help debugging this issue.


> ---
>   drivers/ufs/core/ufshcd.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index f6eecc03282a..20eae5d9487b 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -2476,7 +2476,7 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
>   	hba->nutrs = (hba->capabilities & MASK_TRANSFER_REQUESTS_SLOTS_SDB) + 1;
>   	hba->nutmrs =
>   	((hba->capabilities & MASK_TASK_MANAGEMENT_REQUEST_SLOTS) >> 16) + 1;
> -	hba->reserved_slot = hba->nutrs - 1;
> +	hba->reserved_slot = 0;
>   
>   	hba->nortt = FIELD_GET(MASK_NUMBER_OUTSTANDING_RTT, hba->capabilities) + 1;
>   
> @@ -8945,7 +8945,6 @@ static int ufshcd_alloc_mcq(struct ufs_hba *hba)
>   		goto err;
>   
>   	hba->host->can_queue = hba->nutrs - UFSHCD_NUM_RESERVED;
> -	hba->reserved_slot = hba->nutrs - UFSHCD_NUM_RESERVED;
>   
>   	return 0;
>   err:
> @@ -9184,6 +9183,7 @@ static const struct scsi_host_template ufshcd_driver_template = {
>   	.proc_name		= UFSHCD,
>   	.map_queues		= ufshcd_map_queues,
>   	.queuecommand		= ufshcd_queuecommand,
> +	.nr_reserved_cmds	= UFSHCD_NUM_RESERVED,
>   	.mq_poll		= ufshcd_poll,
>   	.sdev_init		= ufshcd_sdev_init,
>   	.sdev_configure		= ufshcd_sdev_configure,
>
Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland


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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-11-14 10:12   ` Marek Szyprowski
@ 2025-11-14 17:32     ` André Draszik
  2025-11-14 18:39       ` Bart Van Assche
  0 siblings, 1 reply; 63+ messages in thread
From: André Draszik @ 2025-11-14 17:32 UTC (permalink / raw)
  To: Marek Szyprowski, Bart Van Assche, Martin K . Petersen
  Cc: linux-scsi, James E.J. Bottomley, Peter Wang, Avri Altman,
	Bean Huo, Bao D. Nguyen, Adrian Hunter

Hi,

On Fri, 2025-11-14 at 11:12 +0100, Marek Szyprowski wrote:
> Hi,
> 
> On 31.10.2025 21:39, Bart Van Assche wrote:
> > Instead of letting the SCSI core allocate hba->nutrs - 1 commands, let
> > the SCSI core allocate hba->nutrs commands, set the number of reserved
> > tags to 1 and use the reserved tag for device management commands. This
> > patch changes the 'reserved slot' from hba->nutrs - 1 into 0 because
> > the block layer reserves the smallest tags for reserved commands.
> > 
> > Signed-off-by: Bart Van Assche <bvanassche@acm.org>
> 
> 
> This patch landed in today's linux-next as commit 1d0af94ffb5d ("scsi: 
> ufs: core: Make the reserved slot a reserved request"). In my tests I 
> found that it causes boot failure on Qualcomm Robotics RB5 board. Here 
> is the log from UFS probe failure:
> 
> ufshcd-qcom 1d84000.ufshc: freq-table-hz property not specified
> ufshcd-qcom 1d84000.ufshc: ufshcd_populate_vreg: Unable to find 
> vdd-hba-supply regulator, assuming enabled
> ufshcd-qcom 1d84000.ufshc: freq-table-hz property not specified
> ufshcd-qcom 1d84000.ufshc: ufshcd_populate_vreg: Unable to find 
> vdd-hba-supply regulator, assuming enabled
> scsi host0: ufshcd
> scsi host0: nr_reserved_cmds set but no method to queue
> ufshcd-qcom 1d84000.ufshc: scsi_add_host failed
> ufshcd-qcom 1d84000.ufshc: error -EINVAL: Initialization failed with 
> error -22
> ufshcd-qcom 1d84000.ufshc: error -EINVAL: ufshcd_pltfrm_init() failed
> ufshcd-qcom 1d84000.ufshc: probe with driver ufshcd-qcom failed with 
> error -22

FWIW, I'm seeing the same on Pixel 6:

exynos-ufshc 14700000.ufs: ufshcd_populate_vreg: Unable to find vdd-hba-supply regulator, assuming enabled
exynos-ufshc 14700000.ufs: ufshcd_populate_vreg: unable to find vcc-max-microamp
exynos-ufshc 14700000.ufs: ufshcd_populate_vreg: Unable to find vccq-supply regulator, assuming enabled
exynos-ufshc 14700000.ufs: ufshcd_populate_vreg: Unable to find vccq2-supply regulator, assuming enabled
exynos-ufshc 14700000.ufs: scsi_add_host failed
exynos-ufshc 14700000.ufs: error -EINVAL: Initialization failed with error -22
exynos-ufshc 14700000.ufs: ufshcd_pltfrm_init() failed -22
exynos-ufshc 14700000.ufs: probe with driver exynos-ufshc failed with error -22

> 
> The 1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved 
> request") is the first commit which breaks UFS probe, but next-20251114 
> fails in a bit different way:
> 
> ufshcd-qcom 1d84000.ufshc: freq-table-hz property not specified
> ufshcd-qcom 1d84000.ufshc: ufshcd_populate_vreg: Unable to find 
> vdd-hba-supply regulator, assuming enabled
> ufshcd-qcom 1d84000.ufshc: freq-table-hz property not specified
> ufshcd-qcom 1d84000.ufshc: ufshcd_populate_vreg: Unable to find 
> vdd-hba-supply regulator, assuming enabled
> scsi host0: ufshcd
> Unable to handle kernel NULL pointer dereference at virtual address 
> 0000000000000000
> Mem abort info:
>    ESR = 0x0000000096000004
>    EC = 0x25: DABT (current EL), IL = 32 bits
>    SET = 0, FnV = 0
>    EA = 0, S1PTW = 0
>    FSC = 0x04: level 0 translation fault
> Data abort info:
>    ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000
>    CM = 0, WnR = 0, TnD = 0, TagAccess = 0
>    GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
> [0000000000000000] user address but active_mm is swapper
> Internal error: Oops: 0000000096000004 [#1]  SMP
> Modules linked in:
> CPU: 0 UID: 0 PID: 131 Comm: irq/148-ufshcd Not tainted 
> 6.18.0-rc5-next-20251114 #11692 PREEMPT
> Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT)
> pstate: 20400005 (nzCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> pc : ufshcd_compl_one_cqe+0x24/0x4ac
> lr : __ufshcd_transfer_req_compl+0x24/0x64
> ...
> Call trace:
>   ufshcd_compl_one_cqe+0x24/0x4ac (P)
>   __ufshcd_transfer_req_compl+0x24/0x64
>   ufshcd_poll+0xe4/0x204
>   ufshcd_transfer_req_compl+0x44/0x54
>   ufshcd_sl_intr+0x1f0/0x670
>   ufshcd_threaded_intr+0xb8/0x198
>   irq_thread_fn+0x2c/0xa8
>   irq_thread+0x1d4/0x410
>   kthread+0x150/0x228
>   ret_from_fork+0x10/0x20
> Code: a9025bf5 aa0203f5 f9401c00 f9413000 (b9400002)
> ---[ end trace 0000000000000000 ]---
> genirq: exiting task "irq/148-ufshcd" (131) is an active IRQ thread (irq 
> 148)
> ufshcd-qcom 1d84000.ufshc: ufshcd_abort: cmd at tag 0 already completed, 
> outstanding=0x0, doorbell=0x0
> ------------[ cut here ]------------
> WARNING: drivers/scsi/scsi_error.c:305 at scsi_eh_scmd_add+0x110/0x118, 
> CPU#1: kworker/u32:1/61
> Modules linked in:
> CPU: 1 UID: 0 PID: 61 Comm: kworker/u32:1 Tainted: G D             
> 6.18.0-rc5-next-20251114 #11692 PREEMPT
> Tainted: [D]=DIE
> Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT)
> Workqueue: scsi_tmf_0 scmd_eh_abort_handler
> pstate: 40400005 (nZcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> pc : scsi_eh_scmd_add+0x110/0x118
> lr : scmd_eh_abort_handler+0x84/0x1c8
> ...
> Call trace:
>   scsi_eh_scmd_add+0x110/0x118 (P)
>   scmd_eh_abort_handler+0x84/0x1c8
>   process_one_work+0x208/0x604
>   worker_thread+0x244/0x388
>   kthread+0x150/0x228
>   ret_from_fork+0x10/0x20
> irq event stamp: 15902
> hardirqs last  enabled at (15901): [<ffffd07807e1da44>] 
> _raw_spin_unlock_irq+0x30/0x6c
> hardirqs last disabled at (15902): [<ffffd07807e12970>] 
> __schedule+0x410/0xf94
> softirqs last  enabled at (13916): [<ffffd07806b46b64>] 
> handle_softirqs+0x4c4/0x4dc
> softirqs last disabled at (13905): [<ffffd07806a90688>] 
> __do_softirq+0x14/0x20
> ---[ end trace 0000000000000000 ]---
> 
> Let me know how can I help debugging this issue.

The commit that makes it crash is:

  08b12cda6c44 ("scsi: ufs: core: Switch to scsi_get_internal_cmd()")

the ones leading to it just fail probe.

LKFT link https://lkft-staging.validation.linaro.org/scheduler/job/198696

Cheers,
Andre'

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  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
  0 siblings, 2 replies; 63+ messages in thread
From: Bart Van Assche @ 2025-11-14 18:39 UTC (permalink / raw)
  To: Marek Szyprowski, André Draszik, Martin K . Petersen
  Cc: linux-scsi, James E.J. Bottomley, Peter Wang, Avri Altman,
	Bean Huo, Bao D. Nguyen, Adrian Hunter

On 11/14/25 9:32 AM, André Draszik wrote:
> The commit that makes it crash is:
> 
>    08b12cda6c44 ("scsi: ufs: core: Switch to scsi_get_internal_cmd()")
> 
> the ones leading to it just fail probe.
Marek and André, thanks for having reported this issue.

The series is not bisectable, which is unfortunate.

Please help with testing the patch below on top of the entire patch
series, e.g. on top of linux-next:

diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
index 681426fde603..f385d85d3f95 100644
--- a/drivers/ufs/core/ufshcd-priv.h
+++ b/drivers/ufs/core/ufshcd-priv.h
@@ -380,7 +380,12 @@ static inline bool 
ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info, u8
   */
  static inline struct scsi_cmnd *ufshcd_tag_to_cmd(struct ufs_hba *hba, 
u32 tag)
  {
-	struct blk_mq_tags *tags = hba->host->tag_set.shared_tags;
+	/*
+	 * Host-wide tags are enabled in MCQ mode only. See also the
+	 * host->host_tagset assignment in ufs-mcq.c.
+	 */
+	struct blk_mq_tags *tags = hba->host->tag_set.shared_tags ? :
+		hba->host->tag_set.tags[0];
  	struct request *rq = blk_mq_tag_to_rq(tags, tag);

  	if (WARN_ON_ONCE(!rq))

Thanks,

Bart.

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-11-14 18:39       ` Bart Van Assche
@ 2025-11-14 19:11         ` Marek Szyprowski
  2025-11-16 15:40         ` David Heidelberg
  1 sibling, 0 replies; 63+ messages in thread
From: Marek Szyprowski @ 2025-11-14 19:11 UTC (permalink / raw)
  To: Bart Van Assche, André Draszik, Martin K . Petersen
  Cc: linux-scsi, James E.J. Bottomley, Peter Wang, Avri Altman,
	Bean Huo, Bao D. Nguyen, Adrian Hunter

Hi,

On 14.11.2025 19:39, Bart Van Assche wrote:
> On 11/14/25 9:32 AM, André Draszik wrote:
>> The commit that makes it crash is:
>>
>>    08b12cda6c44 ("scsi: ufs: core: Switch to scsi_get_internal_cmd()")
>>
>> the ones leading to it just fail probe.
> Marek and André, thanks for having reported this issue.
>
> The series is not bisectable, which is unfortunate.
>
> Please help with testing the patch below on top of the entire patch
> series, e.g. on top of linux-next:
>
> diff --git a/drivers/ufs/core/ufshcd-priv.h 
> b/drivers/ufs/core/ufshcd-priv.h
> index 681426fde603..f385d85d3f95 100644
> --- a/drivers/ufs/core/ufshcd-priv.h
> +++ b/drivers/ufs/core/ufshcd-priv.h
> @@ -380,7 +380,12 @@ static inline bool 
> ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info, u8
>   */
>  static inline struct scsi_cmnd *ufshcd_tag_to_cmd(struct ufs_hba 
> *hba, u32 tag)
>  {
> -    struct blk_mq_tags *tags = hba->host->tag_set.shared_tags;
> +    /*
> +     * Host-wide tags are enabled in MCQ mode only. See also the
> +     * host->host_tagset assignment in ufs-mcq.c.
> +     */
> +    struct blk_mq_tags *tags = hba->host->tag_set.shared_tags ? :
> +        hba->host->tag_set.tags[0];
>      struct request *rq = blk_mq_tag_to_rq(tags, tag);
>
>      if (WARN_ON_ONCE(!rq))
>
Yes, that's it! This fixes the observed issue. Thanks! Feel free to add:

Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>


Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland


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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  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
  1 sibling, 1 reply; 63+ messages in thread
From: David Heidelberg @ 2025-11-16 15:40 UTC (permalink / raw)
  To: Bart Van Assche, Marek Szyprowski, André Draszik,
	Martin K . Petersen
  Cc: linux-scsi, James E.J. Bottomley, Peter Wang, Avri Altman,
	Bean Huo, Bao D. Nguyen, Adrian Hunter

On 14/11/2025 19:39, Bart Van Assche wrote:
> On 11/14/25 9:32 AM, André Draszik wrote:
>> The commit that makes it crash is:
>>
>>    08b12cda6c44 ("scsi: ufs: core: Switch to scsi_get_internal_cmd()")
>>
>> the ones leading to it just fail probe.
> Marek and André, thanks for having reported this issue.
> 
> The series is not bisectable, which is unfortunate.
> 
> Please help with testing the patch below on top of the entire patch
> series, e.g. on top of linux-next:
> 
> diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd- 
> priv.h
> index 681426fde603..f385d85d3f95 100644
> --- a/drivers/ufs/core/ufshcd-priv.h
> +++ b/drivers/ufs/core/ufshcd-priv.h
> @@ -380,7 +380,12 @@ static inline bool 
> ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info, u8
>    */
>   static inline struct scsi_cmnd *ufshcd_tag_to_cmd(struct ufs_hba *hba, 
> u32 tag)
>   {
> -    struct blk_mq_tags *tags = hba->host->tag_set.shared_tags;
> +    /*
> +     * Host-wide tags are enabled in MCQ mode only. See also the
> +     * host->host_tagset assignment in ufs-mcq.c.
> +     */
> +    struct blk_mq_tags *tags = hba->host->tag_set.shared_tags ? :
> +        hba->host->tag_set.tags[0];
>       struct request *rq = blk_mq_tag_to_rq(tags, tag);
> 
>       if (WARN_ON_ONCE(!rq))
> 
> Thanks,

Tested-by: David Heidelberg <david@ixit.cz>  # Pixel 3

> 
> Bart.
> 

-- 
David Heidelberg


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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-11-16 15:40         ` David Heidelberg
@ 2025-11-16 22:30           ` Bart Van Assche
  2025-11-16 22:45             ` David Heidelberg
  0 siblings, 1 reply; 63+ messages in thread
From: Bart Van Assche @ 2025-11-16 22:30 UTC (permalink / raw)
  To: David Heidelberg, Marek Szyprowski, André Draszik,
	Martin K . Petersen
  Cc: linux-scsi, James E.J. Bottomley, Peter Wang, Avri Altman,
	Bean Huo, Bao D. Nguyen, Adrian Hunter

On 11/16/25 7:40 AM, David Heidelberg wrote:
> Tested-by: David Heidelberg <david@ixit.cz>  # Pixel 3

Thanks for testing!

Would it be possible to explain how this patch has been tested on a
Pixel 3 device? From an LLM: "Running an upstream (mainline) Linux
kernel on a device like the Pixel 3 is a complex process often referred
to as mainlining. It involves significantly more effort than simply
flashing a custom Android kernel because you are attempting to run a
kernel designed for general computing environments on hardware that
relies heavily on custom, Android-specific kernel code and proprietary
drivers.

The Pixel 3 (codenames blueline and crosshatch) uses a downstream,
Google-maintained kernel that is a blend of the long-term stable (LTS)
Linux kernel and many Android-specific patches and proprietary drivers."

Thanks,

Bart.

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-11-16 22:30           ` Bart Van Assche
@ 2025-11-16 22:45             ` David Heidelberg
  0 siblings, 0 replies; 63+ messages in thread
From: David Heidelberg @ 2025-11-16 22:45 UTC (permalink / raw)
  To: Bart Van Assche, Marek Szyprowski, André Draszik,
	Martin K . Petersen
  Cc: linux-scsi, James E.J. Bottomley, Peter Wang, Avri Altman,
	Bean Huo, Bao D. Nguyen, Adrian Hunter

I'm working on upstreaming Pixel 3.

There is a patch series (WIP) here [1]. Code, until merged, is also 
available here on GitLab [2].

I had same issues on OnePlus 6T, but I don't have UART for it, so I 
flashed the Pixel 3 where I have UART donge.

So, let me extend as now I tested the patch on both ;-)

Tested-by: David Heidelberg <david@ixit.cz>  # OnePlus 6T and Pixel 3

Thank you
David

[1] https://lore.kernel.org/all/20251005-pixel-3-v1-0-ab8b85f6133f@ixit.cz/
[2] https://gitlab.com/sdm845/sdm845-next/-/commits/b4/pixel-3


On 16/11/2025 23:30, Bart Van Assche wrote:
> On 11/16/25 7:40 AM, David Heidelberg wrote:
>> Tested-by: David Heidelberg <david@ixit.cz>  # Pixel 3
> 
> Thanks for testing!
> 
> Would it be possible to explain how this patch has been tested on a
> Pixel 3 device? From an LLM: "Running an upstream (mainline) Linux
> kernel on a device like the Pixel 3 is a complex process often referred
> to as mainlining. It involves significantly more effort than simply
> flashing a custom Android kernel because you are attempting to run a
> kernel designed for general computing environments on hardware that
> relies heavily on custom, Android-specific kernel code and proprietary
> drivers.
> 
> The Pixel 3 (codenames blueline and crosshatch) uses a downstream,
> Google-maintained kernel that is a blend of the long-term stable (LTS)
> Linux kernel and many Android-specific patches and proprietary drivers."
> 
> Thanks,
> 
> Bart.

-- 
David Heidelberg


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

* Re: [PATCH v8 00/28] Optimize the hot path in the UFS driver
  2025-10-31 20:39 [PATCH v8 00/28] Optimize the hot path in the UFS driver Bart Van Assche
                   ` (29 preceding siblings ...)
  2025-11-12 22:11 ` Martin K. Petersen
@ 2025-11-20  4:15 ` Martin K. Petersen
  30 siblings, 0 replies; 63+ messages in thread
From: Martin K. Petersen @ 2025-11-20  4:15 UTC (permalink / raw)
  To: Bart Van Assche; +Cc: Martin K . Petersen, linux-scsi

On Fri, 31 Oct 2025 13:39:08 -0700, Bart Van Assche wrote:

> 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,
> 
> [...]

Applied to 6.19/scsi-queue, thanks!

[00/28] Optimize the hot path in the UFS driver
        https://git.kernel.org/mkp/scsi/c/ab57a18665a2
[01/28] scsi: core: Support allocating reserved commands
        https://git.kernel.org/mkp/scsi/c/d604e1ec246d
[02/28] scsi: core: Move two statements
        https://git.kernel.org/mkp/scsi/c/21008cabc5d9
[03/28] scsi: core: Make the budget map optional
        https://git.kernel.org/mkp/scsi/c/a47c7bef5785
[04/28] scsi: core: Support allocating a pseudo SCSI device
        https://git.kernel.org/mkp/scsi/c/d630fbf6fc8c
[05/28] scsi: core: Introduce .queue_reserved_command()
        https://git.kernel.org/mkp/scsi/c/11ea1de3fc4b
[06/28] scsi: core: Add scsi_{get,put}_internal_cmd() helpers
        https://git.kernel.org/mkp/scsi/c/a2ab4e33286d
[07/28] scsi_debug: Abort SCSI commands via an internal command
        https://git.kernel.org/mkp/scsi/c/581ca490353c
[08/28] ufs: core: Move an assignment in ufshcd_mcq_process_cqe()
        https://git.kernel.org/mkp/scsi/c/dd4299af9b04
[09/28] ufs: core: Change the type of one ufshcd_add_cmd_upiu_trace() argument
        https://git.kernel.org/mkp/scsi/c/9f8e09230f53
[10/28] ufs: core: Only call ufshcd_add_command_trace() for SCSI commands
        https://git.kernel.org/mkp/scsi/c/60a1f6a8ad33
[11/28] ufs: core: Change the type of one ufshcd_add_command_trace() argument
        https://git.kernel.org/mkp/scsi/c/ffa5d8c15300
[12/28] ufs: core: Change the type of one ufshcd_send_command() argument
        https://git.kernel.org/mkp/scsi/c/3e7fff3fee5b
[13/28] ufs: core: Only call ufshcd_should_inform_monitor() for SCSI commands
        https://git.kernel.org/mkp/scsi/c/ae7bf255b10e
[14/28] ufs: core: Change the monitor function argument types
        https://git.kernel.org/mkp/scsi/c/f59568f4e27a
[15/28] ufs: core: Rework ufshcd_mcq_compl_pending_transfer()
        https://git.kernel.org/mkp/scsi/c/63a5b959c854
[16/28] ufs: core: Rework ufshcd_eh_device_reset_handler()
        https://git.kernel.org/mkp/scsi/c/f18fac1e2b72
[17/28] ufs: core: Rework the SCSI host queue depth calculation code
        https://git.kernel.org/mkp/scsi/c/e8ea985a8314
[18/28] ufs: core: Allocate the SCSI host earlier
        https://git.kernel.org/mkp/scsi/c/f46b9a595fa9
[19/28] ufs: core: Call ufshcd_init_lrb() later
        https://git.kernel.org/mkp/scsi/c/45e636ea1294
[20/28] ufs: core: Use hba->reserved_slot
        https://git.kernel.org/mkp/scsi/c/d3fd0fd77686
[21/28] ufs: core: Make the reserved slot a reserved request
        https://git.kernel.org/mkp/scsi/c/1d0af94ffb5d
[22/28] ufs: core: Do not clear driver-private command data
        https://git.kernel.org/mkp/scsi/c/e5f9cc2af9a8
[23/28] ufs: core: Optimize the hot path
        https://git.kernel.org/mkp/scsi/c/22089c218037
[24/28] ufs: core: Pass a SCSI pointer instead of an LRB pointer
        https://git.kernel.org/mkp/scsi/c/176b93004c34
[25/28] ufs: core: Remove the ufshcd_lrb task_tag member
        https://git.kernel.org/mkp/scsi/c/9a2c9500921d
[26/28] ufs: core: Make blk_mq_tagset_busy_iter() skip reserved requests
        https://git.kernel.org/mkp/scsi/c/4b6c0d9cca35
[27/28] ufs: core: Move code out of ufshcd_wait_for_dev_cmd()
        https://git.kernel.org/mkp/scsi/c/a11c015c8a4f
[28/28] ufs: core: Switch to scsi_get_internal_cmd()
        https://git.kernel.org/mkp/scsi/c/08b12cda6c44

-- 
Martin K. Petersen

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  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-27 16:59   ` Manivannan Sadhasivam
  2025-11-29  2:31     ` Bart Van Assche
  1 sibling, 1 reply; 63+ messages in thread
From: Manivannan Sadhasivam @ 2025-11-27 16:59 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: Martin K . Petersen, linux-scsi, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter,
	Dmitry Baryshkov

On Fri, Oct 31, 2025 at 01:39:29PM -0700, Bart Van Assche wrote:
> Instead of letting the SCSI core allocate hba->nutrs - 1 commands, let
> the SCSI core allocate hba->nutrs commands, set the number of reserved
> tags to 1 and use the reserved tag for device management commands. This
> patch changes the 'reserved slot' from hba->nutrs - 1 into 0 because
> the block layer reserves the smallest tags for reserved commands.
> 
> Signed-off-by: Bart Van Assche <bvanassche@acm.org>

Hi,

While the issue introduced by this patch was fixed in [1], this patch (and the
fix) somehow prevents mounting rootfs on Qcom RB3Gen2 board. The UFS partitions
are detected, but rootfs is not getting mounted and the boot just got stuck.
I collected the logs, but nothing much useful as there is no error/warning:
https://gist.github.com/Mani-Sadhasivam/396ef4a636d3b0140e7f07595bd41e4f

If I revert this patch, together with the dependencies, rootfs is getting
mounted properly.

Any inputs would be appreciated.

- Mani

[1] https://lore.kernel.org/linux-scsi/20251114193406.3097237-1-bvanassche@acm.org/

> ---
>  drivers/ufs/core/ufshcd.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index f6eecc03282a..20eae5d9487b 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -2476,7 +2476,7 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
>  	hba->nutrs = (hba->capabilities & MASK_TRANSFER_REQUESTS_SLOTS_SDB) + 1;
>  	hba->nutmrs =
>  	((hba->capabilities & MASK_TASK_MANAGEMENT_REQUEST_SLOTS) >> 16) + 1;
> -	hba->reserved_slot = hba->nutrs - 1;
> +	hba->reserved_slot = 0;
>  
>  	hba->nortt = FIELD_GET(MASK_NUMBER_OUTSTANDING_RTT, hba->capabilities) + 1;
>  
> @@ -8945,7 +8945,6 @@ static int ufshcd_alloc_mcq(struct ufs_hba *hba)
>  		goto err;
>  
>  	hba->host->can_queue = hba->nutrs - UFSHCD_NUM_RESERVED;
> -	hba->reserved_slot = hba->nutrs - UFSHCD_NUM_RESERVED;
>  
>  	return 0;
>  err:
> @@ -9184,6 +9183,7 @@ static const struct scsi_host_template ufshcd_driver_template = {
>  	.proc_name		= UFSHCD,
>  	.map_queues		= ufshcd_map_queues,
>  	.queuecommand		= ufshcd_queuecommand,
> +	.nr_reserved_cmds	= UFSHCD_NUM_RESERVED,
>  	.mq_poll		= ufshcd_poll,
>  	.sdev_init		= ufshcd_sdev_init,
>  	.sdev_configure		= ufshcd_sdev_configure,

-- 
மணிவண்ணன் சதாசிவம்

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-11-27 16:59   ` Manivannan Sadhasivam
@ 2025-11-29  2:31     ` Bart Van Assche
  2025-11-29  2:51       ` Manivannan Sadhasivam
  0 siblings, 1 reply; 63+ messages in thread
From: Bart Van Assche @ 2025-11-29  2:31 UTC (permalink / raw)
  To: Manivannan Sadhasivam
  Cc: Martin K . Petersen, linux-scsi, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter,
	Dmitry Baryshkov

On 11/27/25 8:59 AM, Manivannan Sadhasivam wrote:
> [1] https://lore.kernel.org/linux-scsi/20251114193406.3097237-1-bvanassche@acm.org/

This log fragment is only 55 lines long. Please provide the full kernel
log.

Thanks,

Bart.

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-11-29  2:31     ` Bart Van Assche
@ 2025-11-29  2:51       ` Manivannan Sadhasivam
  2025-12-02  1:29         ` Bart Van Assche
  0 siblings, 1 reply; 63+ messages in thread
From: Manivannan Sadhasivam @ 2025-11-29  2:51 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: Martin K . Petersen, linux-scsi, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter,
	Dmitry Baryshkov

On Fri, Nov 28, 2025 at 06:31:36PM -0800, Bart Van Assche wrote:
> On 11/27/25 8:59 AM, Manivannan Sadhasivam wrote:
> > [1] https://lore.kernel.org/linux-scsi/20251114193406.3097237-1-bvanassche@acm.org/
> 
> This log fragment is only 55 lines long. Please provide the full kernel
> log.
> 

I just copied the relevant log. But you can find the full log here:
https://gist.github.com/Mani-Sadhasivam/770022b53f11340fbaba06d8eaac1843

Unfortunately, there is not much useful information in the log.

- Mani

-- 
மணிவண்ணன் சதாசிவம்

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  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  8:12           ` Roger Shimizu
  0 siblings, 2 replies; 63+ messages in thread
From: Bart Van Assche @ 2025-12-02  1:29 UTC (permalink / raw)
  To: Manivannan Sadhasivam
  Cc: Martin K . Petersen, linux-scsi, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter,
	Dmitry Baryshkov, Roger Shimizu

On 11/28/25 6:51 PM, Manivannan Sadhasivam wrote:
> On Fri, Nov 28, 2025 at 06:31:36PM -0800, Bart Van Assche wrote:
>> On 11/27/25 8:59 AM, Manivannan Sadhasivam wrote:
>>> [1] https://lore.kernel.org/linux-scsi/20251114193406.3097237-1-bvanassche@acm.org/
>>
>> This log fragment is only 55 lines long. Please provide the full kernel
>> log.
>>
> 
> I just copied the relevant log. But you can find the full log here:
> https://gist.github.com/Mani-Sadhasivam/770022b53f11340fbaba06d8eaac1843
> 
> Unfortunately, there is not much useful information in the log.

(+Roger since he ran into a similar issue with a similar UFSHCI
controller)

Does the untested patch below help if it is applied on top of commit
1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved
request")? I'm wondering whether changing hba->reserved_slot from 31 to
0 triggers some controller behavior that has not been fully documented.

Thanks,

Bart.

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 20eae5d9487b..95f5b08e1cdc 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2476,7 +2476,8 @@ static inline int ufshcd_hba_capabilities(struct 
ufs_hba *hba)
         hba->nutrs = (hba->capabilities & 
MASK_TRANSFER_REQUESTS_SLOTS_SDB) + 1;
         hba->nutmrs =
         ((hba->capabilities & MASK_TASK_MANAGEMENT_REQUEST_SLOTS) >> 
16) + 1;
-       hba->reserved_slot = 0;
+       WARN_ON_ONCE(hba->host->nr_reserved_cmds <= 0);
+       hba->reserved_slot = hba->host->nr_reserved_cmds - 1;

         hba->nortt = FIELD_GET(MASK_NUMBER_OUTSTANDING_RTT, 
hba->capabilities) + 1;

diff --git a/include/ufs/ufshci.h b/include/ufs/ufshci.h
index d36df24242a3..46c98910dbfb 100644
--- a/include/ufs/ufshci.h
+++ b/include/ufs/ufshci.h
@@ -135,7 +135,7 @@ enum {
  #define MINOR_VERSION_NUM_MASK         UFS_MASK(0xFFFF, 0)
  #define MAJOR_VERSION_NUM_MASK         UFS_MASK(0xFFFF, 16)

-#define UFSHCD_NUM_RESERVED    1
+#define UFSHCD_NUM_RESERVED    2
  /*
   * Controller UFSHCI version
   * - 2.x and newer use the following scheme:



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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  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:12           ` Roger Shimizu
  1 sibling, 1 reply; 63+ messages in thread
From: Manivannan Sadhasivam @ 2025-12-02  4:46 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: Martin K . Petersen, linux-scsi, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter,
	Dmitry Baryshkov, Roger Shimizu, Nitin Rawat

+ Nitin

On Mon, Dec 01, 2025 at 03:29:38PM -1000, Bart Van Assche wrote:
> On 11/28/25 6:51 PM, Manivannan Sadhasivam wrote:
> > On Fri, Nov 28, 2025 at 06:31:36PM -0800, Bart Van Assche wrote:
> > > On 11/27/25 8:59 AM, Manivannan Sadhasivam wrote:
> > > > [1] https://lore.kernel.org/linux-scsi/20251114193406.3097237-1-bvanassche@acm.org/
> > > 
> > > This log fragment is only 55 lines long. Please provide the full kernel
> > > log.
> > > 
> > 
> > I just copied the relevant log. But you can find the full log here:
> > https://gist.github.com/Mani-Sadhasivam/770022b53f11340fbaba06d8eaac1843
> > 
> > Unfortunately, there is not much useful information in the log.
> 
> (+Roger since he ran into a similar issue with a similar UFSHCI
> controller)
> 
> Does the untested patch below help if it is applied on top of commit
> 1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved
> request")? I'm wondering whether changing hba->reserved_slot from 31 to
> 0 triggers some controller behavior that has not been fully documented.
> 

I checked out 1d0af94ffb5d and applied the diff, but it didn't help:

[    3.878314] scsi host0: ufshcd
[    3.881687] scsi host0: nr_reserved_cmds set but no method to queue
[    3.888310] ufshcd-qcom 1d84000.ufshc: scsi_add_host failed
[    3.895031] ufshcd-qcom 1d84000.ufshc: error -EINVAL: Initialization failed with error -22
[    3.903705] ufshcd-qcom 1d84000.ufshc: error -EINVAL: ufshcd_pltfrm_init() failed
[    3.911572] ufshcd-qcom 1d84000.ufshc: probe with driver ufshcd-qcom failed with error -22

I'm running out of time to debug this issue. I hope Nitin can also look into
this.

- Mani

> Thanks,
> 
> Bart.
> 
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 20eae5d9487b..95f5b08e1cdc 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -2476,7 +2476,8 @@ static inline int ufshcd_hba_capabilities(struct
> ufs_hba *hba)
>         hba->nutrs = (hba->capabilities & MASK_TRANSFER_REQUESTS_SLOTS_SDB)
> + 1;
>         hba->nutmrs =
>         ((hba->capabilities & MASK_TASK_MANAGEMENT_REQUEST_SLOTS) >> 16) +
> 1;
> -       hba->reserved_slot = 0;
> +       WARN_ON_ONCE(hba->host->nr_reserved_cmds <= 0);
> +       hba->reserved_slot = hba->host->nr_reserved_cmds - 1;
> 
>         hba->nortt = FIELD_GET(MASK_NUMBER_OUTSTANDING_RTT,
> hba->capabilities) + 1;
> 
> diff --git a/include/ufs/ufshci.h b/include/ufs/ufshci.h
> index d36df24242a3..46c98910dbfb 100644
> --- a/include/ufs/ufshci.h
> +++ b/include/ufs/ufshci.h
> @@ -135,7 +135,7 @@ enum {
>  #define MINOR_VERSION_NUM_MASK         UFS_MASK(0xFFFF, 0)
>  #define MAJOR_VERSION_NUM_MASK         UFS_MASK(0xFFFF, 16)
> 
> -#define UFSHCD_NUM_RESERVED    1
> +#define UFSHCD_NUM_RESERVED    2
>  /*
>   * Controller UFSHCI version
>   * - 2.x and newer use the following scheme:
> 
> 

-- 
மணிவண்ணன் சதாசிவம்

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-02  4:46           ` Manivannan Sadhasivam
@ 2025-12-02  7:37             ` Bart Van Assche
  2025-12-02  8:51               ` Manivannan Sadhasivam
  0 siblings, 1 reply; 63+ messages in thread
From: Bart Van Assche @ 2025-12-02  7:37 UTC (permalink / raw)
  To: Manivannan Sadhasivam
  Cc: Martin K . Petersen, linux-scsi, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter,
	Dmitry Baryshkov, Roger Shimizu, Nitin Rawat

On 12/1/25 6:46 PM, Manivannan Sadhasivam wrote:
> I checked out 1d0af94ffb5d and applied the diff, but it didn't help:
> 
> [    3.878314] scsi host0: ufshcd
> [    3.881687] scsi host0: nr_reserved_cmds set but no method to queue
> [    3.888310] ufshcd-qcom 1d84000.ufshc: scsi_add_host failed
> [    3.895031] ufshcd-qcom 1d84000.ufshc: error -EINVAL: Initialization failed with error -22
> [    3.903705] ufshcd-qcom 1d84000.ufshc: error -EINVAL: ufshcd_pltfrm_init() failed
> [    3.911572] ufshcd-qcom 1d84000.ufshc: probe with driver ufshcd-qcom failed with error -22
> 
> I'm running out of time to debug this issue. I hope Nitin can also look into
> this.

Unfortunately the series is not bisectable. Does this patch on top of
commit 1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved
request") help? If not, does the combination of the patch below and the
previous patch help?

Thanks,

Bart.

diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index e047747d4ecf..ad1476fb5035 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -231,12 +231,6 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, 
struct device *dev,
                 goto fail;
         }

-       if (shost->nr_reserved_cmds && !sht->queue_reserved_command) {
-               shost_printk(KERN_ERR, shost,
-                            "nr_reserved_cmds set but no method to 
queue\n");
-               goto fail;
-       }
-
         /* Use min_t(int, ...) in case shost->can_queue exceeds SHRT_MAX */
         shost->cmd_per_lun = min_t(int, shost->cmd_per_lun,
                                    shost->can_queue);


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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-02  1:29         ` Bart Van Assche
  2025-12-02  4:46           ` Manivannan Sadhasivam
@ 2025-12-02  8:12           ` Roger Shimizu
  1 sibling, 0 replies; 63+ messages in thread
From: Roger Shimizu @ 2025-12-02  8:12 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: Manivannan Sadhasivam, Martin K . Petersen, linux-scsi,
	James E.J. Bottomley, Peter Wang, Avri Altman, Bean Huo,
	Bao D. Nguyen, Adrian Hunter, Dmitry Baryshkov

On Mon, Dec 1, 2025 at 5:37 PM Bart Van Assche <bvanassche@acm.org> wrote:
>
> On 11/28/25 6:51 PM, Manivannan Sadhasivam wrote:
> > On Fri, Nov 28, 2025 at 06:31:36PM -0800, Bart Van Assche wrote:
> >> On 11/27/25 8:59 AM, Manivannan Sadhasivam wrote:
> >>> [1] https://lore.kernel.org/linux-scsi/20251114193406.3097237-1-bvanassche@acm.org/
> >>
> >> This log fragment is only 55 lines long. Please provide the full kernel
> >> log.
> >>
> >
> > I just copied the relevant log. But you can find the full log here:
> > https://gist.github.com/Mani-Sadhasivam/770022b53f11340fbaba06d8eaac1843
> >
> > Unfortunately, there is not much useful information in the log.
>
> (+Roger since he ran into a similar issue with a similar UFSHCI
> controller)
>
> Does the untested patch below help if it is applied on top of commit
> 1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved
> request")? I'm wondering whether changing hba->reserved_slot from 31 to
> 0 triggers some controller behavior that has not been fully documented.
>
> Thanks,
>
> Bart.
>
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 20eae5d9487b..95f5b08e1cdc 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -2476,7 +2476,8 @@ static inline int ufshcd_hba_capabilities(struct
> ufs_hba *hba)
>          hba->nutrs = (hba->capabilities &
> MASK_TRANSFER_REQUESTS_SLOTS_SDB) + 1;
>          hba->nutmrs =
>          ((hba->capabilities & MASK_TASK_MANAGEMENT_REQUEST_SLOTS) >>
> 16) + 1;
> -       hba->reserved_slot = 0;
> +       WARN_ON_ONCE(hba->host->nr_reserved_cmds <= 0);
> +       hba->reserved_slot = hba->host->nr_reserved_cmds - 1;

I checked "next-20251128" tag, above patch cannot be applied, and
"hba->reserved_slot" does not exist,
due to merged patch (to next branch) from
https://patch.msgid.link/20251031204029.2883185-29-bvanassche@acm.org

This issue only occurs on next branch, so please kindly provide the
patch on top of next branch.
Thank you!
-Roger

>          hba->nortt = FIELD_GET(MASK_NUMBER_OUTSTANDING_RTT,
> hba->capabilities) + 1;
>
> diff --git a/include/ufs/ufshci.h b/include/ufs/ufshci.h
> index d36df24242a3..46c98910dbfb 100644
> --- a/include/ufs/ufshci.h
> +++ b/include/ufs/ufshci.h
> @@ -135,7 +135,7 @@ enum {
>   #define MINOR_VERSION_NUM_MASK         UFS_MASK(0xFFFF, 0)
>   #define MAJOR_VERSION_NUM_MASK         UFS_MASK(0xFFFF, 16)
>
> -#define UFSHCD_NUM_RESERVED    1
> +#define UFSHCD_NUM_RESERVED    2
>   /*
>    * Controller UFSHCI version
>    * - 2.x and newer use the following scheme:
>
>

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-02  7:37             ` Bart Van Assche
@ 2025-12-02  8:51               ` Manivannan Sadhasivam
  2025-12-02 16:03                 ` Bart Van Assche
  0 siblings, 1 reply; 63+ messages in thread
From: Manivannan Sadhasivam @ 2025-12-02  8:51 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: Martin K . Petersen, linux-scsi, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter,
	Dmitry Baryshkov, Roger Shimizu, Nitin Rawat

On Mon, Dec 01, 2025 at 09:37:32PM -1000, Bart Van Assche wrote:
> On 12/1/25 6:46 PM, Manivannan Sadhasivam wrote:
> > I checked out 1d0af94ffb5d and applied the diff, but it didn't help:
> > 
> > [    3.878314] scsi host0: ufshcd
> > [    3.881687] scsi host0: nr_reserved_cmds set but no method to queue
> > [    3.888310] ufshcd-qcom 1d84000.ufshc: scsi_add_host failed
> > [    3.895031] ufshcd-qcom 1d84000.ufshc: error -EINVAL: Initialization failed with error -22
> > [    3.903705] ufshcd-qcom 1d84000.ufshc: error -EINVAL: ufshcd_pltfrm_init() failed
> > [    3.911572] ufshcd-qcom 1d84000.ufshc: probe with driver ufshcd-qcom failed with error -22
> > 
> > I'm running out of time to debug this issue. I hope Nitin can also look into
> > this.
> 
> Unfortunately the series is not bisectable. Does this patch on top of
> commit 1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved
> request") help? If not, does the combination of the patch below and the
> previous patch help?
> 

I applied below diff and the previous one on top of 1d0af94ffb5d, the board
booted fine. Even without the previous diff, the below one is sufficient enough
to fix the issue.

But I tried the below diff on top of next-20251127, and the issue still
persists. Please share a fix on top of scsi-next or next/master.

- Mani

> Thanks,
> 
> Bart.
> 
> diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
> index e047747d4ecf..ad1476fb5035 100644
> --- a/drivers/scsi/hosts.c
> +++ b/drivers/scsi/hosts.c
> @@ -231,12 +231,6 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost,
> struct device *dev,
>                 goto fail;
>         }
> 
> -       if (shost->nr_reserved_cmds && !sht->queue_reserved_command) {
> -               shost_printk(KERN_ERR, shost,
> -                            "nr_reserved_cmds set but no method to
> queue\n");
> -               goto fail;
> -       }
> -
>         /* Use min_t(int, ...) in case shost->can_queue exceeds SHRT_MAX */
>         shost->cmd_per_lun = min_t(int, shost->cmd_per_lun,
>                                    shost->can_queue);
> 

-- 
மணிவண்ணன் சதாசிவம்

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-02  8:51               ` Manivannan Sadhasivam
@ 2025-12-02 16:03                 ` Bart Van Assche
  2025-12-02 16:32                   ` Manivannan Sadhasivam
  2025-12-03  0:56                   ` Roger Shimizu
  0 siblings, 2 replies; 63+ messages in thread
From: Bart Van Assche @ 2025-12-02 16:03 UTC (permalink / raw)
  To: Manivannan Sadhasivam
  Cc: Martin K . Petersen, linux-scsi, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter,
	Dmitry Baryshkov, Roger Shimizu, Nitin Rawat

On 12/1/25 10:51 PM, Manivannan Sadhasivam wrote:
> Please share a fix on top of scsi-next or next/master.
Before a fix can be developed, the root cause needs to be identified.
We just learned that commit 1d0af94ffb5d ("scsi: ufs: core: Make the
reserved slot a reserved request") is not the root cause of the boot
hang.

Can you please help with the following:
* Verify whether or not Martin's for-next branch boots fine on the
   Qcom RB3Gen2 board (I expect this not to be the case). Martin's
   Linux kernel git repository is available at
   git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git.
* If Martin's for-next branch boots fine, bisect linux-next.
* If the boot hang is reproducible with Martin's for-next branch,
   bisect that branch. After every bisection step, apply the patch
   below to work around bisectability issues in this patch series.
   If any part of that patch fails to apply, ignore the failures.
   We already know that the boot hang does not occur with commit
   1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved
   request"). There are only 35 UFS patches on Martin's for-next branch
   past that commit:
   $ git log 1d0af94ffb5d..mkp-scsi/for-next */ufs|grep -c ^commit
   35

Thanks,

Bart.


diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 1b3fbd328277..ef7d6969ef06 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -231,12 +231,6 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, 
struct device *dev,
  		goto fail;
  	}

-	if (shost->nr_reserved_cmds && !sht->queue_reserved_command) {
-		shost_printk(KERN_ERR, shost,
-			     "nr_reserved_cmds set but no method to queue\n");
-		goto fail;
-	}
-
  	/* Use min_t(int, ...) in case shost->can_queue exceeds SHRT_MAX */
  	shost->cmd_per_lun = min_t(int, shost->cmd_per_lun,
  				   shost->can_queue);
diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
index 7d6d19361af9..4259f499382f 100644
--- a/drivers/ufs/core/ufshcd-priv.h
+++ b/drivers/ufs/core/ufshcd-priv.h
@@ -374,7 +374,12 @@ static inline bool 
ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info, u8
   */
  static inline struct scsi_cmnd *ufshcd_tag_to_cmd(struct ufs_hba *hba, 
u32 tag)
  {
-	struct blk_mq_tags *tags = hba->host->tag_set.shared_tags;
+	/*
+	 * Host-wide tags are enabled in MCQ mode only. See also the
+	 * host->host_tagset assignment in ufs-mcq.c.
+	 */
+	struct blk_mq_tags *tags = hba->host->tag_set.shared_tags ?:
+					   hba->host->tag_set.tags[0];
  	struct request *rq = blk_mq_tag_to_rq(tags, tag);

  	if (WARN_ON_ONCE(!rq))


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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  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
  1 sibling, 1 reply; 63+ messages in thread
From: Manivannan Sadhasivam @ 2025-12-02 16:32 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: Martin K . Petersen, linux-scsi, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter,
	Dmitry Baryshkov, Roger Shimizu, Nitin Rawat

On Tue, Dec 02, 2025 at 06:03:40AM -1000, Bart Van Assche wrote:
> On 12/1/25 10:51 PM, Manivannan Sadhasivam wrote:
> > Please share a fix on top of scsi-next or next/master.
> Before a fix can be developed, the root cause needs to be identified.
> We just learned that commit 1d0af94ffb5d ("scsi: ufs: core: Make the
> reserved slot a reserved request") is not the root cause of the boot
> hang.
> 
> Can you please help with the following:
> * Verify whether or not Martin's for-next branch boots fine on the
>   Qcom RB3Gen2 board (I expect this not to be the case). Martin's
>   Linux kernel git repository is available at
>   git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git.

If linux-next is broken and if I can revert patches that came from scsi-next and
found it to fix the issue, then it implies that scsi-next would be broken too.

> * If Martin's for-next branch boots fine, bisect linux-next.
> * If the boot hang is reproducible with Martin's for-next branch,
>   bisect that branch. After every bisection step, apply the patch
>   below to work around bisectability issues in this patch series.

This is insane. How can you make a 28 patch series not bisectable? If anyone is
doing a bisect in the future for any issue, are you expecting them to apply the
below fix to fix the failures?

This rule is clearly mentioned in the process documentation:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst#n190

- Mani

>   If any part of that patch fails to apply, ignore the failures.
>   We already know that the boot hang does not occur with commit
>   1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved
>   request"). There are only 35 UFS patches on Martin's for-next branch
>   past that commit:
>   $ git log 1d0af94ffb5d..mkp-scsi/for-next */ufs|grep -c ^commit
>   35
> 
> Thanks,
> 
> Bart.
> 
> 
> diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
> index 1b3fbd328277..ef7d6969ef06 100644
> --- a/drivers/scsi/hosts.c
> +++ b/drivers/scsi/hosts.c
> @@ -231,12 +231,6 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost,
> struct device *dev,
>  		goto fail;
>  	}
> 
> -	if (shost->nr_reserved_cmds && !sht->queue_reserved_command) {
> -		shost_printk(KERN_ERR, shost,
> -			     "nr_reserved_cmds set but no method to queue\n");
> -		goto fail;
> -	}
> -
>  	/* Use min_t(int, ...) in case shost->can_queue exceeds SHRT_MAX */
>  	shost->cmd_per_lun = min_t(int, shost->cmd_per_lun,
>  				   shost->can_queue);
> diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
> index 7d6d19361af9..4259f499382f 100644
> --- a/drivers/ufs/core/ufshcd-priv.h
> +++ b/drivers/ufs/core/ufshcd-priv.h
> @@ -374,7 +374,12 @@ static inline bool ufs_is_valid_unit_desc_lun(struct
> ufs_dev_info *dev_info, u8
>   */
>  static inline struct scsi_cmnd *ufshcd_tag_to_cmd(struct ufs_hba *hba, u32
> tag)
>  {
> -	struct blk_mq_tags *tags = hba->host->tag_set.shared_tags;
> +	/*
> +	 * Host-wide tags are enabled in MCQ mode only. See also the
> +	 * host->host_tagset assignment in ufs-mcq.c.
> +	 */
> +	struct blk_mq_tags *tags = hba->host->tag_set.shared_tags ?:
> +					   hba->host->tag_set.tags[0];
>  	struct request *rq = blk_mq_tag_to_rq(tags, tag);
> 
>  	if (WARN_ON_ONCE(!rq))
> 

-- 
மணிவண்ணன் சதாசிவம்

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-02 16:32                   ` Manivannan Sadhasivam
@ 2025-12-02 20:03                     ` Bart Van Assche
  0 siblings, 0 replies; 63+ messages in thread
From: Bart Van Assche @ 2025-12-02 20:03 UTC (permalink / raw)
  To: Manivannan Sadhasivam
  Cc: Martin K . Petersen, linux-scsi, James E.J. Bottomley, Peter Wang,
	Avri Altman, Bean Huo, Bao D. Nguyen, Adrian Hunter,
	Dmitry Baryshkov, Roger Shimizu, Nitin Rawat

On 12/2/25 6:32 AM, Manivannan Sadhasivam wrote:
> How can you make a 28 patch series not bisectable?
This happened by accident. This did not happen on purpose.

BTW, I noticed that both the Qualcomm RB3Gen2 board and the Rubik Pi 3
are based on the QCS6490 chipset. That chipset is unusual because it
supports some but not all UFSHCI 4.0 features (MCQ). I do not have
access to any device with that chipset so I can't bisect this issue
myself.

Bart.

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-02 16:03                 ` Bart Van Assche
  2025-12-02 16:32                   ` Manivannan Sadhasivam
@ 2025-12-03  0:56                   ` Roger Shimizu
  2025-12-03  5:46                     ` Bart Van Assche
  1 sibling, 1 reply; 63+ messages in thread
From: Roger Shimizu @ 2025-12-03  0:56 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: Manivannan Sadhasivam, Martin K . Petersen, linux-scsi,
	James E.J. Bottomley, Peter Wang, Avri Altman, Bean Huo,
	Bao D. Nguyen, Adrian Hunter, Dmitry Baryshkov, Nitin Rawat

Thanks for the patch, and detailed procedure to bisecting!

On Tue, Dec 2, 2025 at 8:03 AM Bart Van Assche <bvanassche@acm.org> wrote:
>
> On 12/1/25 10:51 PM, Manivannan Sadhasivam wrote:
> > Please share a fix on top of scsi-next or next/master.
> Before a fix can be developed, the root cause needs to be identified.
> We just learned that commit 1d0af94ffb5d ("scsi: ufs: core: Make the
> reserved slot a reserved request") is not the root cause of the boot
> hang.
>
> Can you please help with the following:
> * Verify whether or not Martin's for-next branch boots fine on the
>    Qcom RB3Gen2 board (I expect this not to be the case). Martin's
>    Linux kernel git repository is available at
>    git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git.

No, same boot issue for mkp/for-next branch.

> * If Martin's for-next branch boots fine, bisect linux-next.
> * If the boot hang is reproducible with Martin's for-next branch,
>    bisect that branch. After every bisection step, apply the patch
>    below to work around bisectability issues in this patch series.
>    If any part of that patch fails to apply, ignore the failures.
>    We already know that the boot hang does not occur with commit
>    1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved
>    request"). There are only 35 UFS patches on Martin's for-next branch
>    past that commit:
>    $ git log 1d0af94ffb5d..mkp-scsi/for-next */ufs|grep -c ^commit
>    35

First I want to clarify 1d0af94ffb5d ("scsi: ufs: core: Make the
reserved slot a reserved request")
has boot issue.
But applying for the debugging patch from your email, it boots fine.
So the bisecting start from here.

Bisecting result is:
08b12cda6c44 ("scsi: ufs: core: Switch to scsi_get_internal_cmd()") is
the first bad commit.

And this commit can apply the debugging patch (below) without any conflict.
Hope it helps, and thank you!
-Roger

> Thanks,
>
> Bart.
>
>
> diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
> index 1b3fbd328277..ef7d6969ef06 100644
> --- a/drivers/scsi/hosts.c
> +++ b/drivers/scsi/hosts.c
> @@ -231,12 +231,6 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost,
> struct device *dev,
>                 goto fail;
>         }
>
> -       if (shost->nr_reserved_cmds && !sht->queue_reserved_command) {
> -               shost_printk(KERN_ERR, shost,
> -                            "nr_reserved_cmds set but no method to queue\n");
> -               goto fail;
> -       }
> -
>         /* Use min_t(int, ...) in case shost->can_queue exceeds SHRT_MAX */
>         shost->cmd_per_lun = min_t(int, shost->cmd_per_lun,
>                                    shost->can_queue);
> diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
> index 7d6d19361af9..4259f499382f 100644
> --- a/drivers/ufs/core/ufshcd-priv.h
> +++ b/drivers/ufs/core/ufshcd-priv.h
> @@ -374,7 +374,12 @@ static inline bool
> ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info, u8
>    */
>   static inline struct scsi_cmnd *ufshcd_tag_to_cmd(struct ufs_hba *hba,
> u32 tag)
>   {
> -       struct blk_mq_tags *tags = hba->host->tag_set.shared_tags;
> +       /*
> +        * Host-wide tags are enabled in MCQ mode only. See also the
> +        * host->host_tagset assignment in ufs-mcq.c.
> +        */
> +       struct blk_mq_tags *tags = hba->host->tag_set.shared_tags ?:
> +                                          hba->host->tag_set.tags[0];
>         struct request *rq = blk_mq_tag_to_rq(tags, tag);
>
>         if (WARN_ON_ONCE(!rq))
>

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  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 22:40                       ` Nitin Rawat
  0 siblings, 2 replies; 63+ messages in thread
From: Bart Van Assche @ 2025-12-03  5:46 UTC (permalink / raw)
  To: Roger Shimizu
  Cc: Manivannan Sadhasivam, Martin K . Petersen, linux-scsi,
	James E.J. Bottomley, Nitin Rawat

On 12/2/25 2:56 PM, Roger Shimizu wrote:
> On Tue, Dec 2, 2025 at 8:03 AM Bart Van Assche <bvanassche@acm.org> wrote:
>> Can you please help with the following:
>> * Verify whether or not Martin's for-next branch boots fine on the
>>     Qcom RB3Gen2 board (I expect this not to be the case). Martin's
>>     Linux kernel git repository is available at
>>     git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git.
> 
> No, same boot issue for mkp/for-next branch.
> 
>> * If Martin's for-next branch boots fine, bisect linux-next.
>> * If the boot hang is reproducible with Martin's for-next branch,
>>     bisect that branch. After every bisection step, apply the patch
>>     below to work around bisectability issues in this patch series.
>>     If any part of that patch fails to apply, ignore the failures.
>>     We already know that the boot hang does not occur with commit
>>     1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved
>>     request"). There are only 35 UFS patches on Martin's for-next branch
>>     past that commit:
>>     $ git log 1d0af94ffb5d..mkp-scsi/for-next */ufs|grep -c ^commit
>>     35
> 
> First I want to clarify 1d0af94ffb5d ("scsi: ufs: core: Make the
> reserved slot a reserved request")
> has boot issue.
> But applying for the debugging patch from your email, it boots fine.
> So the bisecting start from here.
> 
> Bisecting result is:
> 08b12cda6c44 ("scsi: ufs: core: Switch to scsi_get_internal_cmd()") is
> the first bad commit.
> 
> And this commit can apply the debugging patch (below) without any conflict.
> Hope it helps, and thank you!
Thanks Roger for having taken the time to bisect this issue!
Unfortunately this information is not sufficient to identify the root
cause. This is what we can conclude from the information that has been
shared so far:
- The boot hang can't be caused by a ufshcd_get_dev_mgmt_cmd() hang
   because that function specifies the flag BLK_MQ_REQ_NOWAIT. That flag
   makes scsi_get_internal_cmd() return immediately if no reserved tag is
   available. If scsi_get_internal_cmd() would fail, the caller would
   emit a kernel warning. I haven't seen any kernel warnings in any of
   the kernel logs that have been shared so far.
- The boot hang can't be caused by a device management command timeout
   because blk_execute_rq() is used for submitting device management
   commands. blk_execute_rq() uses rq->timeout as timeout. Even if
   rq->timeout wouldn't be set, the block layer would initialize that
   timeout value. I haven't seen any data in any of the kernel logs that
   indicates a device management request timeout.

Could anyone share the call traces produced by
"echo w >/proc/sysrq-trigger" and also the output produced by
"echo t >/proc/sysrq-trigge"" after having reproduced the boot hang?

Thanks,

Bart.

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  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 22:40                       ` Nitin Rawat
  1 sibling, 1 reply; 63+ messages in thread
From: Nitin Rawat @ 2025-12-03 16:47 UTC (permalink / raw)
  To: Bart Van Assche, Roger Shimizu
  Cc: Manivannan Sadhasivam, Martin K . Petersen, linux-scsi,
	James E.J. Bottomley, Nitin Rawat

[-- Attachment #1: Type: text/plain, Size: 5328 bytes --]



On 12/3/2025 11:16 AM, Bart Van Assche wrote:
> On 12/2/25 2:56 PM, Roger Shimizu wrote:
>> On Tue, Dec 2, 2025 at 8:03 AM Bart Van Assche <bvanassche@acm.org> 
>> wrote:
>>> Can you please help with the following:
>>> * Verify whether or not Martin's for-next branch boots fine on the
>>>     Qcom RB3Gen2 board (I expect this not to be the case). Martin's
>>>     Linux kernel git repository is available at
>>>     git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git.
>>
>> No, same boot issue for mkp/for-next branch.
>>
>>> * If Martin's for-next branch boots fine, bisect linux-next.
>>> * If the boot hang is reproducible with Martin's for-next branch,
>>>     bisect that branch. After every bisection step, apply the patch
>>>     below to work around bisectability issues in this patch series.
>>>     If any part of that patch fails to apply, ignore the failures.
>>>     We already know that the boot hang does not occur with commit
>>>     1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved
>>>     request"). There are only 35 UFS patches on Martin's for-next branch
>>>     past that commit:
>>>     $ git log 1d0af94ffb5d..mkp-scsi/for-next */ufs|grep -c ^commit
>>>     35
>>
>> First I want to clarify 1d0af94ffb5d ("scsi: ufs: core: Make the
>> reserved slot a reserved request")
>> has boot issue.
>> But applying for the debugging patch from your email, it boots fine.
>> So the bisecting start from here.
>>
>> Bisecting result is:
>> 08b12cda6c44 ("scsi: ufs: core: Switch to scsi_get_internal_cmd()") is
>> the first bad commit.
>>
>> And this commit can apply the debugging patch (below) without any 
>> conflict.
>> Hope it helps, and thank you!
> Thanks Roger for having taken the time to bisect this issue!
> Unfortunately this information is not sufficient to identify the root
> cause. This is what we can conclude from the information that has been
> shared so far:
> - The boot hang can't be caused by a ufshcd_get_dev_mgmt_cmd() hang
>    because that function specifies the flag BLK_MQ_REQ_NOWAIT. That flag
>    makes scsi_get_internal_cmd() return immediately if no reserved tag is
>    available. If scsi_get_internal_cmd() would fail, the caller would
>    emit a kernel warning. I haven't seen any kernel warnings in any of
>    the kernel logs that have been shared so far.
> - The boot hang can't be caused by a device management command timeout
>    because blk_execute_rq() is used for submitting device management
>    commands. blk_execute_rq() uses rq->timeout as timeout. Even if
>    rq->timeout wouldn't be set, the block layer would initialize that
>    timeout value. I haven't seen any data in any of the kernel logs that
>    indicates a device management request timeout.
> 
> Could anyone share the call traces produced by
> "echo w >/proc/sysrq-trigger" and also the output produced by
> "echo t >/proc/sysrq-trigge"" after having reproduced the boot hang?

Hi Bart,

I tested on other platforms - SM8650 and SM8750 , and the same error 
occurs there as well. Seems like the issue impacts all targets.

I suspect the problem is related to the new tag implementation in the 
device management command.

Below is the call stack observed each time the issue occurs:
[  274.480707] task:kworker/u33:6   state:D stack:0     pid:94 
tgid:94    ppid:2      task_flags:0x4208060 flags:0x00000010
[  274.492127] Workqueue: devfreq_wq devfreq_monitor
[  274.496964] Call trace:
[  274.499481]  __switch_to+0xec/0x1c0 (T)
[  274.503431]  __schedule+0x368/0xce0
[  274.507025]  schedule+0x34/0x118
[  274.510354]  schedule_timeout+0xd4/0x110
[  274.514393]  io_schedule_timeout+0x48/0x68
[  274.518608]  wait_for_completion_io+0x78/0x140
[  274.523178]  blk_execute_rq+0xbc/0x13c
[  274.527038]  ufshcd_exec_dev_cmd+0x1e0/0x260
[  274.531431]  ufshcd_query_flag+0x158/0x1e0
[  274.535646]  ufshcd_query_flag_retry+0x4c/0xa8
[  274.540215]  ufshcd_wb_toggle+0x54/0xc0
[  274.544165]  ufshcd_devfreq_scale+0x2c0/0x448
[  274.548645]  ufshcd_devfreq_target+0xd4/0x24c
[  274.553125]  devfreq_set_target+0x90/0x184
[  274.557340]  devfreq_update_target+0xc0/0xdc
[  274.561732]  devfreq_monitor+0x34/0xa0
[  274.565591]  process_one_work+0x148/0x290
[  274.569717]  worker_thread+0x2c8/0x3e4
[  274.573576]  kthread+0x12c/0x204
[  274.576895]  ret_from_fork+0x10/0x20

I’ve attached the file containing the call trace for echo w > 
/proc/sysrq-trigger and echo t > /proc/sysrq-trigger.

I haven’t had a chance to bisect yet, but after reverting the following 
UFS patches from the linux-next tip, everything works fine:

scsi-ufs-core-Fix-EH-failure-after-W-LUN-resu.patch
scsi-ufs-core-Remove-an-unnecessary-NULL-poin.patch
scsi-ufs-core-Fix-single-doorbell-mode-suppor.patch
scsi-ufs-core-Use-scsi_device_busy.patch
scsi-ufs-core-Switch-to-scsi_get_internal_cmd.patch
scsi-ufs-core-Move-code-out-of-ufshcd_wait_fo.patch
scsi-ufs-core-Make-blk_mq_tagset_busy_iter-sk.patch
scsi-ufs-core-Remove-the-ufshcd_lrb-task_tag-.patch
scsi-ufs-core-Pass-a-SCSI-pointer-instead-of-.patch
scsi-ufs-core-Optimize-the-hot-path.patch
scsi-ufs-core-Do-not-clear-driver-private-com.patch
scsi-ufs-core-Use-hba-reserved_slot.patch
scsi-ufs-core-Make-the-reserved-slot-a-reserv.patch

Regards,
Nitin



> 
> Thanks,
> 
> Bart.
> 

[-- Attachment #2: all tasks.txt --]
[-- Type: text/plain, Size: 194751 bytes --]

[  183.721342] pci 0000:01:00.0: [17cb:110e] type 00 class 0x028000 PCIe Endpoint
[  183.729051] pci 0000:01:00.0: BAR 0 [mem 0x00000000-0x001fffff 64bit]
[  183.735688] pci 0000:01:00.0: BAR 2 [mem 0x00000000-0x00007fff 64bit]
[  183.742895] pci 0000:01:00.0: PME# supported from D0 D3hot D3cold
[  183.749754] pci 0000:01:00.0: Adding to iommu group 5
[  183.761225] pci 0000:01:00.0: ASPM: default states L0s L1
[  183.766913] pcieport 0000:00:00.0: bridge window [mem 0x40400000-0x406fffff]: assigned
[  183.775052] pci 0000:01:00.0: BAR 0 [mem 0x40400000-0x405fffff 64bit]: assigned
[  183.782654] pci 0000:01:00.0: BAR 2 [mem 0x40600000-0x40607fff 64bit]: assigned

[  199.914781] sysrq: Show State
[  199.917850] task:systemd         state:S stack:0     pid:1     tgid:1     ppid:0      task_flags:0x400100 flags:0x00000000
[  199.929183] Call trace:
[  199.931701]  __switch_to+0xec/0x1c0 (T)
[  199.935655]  __schedule+0x368/0xce0
[  199.939249]  schedule+0x34/0x118
[  199.942578]  schedule_hrtimeout_range+0xf0/0x100
[  199.947328]  do_epoll_wait+0x47c/0x4dc
[  199.951188]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  199.956200]  __arm64_sys_epoll_pwait+0x78/0x120
[  199.960858]  invoke_syscall+0x48/0x104
[  199.964718]  el0_svc_common.constprop.0+0x40/0xe0
[  199.969553]  do_el0_svc+0x1c/0x28
[  199.972970]  el0_svc+0x34/0x108
[  199.976210]  el0t_64_sync_handler+0xa0/0xf0
[  199.980514]  el0t_64_sync+0x198/0x19c
[  199.984285] task:kthreadd        state:S stack:0     pid:2     tgid:2     ppid:0      task_flags:0x208040 flags:0x00000010
[  199.995616] Call trace:
[  199.998133]  __switch_to+0xec/0x1c0 (T)
[  200.002082]  __schedule+0x368/0xce0
[  200.005676]  schedule+0x34/0x118
[  200.009005]  kthreadd+0x1c0/0x1d0
[  200.012422]  ret_from_fork+0x10/0x20
[  200.016107] task:pool_workqueue_ state:S stack:0     pid:3     tgid:3     ppid:2      task_flags:0x208040 flags:0x00000010
[  200.027437] Call trace:
[  200.029953]  __switch_to+0xec/0x1c0 (T)
[  200.033903]  __schedule+0x368/0xce0
[  200.037497]  schedule+0x34/0x118
[  200.040815]  kthread_worker_fn+0x154/0x180
[  200.045032]  kthread+0x12c/0x204
[  200.048351]  ret_from_fork+0x10/0x20
[  200.052036] task:kworker/R-rcu_g state:I stack:0     pid:4     tgid:4     ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.063459] Workqueue:  0x0 (rcu_gp)
[  200.067144] Call trace:
[  200.069661]  __switch_to+0xec/0x1c0 (T)
[  200.073611]  __schedule+0x368/0xce0
[  200.077205]  schedule+0x34/0x118
[  200.080534]  rescuer_thread+0x3a4/0x4a4
[  200.084483]  kthread+0x12c/0x204
[  200.087802]  ret_from_fork+0x10/0x20
[  200.091486] task:kworker/R-sync_ state:I stack:0     pid:5     tgid:5     ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.102906] Call trace:
[  200.105423]  __switch_to+0xec/0x1c0 (T)
[  200.109373]  __schedule+0x368/0xce0
[  200.112967]  schedule+0x34/0x118
[  200.116296]  rescuer_thread+0x3a4/0x4a4
[  200.120244]  kthread+0x12c/0x204
[  200.123574]  ret_from_fork+0x10/0x20
[  200.127259] task:kworker/R-kvfre state:I stack:0     pid:6     tgid:6     ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.138679] Call trace:
[  200.141196]  __switch_to+0xec/0x1c0 (T)
[  200.145146]  __schedule+0x368/0xce0
[  200.148740]  schedule+0x34/0x118
[  200.152069]  rescuer_thread+0x3a4/0x4a4
[  200.156018]  kthread+0x12c/0x204
[  200.159337]  ret_from_fork+0x10/0x20
[  200.163022] task:kworker/R-slub_ state:I stack:0     pid:7     tgid:7     ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.174442] Call trace:
[  200.176959]  __switch_to+0xec/0x1c0 (T)
[  200.180909]  __schedule+0x368/0xce0
[  200.184502]  schedule+0x34/0x118
[  200.187832]  rescuer_thread+0x3a4/0x4a4
[  200.191780]  kthread+0x12c/0x204
[  200.195100]  ret_from_fork+0x10/0x20
[  200.198784] task:kworker/R-netns state:I stack:0     pid:8     tgid:8     ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.210204] Call trace:
[  200.212721]  __switch_to+0xec/0x1c0 (T)
[  200.216671]  __schedule+0x368/0xce0
[  200.220264]  schedule+0x34/0x118
[  200.223593]  rescuer_thread+0x3a4/0x4a4
[  200.227542]  kthread+0x12c/0x204
[  200.230861]  ret_from_fork+0x10/0x20
[  200.234546] task:kworker/0:0     state:I stack:0     pid:9     tgid:9     ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.245967] Workqueue:  0x0 (cgroup_release)
[  200.250359] Call trace:
[  200.252875]  __switch_to+0xec/0x1c0 (T)
[  200.256825]  __schedule+0x368/0xce0
[  200.260419]  schedule+0x34/0x118
[  200.263738]  worker_thread+0x1e4/0x3e4
[  200.267596]  kthread+0x12c/0x204
[  200.270915]  ret_from_fork+0x10/0x20
[  200.274600] task:kworker/0:1     state:I stack:0     pid:10    tgid:10    ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.286019] Workqueue:  0x0 (cgroup_free)
[  200.290145] Call trace:
[  200.292663]  __switch_to+0xec/0x1c0 (T)
[  200.296612]  __schedule+0x368/0xce0
[  200.300205]  schedule+0x34/0x118
[  200.303534]  worker_thread+0x1e4/0x3e4
[  200.307393]  kthread+0x12c/0x204
[  200.310723]  ret_from_fork+0x10/0x20
[  200.314407] task:kworker/0:0H    state:I stack:0     pid:11    tgid:11    ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.325827] Workqueue:  0x0 (kblockd)
[  200.329599] Call trace:
[  200.332116]  __switch_to+0xec/0x1c0 (T)
[  200.336066]  __schedule+0x368/0xce0
[  200.339659]  schedule+0x34/0x118
[  200.342977]  worker_thread+0x1e4/0x3e4
[  200.346836]  kthread+0x12c/0x204
[  200.350166]  ret_from_fork+0x10/0x20
[  200.353850] task:kworker/u32:0   state:I stack:0     pid:12    tgid:12    ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.365270] Workqueue:  0x0 (ipv6_addrconf)
[  200.369573] Call trace:
[  200.372090]  __switch_to+0xec/0x1c0 (T)
[  200.376040]  __schedule+0x368/0xce0
[  200.379634]  schedule+0x34/0x118
[  200.382963]  worker_thread+0x1e4/0x3e4
[  200.386822]  kthread+0x12c/0x204
[  200.390151]  ret_from_fork+0x10/0x20
[  200.393836] task:kworker/R-mm_pe state:I stack:0     pid:13    tgid:13    ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.405256] Call trace:
[  200.407773]  __switch_to+0xec/0x1c0 (T)
[  200.411723]  __schedule+0x368/0xce0
[  200.415316]  schedule+0x34/0x118
[  200.418634]  rescuer_thread+0x3a4/0x4a4
[  200.422583]  kthread+0x12c/0x204
[  200.425913]  ret_from_fork+0x10/0x20
[  200.429599] task:ksoftirqd/0     state:S stack:0     pid:14    tgid:14    ppid:2      task_flags:0x4208040 flags:0x00000010
[  200.441018] Call trace:
[  200.443535]  __switch_to+0xec/0x1c0 (T)
[  200.447485]  __schedule+0x368/0xce0
[  200.451078]  schedule+0x34/0x118
[  200.454397]  smpboot_thread_fn+0x94/0x234
[  200.458524]  kthread+0x12c/0x204
[  200.461854]  ret_from_fork+0x10/0x20
[  200.465539] task:rcu_preempt     state:I stack:0     pid:15    tgid:15    ppid:2      task_flags:0x208040 flags:0x00000010
[  200.476868] Call trace:
[  200.479385]  __switch_to+0xec/0x1c0 (T)
[  200.483335]  __schedule+0x368/0xce0
[  200.486929]  schedule+0x34/0x118
[  200.490247]  rcu_gp_kthread+0x100/0x160
[  200.494198]  kthread+0x12c/0x204
[  200.497528]  ret_from_fork+0x10/0x20
[  200.501213] task:rcu_exp_par_gp_ state:S stack:0     pid:16    tgid:16    ppid:2      task_flags:0x208040 flags:0x00000010
[  200.512542] Call trace:
[  200.515059]  __switch_to+0xec/0x1c0 (T)
[  200.519009]  __schedule+0x368/0xce0
[  200.522603]  schedule+0x34/0x118
[  200.525921]  kthread_worker_fn+0x154/0x180
[  200.530137]  kthread+0x12c/0x204
[  200.533467]  ret_from_fork+0x10/0x20
[  200.537152] task:rcu_exp_gp_kthr state:S stack:0     pid:17    tgid:17    ppid:2      task_flags:0x208040 flags:0x00000010
[  200.548481] Call trace:
[  200.550998]  __switch_to+0xec/0x1c0 (T)
[  200.554947]  __schedule+0x368/0xce0
[  200.558541]  schedule+0x34/0x118
[  200.561870]  kthread_worker_fn+0x154/0x180
[  200.566085]  kthread+0x12c/0x204
[  200.569415]  ret_from_fork+0x10/0x20
[  200.573100] task:migration/0     state:S stack:0     pid:18    tgid:18    ppid:2      task_flags:0x4208040 flags:0x00000010
[  200.584518] Stopper: 0x0 <- 0x0
[  200.587756] Call trace:
[  200.590273]  __switch_to+0xec/0x1c0 (T)
[  200.594223]  __schedule+0x368/0xce0
[  200.597817]  schedule+0x34/0x118
[  200.601146]  smpboot_thread_fn+0x94/0x234
[  200.605273]  kthread+0x12c/0x204
[  200.608603]  ret_from_fork+0x10/0x20
[  200.612288] task:cpuhp/0         state:S stack:0     pid:19    tgid:19    ppid:2      task_flags:0x4208040 flags:0x00000010
[  200.623707] Call trace:
[  200.626224]  __switch_to+0xec/0x1c0 (T)
[  200.630173]  __schedule+0x368/0xce0
[  200.633767]  schedule+0x34/0x118
[  200.637096]  smpboot_thread_fn+0x94/0x234
[  200.641223]  kthread+0x12c/0x204
[  200.644553]  ret_from_fork+0x10/0x20
[  200.648238] task:cpuhp/1         state:S stack:0     pid:20    tgid:20    ppid:2      task_flags:0x4208040 flags:0x00000010
[  200.659657] Call trace:
[  200.662174]  __switch_to+0xec/0x1c0 (T)
[  200.666124]  __schedule+0x368/0xce0
[  200.669718]  schedule+0x34/0x118
[  200.673036]  smpboot_thread_fn+0x94/0x234
[  200.677163]  kthread+0x12c/0x204
[  200.680493]  ret_from_fork+0x10/0x20
[  200.684177] task:migration/1     state:S stack:0     pid:21    tgid:21    ppid:2      task_flags:0x4208040 flags:0x00000010
[  200.695597] Stopper: 0x0 <- 0x0
[  200.698834] Call trace:
[  200.701351]  __switch_to+0xec/0x1c0 (T)
[  200.705301]  __schedule+0x368/0xce0
[  200.708895]  schedule+0x34/0x118
[  200.712224]  smpboot_thread_fn+0x94/0x234
[  200.716351]  kthread+0x12c/0x204
[  200.719681]  ret_from_fork+0x10/0x20
[  200.723366] task:ksoftirqd/1     state:S stack:0     pid:22    tgid:22    ppid:2      task_flags:0x4208040 flags:0x00000010
[  200.734785] Call trace:
[  200.737302]  __switch_to+0xec/0x1c0 (T)
[  200.741251]  __schedule+0x368/0xce0
[  200.744845]  schedule+0x34/0x118
[  200.748174]  smpboot_thread_fn+0x94/0x234
[  200.752301]  kthread+0x12c/0x204
[  200.755620]  ret_from_fork+0x10/0x20
[  200.759304] task:kworker/1:0     state:I stack:0     pid:23    tgid:23    ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.770724] Workqueue:  0x0 (rcu_gp)
[  200.774407] Call trace:
[  200.776925]  __switch_to+0xec/0x1c0 (T)
[  200.780874]  __schedule+0x368/0xce0
[  200.784468]  schedule+0x34/0x118
[  200.787797]  worker_thread+0x1e4/0x3e4
[  200.791657]  kthread+0x12c/0x204
[  200.794986]  ret_from_fork+0x10/0x20
[  200.798670] task:kworker/1:0H    state:I stack:0     pid:24    tgid:24    ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.810090] Call trace:
[  200.812607]  __switch_to+0xec/0x1c0 (T)
[  200.816557]  __schedule+0x368/0xce0
[  200.820150]  schedule+0x34/0x118
[  200.823469]  worker_thread+0x1e4/0x3e4
[  200.827327]  kthread+0x12c/0x204
[  200.830647]  ret_from_fork+0x10/0x20
[  200.834331] task:cpuhp/2         state:S stack:0     pid:25    tgid:25    ppid:2      task_flags:0x4208040 flags:0x00000010
[  200.845750] Call trace:
[  200.848268]  __switch_to+0xec/0x1c0 (T)
[  200.852217]  __schedule+0x368/0xce0
[  200.855811]  schedule+0x34/0x118
[  200.859139]  smpboot_thread_fn+0x94/0x234
[  200.863267]  kthread+0x12c/0x204
[  200.866597]  ret_from_fork+0x10/0x20
[  200.870281] task:migration/2     state:S stack:0     pid:26    tgid:26    ppid:2      task_flags:0x4208040 flags:0x00000010
[  200.881700] Stopper: 0x0 <- 0x0
[  200.884937] Call trace:
[  200.887454]  __switch_to+0xec/0x1c0 (T)
[  200.891404]  __schedule+0x368/0xce0
[  200.894998]  schedule+0x34/0x118
[  200.898317]  smpboot_thread_fn+0x94/0x234
[  200.902444]  kthread+0x12c/0x204
[  200.905763]  ret_from_fork+0x10/0x20
[  200.909447] task:ksoftirqd/2     state:S stack:0     pid:27    tgid:27    ppid:2      task_flags:0x4208040 flags:0x00000010
[  200.920866] Call trace:
[  200.923383]  __switch_to+0xec/0x1c0 (T)
[  200.927333]  __schedule+0x368/0xce0
[  200.930927]  schedule+0x34/0x118
[  200.934256]  smpboot_thread_fn+0x94/0x234
[  200.938383]  kthread+0x12c/0x204
[  200.941703]  ret_from_fork+0x10/0x20
[  200.945387] task:kworker/2:0     state:I stack:0     pid:28    tgid:28    ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.956807] Workqueue:  0x0 (cgroup_bpf_destroy)
[  200.961555] Call trace:
[  200.964072]  __switch_to+0xec/0x1c0 (T)
[  200.968022]  __schedule+0x368/0xce0
[  200.971615]  schedule+0x34/0x118
[  200.974944]  worker_thread+0x1e4/0x3e4
[  200.978803]  kthread+0x12c/0x204
[  200.982122]  ret_from_fork+0x10/0x20
[  200.985806] task:kworker/2:0H    state:I stack:0     pid:29    tgid:29    ppid:2      task_flags:0x4208060 flags:0x00000010
[  200.997226] Workqueue:  0x0 (kblockd)
[  201.000998] Call trace:
[  201.003514]  __switch_to+0xec/0x1c0 (T)
[  201.007464]  __schedule+0x368/0xce0
[  201.011058]  schedule+0x34/0x118
[  201.014387]  worker_thread+0x1e4/0x3e4
[  201.018246]  kthread+0x12c/0x204
[  201.021565]  ret_from_fork+0x10/0x20
[  201.025249] task:cpuhp/3         state:S stack:0     pid:30    tgid:30    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.036668] Call trace:
[  201.039185]  __switch_to+0xec/0x1c0 (T)
[  201.043135]  __schedule+0x368/0xce0
[  201.046729]  schedule+0x34/0x118
[  201.050047]  smpboot_thread_fn+0x94/0x234
[  201.054174]  kthread+0x12c/0x204
[  201.057504]  ret_from_fork+0x10/0x20
[  201.061188] task:migration/3     state:S stack:0     pid:31    tgid:31    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.072607] Stopper: 0x0 <- 0x0
[  201.075844] Call trace:
[  201.078362]  __switch_to+0xec/0x1c0 (T)
[  201.082312]  __schedule+0x368/0xce0
[  201.085906]  schedule+0x34/0x118
[  201.089235]  smpboot_thread_fn+0x94/0x234
[  201.093362]  kthread+0x12c/0x204
[  201.096682]  ret_from_fork+0x10/0x20
[  201.100366] task:ksoftirqd/3     state:S stack:0     pid:32    tgid:32    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.111786] Call trace:
[  201.114303]  __switch_to+0xec/0x1c0 (T)
[  201.118253]  __schedule+0x368/0xce0
[  201.121847]  schedule+0x34/0x118
[  201.125176]  smpboot_thread_fn+0x94/0x234
[  201.129303]  kthread+0x12c/0x204
[  201.132633]  ret_from_fork+0x10/0x20
[  201.136317] task:kworker/3:0     state:I stack:0     pid:33    tgid:33    ppid:2      task_flags:0x4208060 flags:0x00000010
[  201.147738] Workqueue:  0x0 (cgroup_free)
[  201.151864] Call trace:
[  201.154381]  __switch_to+0xec/0x1c0 (T)
[  201.158330]  __schedule+0x368/0xce0
[  201.161924]  schedule+0x34/0x118
[  201.165253]  worker_thread+0x1e4/0x3e4
[  201.169112]  kthread+0x12c/0x204
[  201.172442]  ret_from_fork+0x10/0x20
[  201.176126] task:kworker/3:0H    state:I stack:0     pid:34    tgid:34    ppid:2      task_flags:0x4208060 flags:0x00000010
[  201.187545] Call trace:
[  201.190063]  __switch_to+0xec/0x1c0 (T)
[  201.194013]  __schedule+0x368/0xce0
[  201.197606]  schedule+0x34/0x118
[  201.200935]  worker_thread+0x1e4/0x3e4
[  201.204794]  kthread+0x12c/0x204
[  201.208113]  ret_from_fork+0x10/0x20
[  201.211798] task:cpuhp/4         state:S stack:0     pid:35    tgid:35    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.223217] Call trace:
[  201.225734]  __switch_to+0xec/0x1c0 (T)
[  201.229684]  __schedule+0x368/0xce0
[  201.233277]  schedule+0x34/0x118
[  201.236606]  smpboot_thread_fn+0x94/0x234
[  201.240733]  kthread+0x12c/0x204
[  201.244063]  ret_from_fork+0x10/0x20
[  201.247748] task:migration/4     state:S stack:0     pid:36    tgid:36    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.259166] Stopper: 0x0 <- 0x0
[  201.262404] Call trace:
[  201.264921]  __switch_to+0xec/0x1c0 (T)
[  201.268871]  __schedule+0x368/0xce0
[  201.272465]  schedule+0x34/0x118
[  201.275793]  smpboot_thread_fn+0x94/0x234
[  201.279921]  kthread+0x12c/0x204
[  201.283251]  ret_from_fork+0x10/0x20
[  201.286935] task:ksoftirqd/4     state:S stack:0     pid:37    tgid:37    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.298354] Call trace:
[  201.300871]  __switch_to+0xec/0x1c0 (T)
[  201.304821]  __schedule+0x368/0xce0
[  201.308415]  schedule+0x34/0x118
[  201.311744]  smpboot_thread_fn+0x94/0x234
[  201.315871]  kthread+0x12c/0x204
[  201.319200]  ret_from_fork+0x10/0x20
[  201.322885] task:kworker/4:0     state:I stack:0     pid:38    tgid:38    ppid:2      task_flags:0x4208060 flags:0x00000010
[  201.334304] Workqueue:  0x0 (mm_percpu_wq)
[  201.338519] Call trace:
[  201.341036]  __switch_to+0xec/0x1c0 (T)
[  201.344986]  __schedule+0x368/0xce0
[  201.348580]  schedule+0x34/0x118
[  201.351909]  worker_thread+0x1e4/0x3e4
[  201.355768]  kthread+0x12c/0x204
[  201.359087]  ret_from_fork+0x10/0x20
[  201.362771] task:kworker/4:0H    state:I stack:0     pid:39    tgid:39    ppid:2      task_flags:0x4208060 flags:0x00000010
[  201.374190] Call trace:
[  201.376707]  __switch_to+0xec/0x1c0 (T)
[  201.380657]  __schedule+0x368/0xce0
[  201.384251]  schedule+0x34/0x118
[  201.387580]  worker_thread+0x1e4/0x3e4
[  201.391439]  kthread+0x12c/0x204
[  201.394758]  ret_from_fork+0x10/0x20
[  201.398442] task:cpuhp/5         state:S stack:0     pid:40    tgid:40    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.409861] Call trace:
[  201.412378]  __switch_to+0xec/0x1c0 (T)
[  201.416328]  __schedule+0x368/0xce0
[  201.419921]  schedule+0x34/0x118
[  201.423240]  smpboot_thread_fn+0x94/0x234
[  201.427367]  kthread+0x12c/0x204
[  201.430697]  ret_from_fork+0x10/0x20
[  201.434381] task:migration/5     state:S stack:0     pid:41    tgid:41    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.445800] Stopper: 0x0 <- 0x0
[  201.449037] Call trace:
[  201.451554]  __switch_to+0xec/0x1c0 (T)
[  201.455504]  __schedule+0x368/0xce0
[  201.459098]  schedule+0x34/0x118
[  201.462427]  smpboot_thread_fn+0x94/0x234
[  201.466554]  kthread+0x12c/0x204
[  201.469873]  ret_from_fork+0x10/0x20
[  201.473557] task:ksoftirqd/5     state:S stack:0     pid:42    tgid:42    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.484977] Call trace:
[  201.487494]  __switch_to+0xec/0x1c0 (T)
[  201.491443]  __schedule+0x368/0xce0
[  201.495037]  schedule+0x34/0x118
[  201.498366]  smpboot_thread_fn+0x94/0x234
[  201.502493]  kthread+0x12c/0x204
[  201.505812]  ret_from_fork+0x10/0x20
[  201.509496] task:kworker/5:0     state:I stack:0     pid:43    tgid:43    ppid:2      task_flags:0x4208060 flags:0x00000010
[  201.520916] Workqueue:  0x0 (device_link_wq)
[  201.525309] Call trace:
[  201.527826]  __switch_to+0xec/0x1c0 (T)
[  201.531775]  __schedule+0x368/0xce0
[  201.535369]  schedule+0x34/0x118
[  201.538687]  worker_thread+0x1e4/0x3e4
[  201.542546]  kthread+0x12c/0x204
[  201.545865]  ret_from_fork+0x10/0x20
[  201.549549] task:kworker/5:0H    state:I stack:0     pid:44    tgid:44    ppid:2      task_flags:0x4208060 flags:0x00000010
[  201.560969] Workqueue:  0x0 (events_highpri)
[  201.565361] Call trace:
[  201.567878]  __switch_to+0xec/0x1c0 (T)
[  201.571828]  __schedule+0x368/0xce0
[  201.575422]  schedule+0x34/0x118
[  201.578750]  worker_thread+0x1e4/0x3e4
[  201.582609]  kthread+0x12c/0x204
[  201.585939]  ret_from_fork+0x10/0x20
[  201.589623] task:cpuhp/6         state:S stack:0     pid:45    tgid:45    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.601043] Call trace:
[  201.603560]  __switch_to+0xec/0x1c0 (T)
[  201.607510]  __schedule+0x368/0xce0
[  201.611104]  schedule+0x34/0x118
[  201.614433]  smpboot_thread_fn+0x94/0x234
[  201.618560]  kthread+0x12c/0x204
[  201.621890]  ret_from_fork+0x10/0x20
[  201.625575] task:migration/6     state:S stack:0     pid:46    tgid:46    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.636994] Stopper: 0x0 <- 0x0
[  201.640231] Call trace:
[  201.642748]  __switch_to+0xec/0x1c0 (T)
[  201.646698]  __schedule+0x368/0xce0
[  201.650291]  schedule+0x34/0x118
[  201.653620]  smpboot_thread_fn+0x94/0x234
[  201.657747]  kthread+0x12c/0x204
[  201.661077]  ret_from_fork+0x10/0x20
[  201.664762] task:ksoftirqd/6     state:S stack:0     pid:47    tgid:47    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.676182] Call trace:
[  201.678699]  __switch_to+0xec/0x1c0 (T)
[  201.682649]  __schedule+0x368/0xce0
[  201.686243]  schedule+0x34/0x118
[  201.689571]  smpboot_thread_fn+0x94/0x234
[  201.693699]  kthread+0x12c/0x204
[  201.697029]  ret_from_fork+0x10/0x20
[  201.700713] task:kworker/6:0     state:I stack:0     pid:48    tgid:48    ppid:2      task_flags:0x4208060 flags:0x00000010
[  201.712133] Workqueue:  0x0 (cgroup_release)
[  201.716525] Call trace:
[  201.719042]  __switch_to+0xec/0x1c0 (T)
[  201.722992]  __schedule+0x368/0xce0
[  201.726585]  schedule+0x34/0x118
[  201.729903]  worker_thread+0x1e4/0x3e4
[  201.733762]  kthread+0x12c/0x204
[  201.737081]  ret_from_fork+0x10/0x20
[  201.740765] task:kworker/6:0H    state:I stack:0     pid:49    tgid:49    ppid:2      task_flags:0x4208060 flags:0x00000010
[  201.752185] Call trace:
[  201.754702]  __switch_to+0xec/0x1c0 (T)
[  201.758652]  __schedule+0x368/0xce0
[  201.762245]  schedule+0x34/0x118
[  201.765575]  worker_thread+0x1e4/0x3e4
[  201.769433]  kthread+0x12c/0x204
[  201.772752]  ret_from_fork+0x10/0x20
[  201.776437] task:cpuhp/7         state:S stack:0     pid:50    tgid:50    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.787857] Call trace:
[  201.790374]  __switch_to+0xec/0x1c0 (T)
[  201.794323]  __schedule+0x368/0xce0
[  201.797917]  schedule+0x34/0x118
[  201.801246]  smpboot_thread_fn+0x94/0x234
[  201.805373]  kthread+0x12c/0x204
[  201.808703]  ret_from_fork+0x10/0x20
[  201.812388] task:migration/7     state:S stack:0     pid:51    tgid:51    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.823807] Stopper: 0x0 <- 0x0
[  201.827044] Call trace:
[  201.829561]  __switch_to+0xec/0x1c0 (T)
[  201.833511]  __schedule+0x368/0xce0
[  201.837104]  schedule+0x34/0x118
[  201.840434]  smpboot_thread_fn+0x94/0x234
[  201.844561]  kthread+0x12c/0x204
[  201.847880]  ret_from_fork+0x10/0x20
[  201.851564] task:ksoftirqd/7     state:S stack:0     pid:52    tgid:52    ppid:2      task_flags:0x4208040 flags:0x00000010
[  201.862983] Call trace:
[  201.865500]  __switch_to+0xec/0x1c0 (T)
[  201.869449]  __schedule+0x368/0xce0
[  201.873043]  schedule+0x34/0x118
[  201.876372]  smpboot_thread_fn+0x94/0x234
[  201.880499]  kthread+0x12c/0x204
[  201.883829]  ret_from_fork+0x10/0x20
[  201.887514] task:kworker/7:0     state:I stack:0     pid:53    tgid:53    ppid:2      task_flags:0x4208060 flags:0x00000010
[  201.898934] Workqueue:  0x0 (mm_percpu_wq)
[  201.903148] Call trace:
[  201.905665]  __switch_to+0xec/0x1c0 (T)
[  201.909615]  __schedule+0x368/0xce0
[  201.913209]  schedule+0x34/0x118
[  201.916538]  worker_thread+0x1e4/0x3e4
[  201.920397]  kthread+0x12c/0x204
[  201.923727]  ret_from_fork+0x10/0x20
[  201.927411] task:kworker/7:0H    state:I stack:0     pid:54    tgid:54    ppid:2      task_flags:0x4208060 flags:0x00000010
[  201.938831] Call trace:
[  201.941348]  __switch_to+0xec/0x1c0 (T)
[  201.945298]  __schedule+0x368/0xce0
[  201.948891]  schedule+0x34/0x118
[  201.952221]  worker_thread+0x1e4/0x3e4
[  201.956080]  kthread+0x12c/0x204
[  201.959410]  ret_from_fork+0x10/0x20
[  201.963094] task:kworker/u33:0   state:S stack:0     pid:55    tgid:55    ppid:2      task_flags:0x4208060 flags:0x00000010
[  201.974514] Workqueue: events_unbound call_usermodehelper_exec_work
[  201.980959] Call trace:
[  201.983476]  __switch_to+0xec/0x1c0 (T)
[  201.987426]  __schedule+0x368/0xce0
[  201.991020]  schedule+0x34/0x118
[  201.994349]  do_wait+0x5c/0xbc
[  201.997500]  kernel_wait+0x5c/0xc0
[  202.001006]  call_usermodehelper_exec_work+0xa4/0xb4
[  202.006108]  process_one_work+0x148/0x290
[  202.010234]  worker_thread+0x2c8/0x3e4
[  202.014093]  kthread+0x12c/0x204
[  202.017423]  ret_from_fork+0x10/0x20
[  202.021107] task:kworker/u34:0   state:I stack:0     pid:56    tgid:56    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.032527] Workqueue:  0x0 (events_unbound)
[  202.036920] Call trace:
[  202.039437]  __switch_to+0xec/0x1c0 (T)
[  202.043387]  __schedule+0x368/0xce0
[  202.046981]  schedule+0x34/0x118
[  202.050299]  worker_thread+0x1e4/0x3e4
[  202.054158]  kthread+0x12c/0x204
[  202.057477]  ret_from_fork+0x10/0x20
[  202.061162] task:kdevtmpfs       state:S stack:0     pid:57    tgid:57    ppid:2      task_flags:0x208140 flags:0x00000010
[  202.072491] Call trace:
[  202.075008]  __switch_to+0xec/0x1c0 (T)
[  202.078957]  __schedule+0x368/0xce0
[  202.082551]  schedule+0x34/0x118
[  202.085869]  devtmpfs_work_loop+0x3f8/0x3fc
[  202.090173]  devtmpfsd+0x30/0x54
[  202.093502]  kthread+0x12c/0x204
[  202.096832]  ret_from_fork+0x10/0x20
[  202.100516] task:kworker/R-inet_ state:I stack:0     pid:58    tgid:58    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.111937] Call trace:
[  202.114454]  __switch_to+0xec/0x1c0 (T)
[  202.118403]  __schedule+0x368/0xce0
[  202.121997]  schedule+0x34/0x118
[  202.125326]  rescuer_thread+0x3a4/0x4a4
[  202.129275]  kthread+0x12c/0x204
[  202.132604]  ret_from_fork+0x10/0x20
[  202.136289] task:rcu_tasks_kthre state:I stack:0     pid:59    tgid:59    ppid:2      task_flags:0x208040 flags:0x00000010
[  202.147619] Call trace:
[  202.150136]  __switch_to+0xec/0x1c0 (T)
[  202.154086]  __schedule+0x368/0xce0
[  202.157680]  schedule+0x34/0x118
[  202.161008]  rcu_tasks_one_gp+0x204/0x480
[  202.165137]  rcu_tasks_kthread+0xbc/0xd0
[  202.169177]  kthread+0x12c/0x204
[  202.172507]  ret_from_fork+0x10/0x20
[  202.176192] task:rcu_tasks_trace state:I stack:0     pid:60    tgid:60    ppid:2      task_flags:0x208040 flags:0x00000010
[  202.187521] Call trace:
[  202.190038]  __switch_to+0xec/0x1c0 (T)
[  202.193988]  __schedule+0x368/0xce0
[  202.197582]  schedule+0x34/0x118
[  202.200911]  rcu_tasks_one_gp+0x204/0x480
[  202.205038]  rcu_tasks_kthread+0xbc/0xd0
[  202.209078]  kthread+0x12c/0x204
[  202.212408]  ret_from_fork+0x10/0x20
[  202.216092] task:kworker/u33:1   state:D stack:0     pid:61    tgid:61    ppid:2      task_flags:0x4288160 flags:0x00000010
[  202.227514] Workqueue: pm pm_runtime_work
[  202.231642] Call trace:
[  202.234159]  __switch_to+0xec/0x1c0 (T)
[  202.238109]  __schedule+0x368/0xce0
[  202.241703]  schedule+0x34/0x118
[  202.245021]  schedule_timeout+0xd4/0x110
[  202.249059]  io_schedule_timeout+0x48/0x68
[  202.253274]  wait_for_completion_io+0x78/0x140
[  202.257845]  blk_execute_rq+0xbc/0x13c
[  202.261706]  scsi_execute_cmd+0x130/0x3f4
[  202.265834]  sd_sync_cache+0xe4/0x220
[  202.269607]  sd_suspend_common.isra.0+0x60/0x160
[  202.274355]  sd_suspend_runtime+0x18/0x38
[  202.278482]  scsi_runtime_suspend+0x6c/0xc0
[  202.282787]  __rpm_callback+0x48/0x1e0
[  202.286646]  rpm_callback+0x38/0x80
[  202.290239]  rpm_suspend+0x10c/0x580
[  202.293922]  pm_runtime_work+0xc8/0xcc
[  202.297781]  process_one_work+0x148/0x290
[  202.301908]  worker_thread+0x2c8/0x3e4
[  202.305766]  kthread+0x12c/0x204
[  202.309096]  ret_from_fork+0x10/0x20
[  202.312781] task:oom_reaper      state:S stack:0     pid:62    tgid:62    ppid:2      task_flags:0x200040 flags:0x00000010
[  202.324110] Call trace:
[  202.326627]  __switch_to+0xec/0x1c0 (T)
[  202.330576]  __schedule+0x368/0xce0
[  202.334170]  schedule+0x34/0x118
[  202.337488]  oom_reaper+0x14c/0x268
[  202.341085]  kthread+0x12c/0x204
[  202.344404]  ret_from_fork+0x10/0x20
[  202.348088] task:kworker/R-write state:I stack:0     pid:63    tgid:63    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.359509] Call trace:
[  202.362025]  __switch_to+0xec/0x1c0 (T)
[  202.365975]  __schedule+0x368/0xce0
[  202.369568]  schedule+0x34/0x118
[  202.372897]  rescuer_thread+0x3a4/0x4a4
[  202.376846]  kthread+0x12c/0x204
[  202.380177]  ret_from_fork+0x10/0x20
[  202.383860] task:kcompactd0      state:S stack:0     pid:64    tgid:64    ppid:2      task_flags:0x210040 flags:0x00000010
[  202.395190] Call trace:
[  202.397706]  __switch_to+0xec/0x1c0 (T)
[  202.401655]  __schedule+0x368/0xce0
[  202.405249]  schedule+0x34/0x118
[  202.408567]  schedule_timeout+0x8c/0x110
[  202.412606]  kcompactd+0x2fc/0x358
[  202.416113]  kthread+0x12c/0x204
[  202.419432]  ret_from_fork+0x10/0x20
[  202.423116] task:ksmd            state:S stack:0     pid:65    tgid:65    ppid:2      task_flags:0x200040 flags:0x00000010
[  202.434445] Call trace:
[  202.436962]  __switch_to+0xec/0x1c0 (T)
[  202.440912]  __schedule+0x368/0xce0
[  202.444506]  schedule+0x34/0x118
[  202.447835]  ksm_scan_thread+0xe34/0x1b18
[  202.451963]  kthread+0x12c/0x204
[  202.455293]  ret_from_fork+0x10/0x20
[  202.458977] task:khugepaged      state:S stack:0     pid:66    tgid:66    ppid:2      task_flags:0x200040 flags:0x00000010
[  202.470307] Call trace:
[  202.472824]  __switch_to+0xec/0x1c0 (T)
[  202.476773]  __schedule+0x368/0xce0
[  202.480367]  schedule+0x34/0x118
[  202.483696]  khugepaged+0x3f0/0x7f8
[  202.487291]  kthread+0x12c/0x204
[  202.490621]  ret_from_fork+0x10/0x20
[  202.494305] task:kworker/R-kbloc state:I stack:0     pid:67    tgid:67    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.505725] Call trace:
[  202.508242]  __switch_to+0xec/0x1c0 (T)
[  202.512192]  __schedule+0x368/0xce0
[  202.515786]  schedule+0x34/0x118
[  202.519114]  rescuer_thread+0x3a4/0x4a4
[  202.523063]  kthread+0x12c/0x204
[  202.526382]  ret_from_fork+0x10/0x20
[  202.530067] task:kworker/R-blkcg state:I stack:0     pid:68    tgid:68    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.541487] Call trace:
[  202.544004]  __switch_to+0xec/0x1c0 (T)
[  202.547954]  __schedule+0x368/0xce0
[  202.551548]  schedule+0x34/0x118
[  202.554866]  rescuer_thread+0x3a4/0x4a4
[  202.558815]  kthread+0x12c/0x204
[  202.562145]  ret_from_fork+0x10/0x20
[  202.565830] task:kworker/R-kinte state:I stack:0     pid:69    tgid:69    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.577250] Call trace:
[  202.579767]  __switch_to+0xec/0x1c0 (T)
[  202.583717]  __schedule+0x368/0xce0
[  202.587311]  schedule+0x34/0x118
[  202.590640]  rescuer_thread+0x3a4/0x4a4
[  202.594588]  kthread+0x12c/0x204
[  202.597919]  ret_from_fork+0x10/0x20
[  202.601603] task:kworker/R-tpm_d state:I stack:0     pid:70    tgid:70    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.613024] Call trace:
[  202.615541]  __switch_to+0xec/0x1c0 (T)
[  202.619491]  __schedule+0x368/0xce0
[  202.623085]  schedule+0x34/0x118
[  202.626414]  rescuer_thread+0x3a4/0x4a4
[  202.630363]  kthread+0x12c/0x204
[  202.633682]  ret_from_fork+0x10/0x20
[  202.637366] task:kworker/R-ata_s state:I stack:0     pid:71    tgid:71    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.648786] Call trace:
[  202.651303]  __switch_to+0xec/0x1c0 (T)
[  202.655253]  __schedule+0x368/0xce0
[  202.658847]  schedule+0x34/0x118
[  202.662165]  rescuer_thread+0x3a4/0x4a4
[  202.666114]  kthread+0x12c/0x204
[  202.669444]  ret_from_fork+0x10/0x20
[  202.673129] task:kworker/R-edac- state:I stack:0     pid:72    tgid:72    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.684549] Call trace:
[  202.687066]  __switch_to+0xec/0x1c0 (T)
[  202.691016]  __schedule+0x368/0xce0
[  202.694609]  schedule+0x34/0x118
[  202.697938]  rescuer_thread+0x3a4/0x4a4
[  202.701887]  kthread+0x12c/0x204
[  202.705217]  ret_from_fork+0x10/0x20
[  202.708902] task:kworker/R-devfr state:I stack:0     pid:73    tgid:73    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.720322] Call trace:
[  202.722839]  __switch_to+0xec/0x1c0 (T)
[  202.726789]  __schedule+0x368/0xce0
[  202.730382]  schedule+0x34/0x118
[  202.733700]  rescuer_thread+0x3a4/0x4a4
[  202.737649]  kthread+0x12c/0x204
[  202.740968]  ret_from_fork+0x10/0x20
[  202.744653] task:watchdogd       state:S stack:0     pid:74    tgid:74    ppid:2      task_flags:0x208040 flags:0x00000010
[  202.755983] Call trace:
[  202.758500]  __switch_to+0xec/0x1c0 (T)
[  202.762450]  __schedule+0x368/0xce0
[  202.766043]  schedule+0x34/0x118
[  202.769372]  kthread_worker_fn+0x154/0x180
[  202.773588]  kthread+0x12c/0x204
[  202.776918]  ret_from_fork+0x10/0x20
[  202.780602] task:kworker/2:1     state:I stack:0     pid:75    tgid:75    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.792022] Workqueue:  0x0 (cgroup_release)
[  202.796414] Call trace:
[  202.798931]  __switch_to+0xec/0x1c0 (T)
[  202.802881]  __schedule+0x368/0xce0
[  202.806475]  schedule+0x34/0x118
[  202.809793]  worker_thread+0x1e4/0x3e4
[  202.813652]  kthread+0x12c/0x204
[  202.816982]  ret_from_fork+0x10/0x20
[  202.820666] task:kworker/R-quota state:I stack:0     pid:76    tgid:76    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.832086] Call trace:
[  202.834603]  __switch_to+0xec/0x1c0 (T)
[  202.838553]  __schedule+0x368/0xce0
[  202.842146]  schedule+0x34/0x118
[  202.845475]  rescuer_thread+0x3a4/0x4a4
[  202.849424]  kthread+0x12c/0x204
[  202.852743]  ret_from_fork+0x10/0x20
[  202.856428] task:kworker/0:1H    state:I stack:0     pid:77    tgid:77    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.867848] Workqueue:  0x0 (events_highpri)
[  202.872240] Call trace:
[  202.874757]  __switch_to+0xec/0x1c0 (T)
[  202.878707]  __schedule+0x368/0xce0
[  202.882300]  schedule+0x34/0x118
[  202.885619]  worker_thread+0x1e4/0x3e4
[  202.889478]  kthread+0x12c/0x204
[  202.892808]  ret_from_fork+0x10/0x20
[  202.896492] task:kworker/R-rpcio state:I stack:0     pid:78    tgid:78    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.907913] Call trace:
[  202.910430]  __switch_to+0xec/0x1c0 (T)
[  202.914380]  __schedule+0x368/0xce0
[  202.917974]  schedule+0x34/0x118
[  202.921303]  rescuer_thread+0x3a4/0x4a4
[  202.925252]  kthread+0x12c/0x204
[  202.928582]  ret_from_fork+0x10/0x20
[  202.932266] task:kworker/R-xprti state:I stack:0     pid:79    tgid:79    ppid:2      task_flags:0x4208060 flags:0x00000010
[  202.943685] Call trace:
[  202.946202]  __switch_to+0xec/0x1c0 (T)
[  202.950152]  __schedule+0x368/0xce0
[  202.953745]  schedule+0x34/0x118
[  202.957075]  rescuer_thread+0x3a4/0x4a4
[  202.961023]  kthread+0x12c/0x204
[  202.964353]  ret_from_fork+0x10/0x20
[  202.968038] task:kswapd0         state:S stack:0     pid:80    tgid:80    ppid:2      task_flags:0x220840 flags:0x00000010
[  202.979368] Call trace:
[  202.981884]  __switch_to+0xec/0x1c0 (T)
[  202.985834]  __schedule+0x368/0xce0
[  202.989428]  schedule+0x34/0x118
[  202.992757]  kswapd+0x36c/0x380
[  202.995996]  kthread+0x12c/0x204
[  202.999326]  ret_from_fork+0x10/0x20
[  203.003011] task:kworker/u33:2   state:S stack:0     pid:81    tgid:81    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.014432] Workqueue: events_unbound call_usermodehelper_exec_work
[  203.020876] Call trace:
[  203.023393]  __switch_to+0xec/0x1c0 (T)
[  203.027343]  __schedule+0x368/0xce0
[  203.030937]  schedule+0x34/0x118
[  203.034255]  do_wait+0x5c/0xbc
[  203.037405]  kernel_wait+0x5c/0xc0
[  203.040911]  call_usermodehelper_exec_work+0xa4/0xb4
[  203.046013]  process_one_work+0x148/0x290
[  203.050139]  worker_thread+0x2c8/0x3e4
[  203.053998]  kthread+0x12c/0x204
[  203.057328]  ret_from_fork+0x10/0x20
[  203.061012] task:kworker/R-nfsio state:I stack:0     pid:82    tgid:82    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.072432] Call trace:
[  203.074949]  __switch_to+0xec/0x1c0 (T)
[  203.078899]  __schedule+0x368/0xce0
[  203.082493]  schedule+0x34/0x118
[  203.085822]  rescuer_thread+0x3a4/0x4a4
[  203.089770]  kthread+0x12c/0x204
[  203.093101]  ret_from_fork+0x10/0x20
[  203.096785] task:kworker/1:1     state:I stack:0     pid:83    tgid:83    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.108206] Workqueue:  0x0 (device_link_wq)
[  203.112598] Call trace:
[  203.115115]  __switch_to+0xec/0x1c0 (T)
[  203.119064]  __schedule+0x368/0xce0
[  203.122658]  schedule+0x34/0x118
[  203.125987]  worker_thread+0x1e4/0x3e4
[  203.129846]  kthread+0x12c/0x204
[  203.133176]  ret_from_fork+0x10/0x20
[  203.136860] task:kworker/6:1     state:I stack:0     pid:84    tgid:84    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.148281] Workqueue:  0x0 (events)
[  203.151964] Call trace:
[  203.154481]  __switch_to+0xec/0x1c0 (T)
[  203.158431]  __schedule+0x368/0xce0
[  203.162025]  schedule+0x34/0x118
[  203.165343]  worker_thread+0x1e4/0x3e4
[  203.169202]  kthread+0x12c/0x204
[  203.172521]  ret_from_fork+0x10/0x20
[  203.176205] task:kworker/0:2     state:I stack:0     pid:85    tgid:85    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.187626] Workqueue:  0x0 (cgroup_free)
[  203.191752] Call trace:
[  203.194269]  __switch_to+0xec/0x1c0 (T)
[  203.198219]  __schedule+0x368/0xce0
[  203.201813]  schedule+0x34/0x118
[  203.205141]  worker_thread+0x1e4/0x3e4
[  203.209000]  kthread+0x12c/0x204
[  203.212330]  ret_from_fork+0x10/0x20
[  203.216015] task:kworker/0:3     state:I stack:0     pid:86    tgid:86    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.227435] Workqueue:  0x0 (cgroup_free)
[  203.231562] Call trace:
[  203.234079]  __switch_to+0xec/0x1c0 (T)
[  203.238029]  __schedule+0x368/0xce0
[  203.241623]  schedule+0x34/0x118
[  203.244951]  worker_thread+0x1e4/0x3e4
[  203.248810]  kthread+0x12c/0x204
[  203.252140]  ret_from_fork+0x10/0x20
[  203.255824] task:kworker/0:4     state:I stack:0     pid:87    tgid:87    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.267244] Workqueue:  0x0 (mm_percpu_wq)
[  203.271459] Call trace:
[  203.273976]  __switch_to+0xec/0x1c0 (T)
[  203.277926]  __schedule+0x368/0xce0
[  203.281520]  schedule+0x34/0x118
[  203.284838]  worker_thread+0x1e4/0x3e4
[  203.288697]  kthread+0x12c/0x204
[  203.292027]  ret_from_fork+0x10/0x20
[  203.295711] task:kworker/1:1H    state:I stack:0     pid:89    tgid:89    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.307132] Workqueue:  0x0 (events_highpri)
[  203.311524] Call trace:
[  203.314041]  __switch_to+0xec/0x1c0 (T)
[  203.317990]  __schedule+0x368/0xce0
[  203.321584]  schedule+0x34/0x118
[  203.324913]  worker_thread+0x1e4/0x3e4
[  203.328772]  kthread+0x12c/0x204
[  203.332091]  ret_from_fork+0x10/0x20
[  203.335776] task:kworker/7:1     state:I stack:0     pid:90    tgid:90    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.347196] Workqueue:  0x0 (cgroup_free)
[  203.351323] Call trace:
[  203.353840]  __switch_to+0xec/0x1c0 (T)
[  203.357789]  __schedule+0x368/0xce0
[  203.361383]  schedule+0x34/0x118
[  203.364712]  worker_thread+0x1e4/0x3e4
[  203.368571]  kthread+0x12c/0x204
[  203.371901]  ret_from_fork+0x10/0x20
[  203.375586] task:kworker/u33:3   state:I stack:0     pid:91    tgid:91    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.387007] Workqueue:  0x0 (async)
[  203.390601] Call trace:
[  203.393118]  __switch_to+0xec/0x1c0 (T)
[  203.397068]  __schedule+0x368/0xce0
[  203.400662]  schedule+0x34/0x118
[  203.403980]  worker_thread+0x1e4/0x3e4
[  203.407839]  kthread+0x12c/0x204
[  203.411169]  ret_from_fork+0x10/0x20
[  203.414853] task:kworker/u33:4   state:D stack:0     pid:92    tgid:92    ppid:2      task_flags:0x4288060 flags:0x00000010
[  203.426273] Workqueue: pm pm_runtime_work
[  203.430399] Call trace:
[  203.432916]  __switch_to+0xec/0x1c0 (T)
[  203.436867]  __schedule+0x368/0xce0
[  203.440461]  schedule+0x34/0x118
[  203.443779]  schedule_timeout+0xd4/0x110
[  203.447818]  io_schedule_timeout+0x48/0x68
[  203.452032]  wait_for_completion_io+0x78/0x140
[  203.456602]  blk_execute_rq+0xbc/0x13c
[  203.460463]  scsi_execute_cmd+0x130/0x3f4
[  203.464590]  sd_sync_cache+0xe4/0x220
[  203.468362]  sd_suspend_common.isra.0+0x60/0x160
[  203.473110]  sd_suspend_runtime+0x18/0x38
[  203.477237]  scsi_runtime_suspend+0x6c/0xc0
[  203.481539]  __rpm_callback+0x48/0x1e0
[  203.485398]  rpm_callback+0x38/0x80
[  203.488992]  rpm_suspend+0x10c/0x580
[  203.492674]  pm_runtime_work+0xc8/0xcc
[  203.496533]  process_one_work+0x148/0x290
[  203.500660]  worker_thread+0x2c8/0x3e4
[  203.504518]  kthread+0x12c/0x204
[  203.507848]  ret_from_fork+0x10/0x20
[  203.511533] task:kworker/u33:5   state:I stack:0     pid:93    tgid:93    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.522952] Workqueue:  0x0 (async)
[  203.526546] Call trace:
[  203.529063]  __switch_to+0xec/0x1c0 (T)
[  203.533013]  __schedule+0x368/0xce0
[  203.536606]  schedule+0x34/0x118
[  203.539935]  worker_thread+0x1e4/0x3e4
[  203.543794]  kthread+0x12c/0x204
[  203.547113]  ret_from_fork+0x10/0x20
[  203.550797] task:kworker/u33:6   state:D stack:0     pid:94    tgid:94    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.562218] Workqueue: devfreq_wq devfreq_monitor
[  203.567055] Call trace:
[  203.569572]  __switch_to+0xec/0x1c0 (T)
[  203.573522]  __schedule+0x368/0xce0
[  203.577116]  schedule+0x34/0x118
[  203.580444]  schedule_timeout+0xd4/0x110
[  203.584483]  io_schedule_timeout+0x48/0x68
[  203.588698]  wait_for_completion_io+0x78/0x140
[  203.593268]  blk_execute_rq+0xbc/0x13c
[  203.597128]  ufshcd_exec_dev_cmd+0x1e0/0x260
[  203.601522]  ufshcd_query_flag+0x158/0x1e0
[  203.605736]  ufshcd_query_flag_retry+0x4c/0xa8
[  203.610306]  ufshcd_wb_toggle+0x54/0xc0
[  203.614255]  ufshcd_devfreq_scale+0x2c0/0x448
[  203.618735]  ufshcd_devfreq_target+0xd4/0x24c
[  203.623215]  devfreq_set_target+0x90/0x184
[  203.627430]  devfreq_update_target+0xc0/0xdc
[  203.631822]  devfreq_monitor+0x34/0xa0
[  203.635681]  process_one_work+0x148/0x290
[  203.639807]  worker_thread+0x2c8/0x3e4
[  203.643666]  kthread+0x12c/0x204
[  203.646985]  ret_from_fork+0x10/0x20
[  203.650670] task:kworker/u33:7   state:D stack:0     pid:95    tgid:95    ppid:2      task_flags:0x4288060 flags:0x00000010
[  203.662090] Workqueue: pm pm_runtime_work
[  203.666217] Call trace:
[  203.668734]  __switch_to+0xec/0x1c0 (T)
[  203.672684]  __schedule+0x368/0xce0
[  203.676278]  schedule+0x34/0x118
[  203.679596]  schedule_timeout+0xd4/0x110
[  203.683635]  io_schedule_timeout+0x48/0x68
[  203.687850]  wait_for_completion_io+0x78/0x140
[  203.692420]  blk_execute_rq+0xbc/0x13c
[  203.696280]  scsi_execute_cmd+0x130/0x3f4
[  203.700407]  sd_sync_cache+0xe4/0x220
[  203.704179]  sd_suspend_common.isra.0+0x60/0x160
[  203.708927]  sd_suspend_runtime+0x18/0x38
[  203.713053]  scsi_runtime_suspend+0x6c/0xc0
[  203.717357]  __rpm_callback+0x48/0x1e0
[  203.721215]  rpm_callback+0x38/0x80
[  203.724809]  rpm_suspend+0x10c/0x580
[  203.728492]  pm_runtime_work+0xc8/0xcc
[  203.732351]  process_one_work+0x148/0x290
[  203.736477]  worker_thread+0x2c8/0x3e4
[  203.740336]  kthread+0x12c/0x204
[  203.743666]  ret_from_fork+0x10/0x20
[  203.747350] task:kworker/5:1     state:I stack:0     pid:96    tgid:96    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.758770] Workqueue:  0x0 (device_link_wq)
[  203.763163] Call trace:
[  203.765680]  __switch_to+0xec/0x1c0 (T)
[  203.769629]  __schedule+0x368/0xce0
[  203.773223]  schedule+0x34/0x118
[  203.776552]  worker_thread+0x1e4/0x3e4
[  203.780411]  kthread+0x12c/0x204
[  203.783741]  ret_from_fork+0x10/0x20
[  203.787426] task:kworker/5:2     state:I stack:0     pid:97    tgid:97    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.798845] Workqueue:  0x0 (device_link_wq)
[  203.803237] Call trace:
[  203.805754]  __switch_to+0xec/0x1c0 (T)
[  203.809704]  __schedule+0x368/0xce0
[  203.813297]  schedule+0x34/0x118
[  203.816626]  worker_thread+0x1e4/0x3e4
[  203.820485]  kthread+0x12c/0x204
[  203.823804]  ret_from_fork+0x10/0x20
[  203.827489] task:kworker/u35:0   state:I stack:0     pid:98    tgid:98    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.838909] Workqueue:  0x0 (ufs_clk_gating_0)
[  203.843479] Call trace:
[  203.845996]  __switch_to+0xec/0x1c0 (T)
[  203.849946]  __schedule+0x368/0xce0
[  203.853540]  schedule+0x34/0x118
[  203.856858]  worker_thread+0x1e4/0x3e4
[  203.860716]  kthread+0x12c/0x204
[  203.864035]  ret_from_fork+0x10/0x20
[  203.867720] task:kworker/1:2     state:I stack:0     pid:99    tgid:99    ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.879140] Workqueue:  0x0 (cgroup_free)
[  203.883267] Call trace:
[  203.885783]  __switch_to+0xec/0x1c0 (T)
[  203.889733]  __schedule+0x368/0xce0
[  203.893327]  schedule+0x34/0x118
[  203.896656]  worker_thread+0x1e4/0x3e4
[  203.900514]  kthread+0x12c/0x204
[  203.903844]  ret_from_fork+0x10/0x20
[  203.907528] task:kworker/1:3     state:I stack:0     pid:100   tgid:100   ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.918948] Workqueue:  0x0 (events)
[  203.922631] Call trace:
[  203.925148]  __switch_to+0xec/0x1c0 (T)
[  203.929098]  __schedule+0x368/0xce0
[  203.932691]  schedule+0x34/0x118
[  203.936021]  worker_thread+0x1e4/0x3e4
[  203.939879]  kthread+0x12c/0x204
[  203.943209]  ret_from_fork+0x10/0x20
[  203.946894] task:kworker/R-vfio- state:I stack:0     pid:101   tgid:101   ppid:2      task_flags:0x4208060 flags:0x00000010
[  203.958314] Call trace:
[  203.960831]  __switch_to+0xec/0x1c0 (T)
[  203.964782]  __schedule+0x368/0xce0
[  203.968375]  schedule+0x34/0x118
[  203.971704]  rescuer_thread+0x3a4/0x4a4
[  203.975653]  kthread+0x12c/0x204
[  203.978972]  ret_from_fork+0x10/0x20
[  203.982657] task:hwrng           state:S stack:0     pid:102   tgid:102   ppid:2      task_flags:0x208040 flags:0x00000010
[  203.993987] Call trace:
[  203.996504]  __switch_to+0xec/0x1c0 (T)
[  204.000454]  __schedule+0x368/0xce0
[  204.004048]  schedule+0x34/0x118
[  204.007377]  schedule_timeout+0x8c/0x110
[  204.011416]  schedule_timeout_interruptible+0x1c/0x30
[  204.016607]  add_hwgenerator_randomness+0xb4/0x118
[  204.021533]  hwrng_fillfn+0x1b0/0x214
[  204.025306]  kthread+0x12c/0x204
[  204.028625]  ret_from_fork+0x10/0x20
[  204.032310] task:irq/16-smp2p-ad state:S stack:0     pid:103   tgid:103   ppid:2      task_flags:0x4208040 flags:0x00000010
[  204.043729] Call trace:
[  204.046246]  __switch_to+0xec/0x1c0 (T)
[  204.050196]  __schedule+0x368/0xce0
[  204.053789]  schedule+0x34/0x118
[  204.057119]  irq_thread+0x13c/0x32c
[  204.060714]  kthread+0x12c/0x204
[  204.064044]  ret_from_fork+0x10/0x20
[  204.067728] task:irq/17-smp2p-cd state:S stack:0     pid:104   tgid:104   ppid:2      task_flags:0x4208040 flags:0x00000010
[  204.079147] Call trace:
[  204.081664]  __switch_to+0xec/0x1c0 (T)
[  204.085614]  __schedule+0x368/0xce0
[  204.089208]  schedule+0x34/0x118
[  204.092537]  irq_thread+0x13c/0x32c
[  204.096131]  kthread+0x12c/0x204
[  204.099450]  ret_from_fork+0x10/0x20
[  204.103134] task:irq/18-smp2p-mo state:S stack:0     pid:105   tgid:105   ppid:2      task_flags:0x4208040 flags:0x00000010
[  204.114553] Call trace:
[  204.117070]  __switch_to+0xec/0x1c0 (T)
[  204.121020]  __schedule+0x368/0xce0
[  204.124614]  schedule+0x34/0x118
[  204.127943]  irq_thread+0x13c/0x32c
[  204.131537]  kthread+0x12c/0x204
[  204.134867]  ret_from_fork+0x10/0x20
[  204.138552] task:kworker/3:1     state:I stack:0     pid:106   tgid:106   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.149972] Workqueue:  0x0 (mm_percpu_wq)
[  204.154187] Call trace:
[  204.156704]  __switch_to+0xec/0x1c0 (T)
[  204.160653]  __schedule+0x368/0xce0
[  204.164247]  schedule+0x34/0x118
[  204.167576]  worker_thread+0x1e4/0x3e4
[  204.171435]  kthread+0x12c/0x204
[  204.174754]  ret_from_fork+0x10/0x20
[  204.178439] task:kworker/3:2     state:I stack:0     pid:107   tgid:107   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.189860] Workqueue:  0x0 (rcu_gp)
[  204.193543] Call trace:
[  204.196060]  __switch_to+0xec/0x1c0 (T)
[  204.200010]  __schedule+0x368/0xce0
[  204.203603]  schedule+0x34/0x118
[  204.206922]  worker_thread+0x1e4/0x3e4
[  204.210780]  kthread+0x12c/0x204
[  204.214110]  ret_from_fork+0x10/0x20
[  204.217795] task:kworker/4:1     state:I stack:0     pid:108   tgid:108   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.229215] Workqueue:  0x0 (rcu_gp)
[  204.232897] Call trace:
[  204.235414]  __switch_to+0xec/0x1c0 (T)
[  204.239364]  __schedule+0x368/0xce0
[  204.242958]  schedule+0x34/0x118
[  204.246276]  worker_thread+0x1e4/0x3e4
[  204.250135]  kthread+0x12c/0x204
[  204.253454]  ret_from_fork+0x10/0x20
[  204.257138] task:kworker/5:3     state:I stack:0     pid:109   tgid:109   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.268558] Workqueue:  0x0 (mm_percpu_wq)
[  204.272773] Call trace:
[  204.275290]  __switch_to+0xec/0x1c0 (T)
[  204.279239]  __schedule+0x368/0xce0
[  204.282833]  schedule+0x34/0x118
[  204.286162]  worker_thread+0x1e4/0x3e4
[  204.290021]  kthread+0x12c/0x204
[  204.293340]  ret_from_fork+0x10/0x20
[  204.297025] task:kworker/5:4     state:I stack:0     pid:110   tgid:110   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.308445] Workqueue:  0x0 (device_link_wq)
[  204.312837] Call trace:
[  204.315354]  __switch_to+0xec/0x1c0 (T)
[  204.319304]  __schedule+0x368/0xce0
[  204.322897]  schedule+0x34/0x118
[  204.326215]  worker_thread+0x1e4/0x3e4
[  204.330074]  kthread+0x12c/0x204
[  204.333404]  ret_from_fork+0x10/0x20
[  204.337089] task:kworker/5:5     state:I stack:0     pid:111   tgid:111   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.348509] Workqueue:  0x0 (cgroup_free)
[  204.352636] Call trace:
[  204.355153]  __switch_to+0xec/0x1c0 (T)
[  204.359102]  __schedule+0x368/0xce0
[  204.362696]  schedule+0x34/0x118
[  204.366025]  worker_thread+0x1e4/0x3e4
[  204.369884]  kthread+0x12c/0x204
[  204.373214]  ret_from_fork+0x10/0x20
[  204.376898] task:kworker/1:4     state:I stack:0     pid:112   tgid:112   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.388319] Call trace:
[  204.390836]  __switch_to+0xec/0x1c0 (T)
[  204.394786]  __schedule+0x368/0xce0
[  204.398380]  schedule+0x34/0x118
[  204.401709]  worker_thread+0x1e4/0x3e4
[  204.405568]  kthread+0x12c/0x204
[  204.408898]  ret_from_fork+0x10/0x20
[  204.412582] task:kworker/1:5     state:I stack:0     pid:113   tgid:113   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.424002] Workqueue:  0x0 (rcu_gp)
[  204.427685] Call trace:
[  204.430202]  __switch_to+0xec/0x1c0 (T)
[  204.434152]  __schedule+0x368/0xce0
[  204.437745]  schedule+0x34/0x118
[  204.441063]  worker_thread+0x1e4/0x3e4
[  204.444922]  kthread+0x12c/0x204
[  204.448252]  ret_from_fork+0x10/0x20
[  204.451937] task:kworker/4:2     state:I stack:0     pid:114   tgid:114   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.463358] Workqueue:  0x0 (rcu_gp)
[  204.467041] Call trace:
[  204.469558]  __switch_to+0xec/0x1c0 (T)
[  204.473508]  __schedule+0x368/0xce0
[  204.477101]  schedule+0x34/0x118
[  204.480430]  worker_thread+0x1e4/0x3e4
[  204.484289]  kthread+0x12c/0x204
[  204.487619]  ret_from_fork+0x10/0x20
[  204.491303] task:kworker/2:1H    state:I stack:0     pid:115   tgid:115   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.502723] Workqueue:  0x0 (events_highpri)
[  204.507115] Call trace:
[  204.509632]  __switch_to+0xec/0x1c0 (T)
[  204.513582]  __schedule+0x368/0xce0
[  204.517175]  schedule+0x34/0x118
[  204.520494]  worker_thread+0x1e4/0x3e4
[  204.524353]  kthread+0x12c/0x204
[  204.527672]  ret_from_fork+0x10/0x20
[  204.531356] task:kworker/R-mld   state:I stack:0     pid:116   tgid:116   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.542778] Call trace:
[  204.545295]  __switch_to+0xec/0x1c0 (T)
[  204.549244]  __schedule+0x368/0xce0
[  204.552838]  schedule+0x34/0x118
[  204.556167]  rescuer_thread+0x3a4/0x4a4
[  204.560116]  kthread+0x12c/0x204
[  204.563446]  ret_from_fork+0x10/0x20
[  204.567130] task:kworker/R-ipv6_ state:I stack:0     pid:117   tgid:117   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.578550] Call trace:
[  204.581067]  __switch_to+0xec/0x1c0 (T)
[  204.585017]  __schedule+0x368/0xce0
[  204.588611]  schedule+0x34/0x118
[  204.591940]  rescuer_thread+0x3a4/0x4a4
[  204.595889]  kthread+0x12c/0x204
[  204.599219]  ret_from_fork+0x10/0x20
[  204.602904] task:kworker/u32:1   state:I stack:0     pid:118   tgid:118   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.614324] Workqueue:  0x0 (qmi_msg_handler)
[  204.618804] Call trace:
[  204.621321]  __switch_to+0xec/0x1c0 (T)
[  204.625271]  __schedule+0x368/0xce0
[  204.628865]  schedule+0x34/0x118
[  204.632194]  worker_thread+0x1e4/0x3e4
[  204.636053]  kthread+0x12c/0x204
[  204.639372]  ret_from_fork+0x10/0x20
[  204.643057] task:kworker/5:1H    state:I stack:0     pid:129   tgid:129   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.654476] Workqueue:  0x0 (kblockd)
[  204.658247] Call trace:
[  204.660764]  __switch_to+0xec/0x1c0 (T)
[  204.664714]  __schedule+0x368/0xce0
[  204.668308]  schedule+0x34/0x118
[  204.671637]  worker_thread+0x1e4/0x3e4
[  204.675495]  kthread+0x12c/0x204
[  204.678825]  ret_from_fork+0x10/0x20
[  204.682510] task:kworker/2:2     state:I stack:0     pid:138   tgid:138   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.693930] Workqueue:  0x0 (mm_percpu_wq)
[  204.698145] Call trace:
[  204.700662]  __switch_to+0xec/0x1c0 (T)
[  204.704612]  __schedule+0x368/0xce0
[  204.708205]  schedule+0x34/0x118
[  204.711534]  worker_thread+0x1e4/0x3e4
[  204.715393]  kthread+0x12c/0x204
[  204.718712]  ret_from_fork+0x10/0x20
[  204.722397] task:kworker/3:1H    state:I stack:0     pid:140   tgid:140   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.733818] Workqueue:  0x0 (events_highpri)
[  204.738210] Call trace:
[  204.740727]  __switch_to+0xec/0x1c0 (T)
[  204.744677]  __schedule+0x368/0xce0
[  204.748271]  schedule+0x34/0x118
[  204.751600]  worker_thread+0x1e4/0x3e4
[  204.755459]  kthread+0x12c/0x204
[  204.758778]  ret_from_fork+0x10/0x20
[  204.762463] task:systemd-journal state:S stack:0     pid:141   tgid:141   ppid:1      task_flags:0x400100 flags:0x00000800
[  204.773792] Call trace:
[  204.776309]  __switch_to+0xec/0x1c0 (T)
[  204.780259]  __schedule+0x368/0xce0
[  204.783853]  schedule+0x34/0x118
[  204.787182]  schedule_hrtimeout_range+0xf0/0x100
[  204.791931]  do_epoll_wait+0x47c/0x4dc
[  204.795789]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  204.800800]  __arm64_sys_epoll_pwait+0x78/0x120
[  204.805459]  invoke_syscall+0x48/0x104
[  204.809318]  el0_svc_common.constprop.0+0xc0/0xe0
[  204.814153]  do_el0_svc+0x1c/0x28
[  204.817569]  el0_svc+0x34/0x108
[  204.820810]  el0t_64_sync_handler+0xa0/0xf0
[  204.825114]  el0t_64_sync+0x198/0x19c
[  204.828886] task:kworker/4:1H    state:I stack:0     pid:142   tgid:142   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.840306] Workqueue:  0x0 (events_highpri)
[  204.844698] Call trace:
[  204.847215]  __switch_to+0xec/0x1c0 (T)
[  204.851165]  __schedule+0x368/0xce0
[  204.854758]  schedule+0x34/0x118
[  204.858087]  worker_thread+0x1e4/0x3e4
[  204.861946]  kthread+0x12c/0x204
[  204.865265]  ret_from_fork+0x10/0x20
[  204.868950] task:kworker/2:3     state:I stack:0     pid:157   tgid:157   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.880370] Workqueue:  0x0 (device_link_wq)
[  204.884762] Call trace:
[  204.887279]  __switch_to+0xec/0x1c0 (T)
[  204.891229]  __schedule+0x368/0xce0
[  204.894822]  schedule+0x34/0x118
[  204.898140]  worker_thread+0x1e4/0x3e4
[  204.902000]  kthread+0x12c/0x204
[  204.905319]  ret_from_fork+0x10/0x20
[  204.909003] task:kworker/2:4     state:I stack:0     pid:158   tgid:158   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.920423] Workqueue:  0x0 (cgroup_release)
[  204.924815] Call trace:
[  204.927331]  __switch_to+0xec/0x1c0 (T)
[  204.931281]  __schedule+0x368/0xce0
[  204.934875]  schedule+0x34/0x118
[  204.938204]  worker_thread+0x1e4/0x3e4
[  204.942063]  kthread+0x12c/0x204
[  204.945392]  ret_from_fork+0x10/0x20
[  204.949077] task:kworker/2:5     state:I stack:0     pid:159   tgid:159   ppid:2      task_flags:0x4208060 flags:0x00000010
[  204.960497] Workqueue:  0x0 (rcu_gp)
[  204.964180] Call trace:
[  204.966697]  __switch_to+0xec/0x1c0 (T)
[  204.970647]  __schedule+0x368/0xce0
[  204.974241]  schedule+0x34/0x118
[  204.977570]  worker_thread+0x1e4/0x3e4
[  204.981428]  kthread+0x12c/0x204
[  204.984747]  ret_from_fork+0x10/0x20
[  204.988433] task:systemd-udevd   state:S stack:0     pid:167   tgid:167   ppid:1      task_flags:0x400100 flags:0x00000800
[  204.999762] Call trace:
[  205.002279]  __switch_to+0xec/0x1c0 (T)
[  205.006229]  __schedule+0x368/0xce0
[  205.009823]  schedule+0x34/0x118
[  205.013141]  schedule_hrtimeout_range+0xf0/0x100
[  205.017889]  do_epoll_wait+0x47c/0x4dc
[  205.021748]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  205.026759]  __arm64_sys_epoll_pwait+0x78/0x120
[  205.031417]  invoke_syscall+0x48/0x104
[  205.035276]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.040111]  do_el0_svc+0x1c/0x28
[  205.043527]  el0_svc+0x34/0x108
[  205.046767]  el0t_64_sync_handler+0xa0/0xf0
[  205.051071]  el0t_64_sync+0x198/0x19c
[  205.054844] task:systemd-udevd   state:D stack:0     pid:172   tgid:172   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.066174] Call trace:
[  205.068691]  __switch_to+0xec/0x1c0 (T)
[  205.072640]  __schedule+0x368/0xce0
[  205.076234]  schedule+0x34/0x118
[  205.079563]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.085464]  async_synchronize_full+0x78/0xa0
[  205.089945]  do_init_module+0x190/0x23c
[  205.093895]  load_module+0x1754/0x1ce0
[  205.097755]  init_module_from_file+0xdc/0x100
[  205.102236]  __arm64_sys_finit_module+0x1bc/0x330
[  205.107072]  invoke_syscall+0x48/0x104
[  205.110931]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.115766]  do_el0_svc+0x1c/0x28
[  205.119182]  el0_svc+0x34/0x108
[  205.122422]  el0t_64_sync_handler+0xa0/0xf0
[  205.126726]  el0t_64_sync+0x198/0x19c
[  205.130498] task:systemd-udevd   state:D stack:0     pid:174   tgid:174   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.141827] Call trace:
[  205.144345]  __switch_to+0xec/0x1c0 (T)
[  205.148294]  __schedule+0x368/0xce0
[  205.151888]  schedule+0x34/0x118
[  205.155206]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.161107]  async_synchronize_full+0x78/0xa0
[  205.165588]  do_init_module+0x190/0x23c
[  205.169537]  load_module+0x1754/0x1ce0
[  205.173397]  init_module_from_file+0xdc/0x100
[  205.177878]  __arm64_sys_finit_module+0x1bc/0x330
[  205.182713]  invoke_syscall+0x48/0x104
[  205.186572]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.191407]  do_el0_svc+0x1c/0x28
[  205.194823]  el0_svc+0x34/0x108
[  205.198063]  el0t_64_sync_handler+0xa0/0xf0
[  205.202367]  el0t_64_sync+0x198/0x19c
[  205.206139] task:systemd-udevd   state:D stack:0     pid:175   tgid:175   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.217468] Call trace:
[  205.219986]  __switch_to+0xec/0x1c0 (T)
[  205.223936]  __schedule+0x368/0xce0
[  205.227530]  schedule+0x34/0x118
[  205.230847]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.236749]  async_synchronize_full+0x78/0xa0
[  205.241230]  do_init_module+0x190/0x23c
[  205.245179]  load_module+0x1754/0x1ce0
[  205.249039]  init_module_from_file+0xdc/0x100
[  205.253520]  __arm64_sys_finit_module+0x1bc/0x330
[  205.258355]  invoke_syscall+0x48/0x104
[  205.262214]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.267049]  do_el0_svc+0x1c/0x28
[  205.270466]  el0_svc+0x34/0x108
[  205.273705]  el0t_64_sync_handler+0xa0/0xf0
[  205.278009]  el0t_64_sync+0x198/0x19c
[  205.281782] task:systemd-udevd   state:D stack:0     pid:178   tgid:178   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.293112] Call trace:
[  205.295629]  __switch_to+0xec/0x1c0 (T)
[  205.299579]  __schedule+0x368/0xce0
[  205.303172]  schedule+0x34/0x118
[  205.306501]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.312402]  async_synchronize_full+0x78/0xa0
[  205.316883]  do_init_module+0x190/0x23c
[  205.320831]  load_module+0x1754/0x1ce0
[  205.324691]  init_module_from_file+0xdc/0x100
[  205.329172]  __arm64_sys_finit_module+0x1bc/0x330
[  205.334008]  invoke_syscall+0x48/0x104
[  205.337867]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.342701]  do_el0_svc+0x1c/0x28
[  205.346118]  el0_svc+0x34/0x108
[  205.349358]  el0t_64_sync_handler+0xa0/0xf0
[  205.353662]  el0t_64_sync+0x198/0x19c
[  205.357433] task:systemd-udevd   state:D stack:0     pid:179   tgid:179   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.368763] Call trace:
[  205.371280]  __switch_to+0xec/0x1c0 (T)
[  205.375230]  __schedule+0x368/0xce0
[  205.378824]  schedule+0x34/0x118
[  205.382142]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.388043]  async_synchronize_full+0x78/0xa0
[  205.392524]  do_init_module+0x190/0x23c
[  205.396473]  load_module+0x1754/0x1ce0
[  205.400333]  init_module_from_file+0xdc/0x100
[  205.404814]  __arm64_sys_finit_module+0x1bc/0x330
[  205.409650]  invoke_syscall+0x48/0x104
[  205.413508]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.418343]  do_el0_svc+0x1c/0x28
[  205.421760]  el0_svc+0x34/0x108
[  205.424999]  el0t_64_sync_handler+0xa0/0xf0
[  205.429303]  el0t_64_sync+0x198/0x19c
[  205.433075] task:systemd-udevd   state:D stack:0     pid:183   tgid:183   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.444405] Call trace:
[  205.446921]  __switch_to+0xec/0x1c0 (T)
[  205.450871]  __schedule+0x368/0xce0
[  205.454465]  schedule+0x34/0x118
[  205.457794]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.463695]  async_synchronize_full+0x78/0xa0
[  205.468176]  do_init_module+0x190/0x23c
[  205.472125]  load_module+0x1754/0x1ce0
[  205.475985]  init_module_from_file+0xdc/0x100
[  205.480465]  __arm64_sys_finit_module+0x1bc/0x330
[  205.485301]  invoke_syscall+0x48/0x104
[  205.489160]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.493994]  do_el0_svc+0x1c/0x28
[  205.497411]  el0_svc+0x34/0x108
[  205.500650]  el0t_64_sync_handler+0xa0/0xf0
[  205.504954]  el0t_64_sync+0x198/0x19c
[  205.508727] task:systemd-udevd   state:D stack:0     pid:186   tgid:186   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.520056] Call trace:
[  205.522573]  __switch_to+0xec/0x1c0 (T)
[  205.526524]  __schedule+0x368/0xce0
[  205.530117]  schedule+0x34/0x118
[  205.533446]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.539348]  async_synchronize_full+0x78/0xa0
[  205.543828]  do_init_module+0x190/0x23c
[  205.547778]  load_module+0x1754/0x1ce0
[  205.551638]  init_module_from_file+0xdc/0x100
[  205.556118]  __arm64_sys_finit_module+0x1bc/0x330
[  205.560954]  invoke_syscall+0x48/0x104
[  205.564813]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.569648]  do_el0_svc+0x1c/0x28
[  205.573064]  el0_svc+0x34/0x108
[  205.576304]  el0t_64_sync_handler+0xa0/0xf0
[  205.580608]  el0t_64_sync+0x198/0x19c
[  205.584381] task:systemd-udevd   state:D stack:0     pid:187   tgid:187   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.595710] Call trace:
[  205.598227]  __switch_to+0xec/0x1c0 (T)
[  205.602177]  __schedule+0x368/0xce0
[  205.605771]  schedule+0x34/0x118
[  205.609089]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.614990]  async_synchronize_full+0x78/0xa0
[  205.619471]  do_init_module+0x190/0x23c
[  205.623420]  load_module+0x1754/0x1ce0
[  205.627280]  init_module_from_file+0xdc/0x100
[  205.631760]  __arm64_sys_finit_module+0x1bc/0x330
[  205.636596]  invoke_syscall+0x48/0x104
[  205.640455]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.645290]  do_el0_svc+0x1c/0x28
[  205.648706]  el0_svc+0x34/0x108
[  205.651945]  el0t_64_sync_handler+0xa0/0xf0
[  205.656250]  el0t_64_sync+0x198/0x19c
[  205.660022] task:kworker/6:1H    state:I stack:0     pid:188   tgid:188   ppid:2      task_flags:0x4208060 flags:0x00000010
[  205.671442] Workqueue:  0x0 (events_highpri)
[  205.675834] Call trace:
[  205.678351]  __switch_to+0xec/0x1c0 (T)
[  205.682301]  __schedule+0x368/0xce0
[  205.685895]  schedule+0x34/0x118
[  205.689224]  worker_thread+0x1e4/0x3e4
[  205.693083]  kthread+0x12c/0x204
[  205.696413]  ret_from_fork+0x10/0x20
[  205.700097] task:kworker/7:1H    state:I stack:0     pid:189   tgid:189   ppid:2      task_flags:0x4208060 flags:0x00000010
[  205.711518] Workqueue:  0x0 (events_highpri)
[  205.715909] Call trace:
[  205.718426]  __switch_to+0xec/0x1c0 (T)
[  205.722376]  __schedule+0x368/0xce0
[  205.725970]  schedule+0x34/0x118
[  205.729298]  worker_thread+0x1e4/0x3e4
[  205.733157]  kthread+0x12c/0x204
[  205.736476]  ret_from_fork+0x10/0x20
[  205.740161] task:systemd-udevd   state:D stack:0     pid:193   tgid:193   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.751490] Call trace:
[  205.754007]  __switch_to+0xec/0x1c0 (T)
[  205.757957]  __schedule+0x368/0xce0
[  205.761551]  schedule+0x34/0x118
[  205.764869]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.770770]  async_synchronize_full+0x78/0xa0
[  205.775246]  do_init_module+0x190/0x23c
[  205.779195]  load_module+0x1754/0x1ce0
[  205.783055]  init_module_from_file+0xdc/0x100
[  205.787536]  __arm64_sys_finit_module+0x1bc/0x330
[  205.792372]  invoke_syscall+0x48/0x104
[  205.796230]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.801065]  do_el0_svc+0x1c/0x28
[  205.804482]  el0_svc+0x34/0x108
[  205.807721]  el0t_64_sync_handler+0xa0/0xf0
[  205.812025]  el0t_64_sync+0x198/0x19c
[  205.815798] task:systemd-udevd   state:D stack:0     pid:195   tgid:195   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.827127] Call trace:
[  205.829644]  __switch_to+0xec/0x1c0 (T)
[  205.833593]  __schedule+0x368/0xce0
[  205.837187]  schedule+0x34/0x118
[  205.840505]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.846406]  async_synchronize_full+0x78/0xa0
[  205.850887]  do_init_module+0x190/0x23c
[  205.854836]  load_module+0x1754/0x1ce0
[  205.858695]  init_module_from_file+0xdc/0x100
[  205.863176]  __arm64_sys_finit_module+0x1bc/0x330
[  205.868012]  invoke_syscall+0x48/0x104
[  205.871871]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.876706]  do_el0_svc+0x1c/0x28
[  205.880122]  el0_svc+0x34/0x108
[  205.883362]  el0t_64_sync_handler+0xa0/0xf0
[  205.887665]  el0t_64_sync+0x198/0x19c
[  205.891438] task:systemd-udevd   state:D stack:0     pid:199   tgid:199   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.902767] Call trace:
[  205.905284]  __switch_to+0xec/0x1c0 (T)
[  205.909234]  __schedule+0x368/0xce0
[  205.912828]  schedule+0x34/0x118
[  205.916146]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.922047]  async_synchronize_full+0x78/0xa0
[  205.926528]  do_init_module+0x190/0x23c
[  205.930477]  load_module+0x1754/0x1ce0
[  205.934337]  init_module_from_file+0xdc/0x100
[  205.938818]  __arm64_sys_finit_module+0x1bc/0x330
[  205.943654]  invoke_syscall+0x48/0x104
[  205.947513]  el0_svc_common.constprop.0+0xc0/0xe0
[  205.952347]  do_el0_svc+0x1c/0x28
[  205.955764]  el0_svc+0x34/0x108
[  205.959003]  el0t_64_sync_handler+0xa0/0xf0
[  205.963308]  el0t_64_sync+0x198/0x19c
[  205.967080] task:systemd-udevd   state:D stack:0     pid:200   tgid:200   ppid:167    task_flags:0x400140 flags:0x00000819
[  205.978409] Call trace:
[  205.980926]  __switch_to+0xec/0x1c0 (T)
[  205.984876]  __schedule+0x368/0xce0
[  205.988470]  schedule+0x34/0x118
[  205.991799]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  205.997700]  async_synchronize_full+0x78/0xa0
[  206.002181]  do_init_module+0x190/0x23c
[  206.006130]  load_module+0x1754/0x1ce0
[  206.009989]  init_module_from_file+0xdc/0x100
[  206.014470]  __arm64_sys_finit_module+0x1bc/0x330
[  206.019306]  invoke_syscall+0x48/0x104
[  206.023165]  el0_svc_common.constprop.0+0xc0/0xe0
[  206.028000]  do_el0_svc+0x1c/0x28
[  206.031416]  el0_svc+0x34/0x108
[  206.034656]  el0t_64_sync_handler+0xa0/0xf0
[  206.038960]  el0t_64_sync+0x198/0x19c
[  206.042732] task:systemd-udevd   state:D stack:0     pid:201   tgid:201   ppid:167    task_flags:0x400140 flags:0x00000819
[  206.054061] Call trace:
[  206.056578]  __switch_to+0xec/0x1c0 (T)
[  206.060528]  __schedule+0x368/0xce0
[  206.064122]  schedule+0x34/0x118
[  206.067441]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  206.073342]  async_synchronize_full+0x78/0xa0
[  206.077822]  do_init_module+0x190/0x23c
[  206.081772]  load_module+0x1754/0x1ce0
[  206.085631]  init_module_from_file+0xdc/0x100
[  206.090112]  __arm64_sys_finit_module+0x1bc/0x330
[  206.094947]  invoke_syscall+0x48/0x104
[  206.098806]  el0_svc_common.constprop.0+0xc0/0xe0
[  206.103641]  do_el0_svc+0x1c/0x28
[  206.107058]  el0_svc+0x34/0x108
[  206.110298]  el0t_64_sync_handler+0xa0/0xf0
[  206.114602]  el0t_64_sync+0x198/0x19c
[  206.118374] task:systemd-udevd   state:D stack:0     pid:202   tgid:202   ppid:167    task_flags:0x400140 flags:0x00000819
[  206.129703] Call trace:
[  206.132219]  __switch_to+0xec/0x1c0 (T)
[  206.136169]  __schedule+0x368/0xce0
[  206.139763]  schedule+0x34/0x118
[  206.143081]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  206.148981]  async_synchronize_full+0x78/0xa0
[  206.153462]  do_init_module+0x190/0x23c
[  206.157411]  load_module+0x1754/0x1ce0
[  206.161271]  init_module_from_file+0xdc/0x100
[  206.165752]  __arm64_sys_finit_module+0x1bc/0x330
[  206.170588]  invoke_syscall+0x48/0x104
[  206.174447]  el0_svc_common.constprop.0+0xc0/0xe0
[  206.179282]  do_el0_svc+0x1c/0x28
[  206.182698]  el0_svc+0x34/0x108
[  206.185938]  el0t_64_sync_handler+0xa0/0xf0
[  206.190243]  el0t_64_sync+0x198/0x19c
[  206.194015] task:systemd-udevd   state:D stack:0     pid:203   tgid:203   ppid:167    task_flags:0x400140 flags:0x00000819
[  206.205344] Call trace:
[  206.207862]  __switch_to+0xec/0x1c0 (T)
[  206.211811]  __schedule+0x368/0xce0
[  206.215405]  schedule+0x34/0x118
[  206.218723]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  206.224624]  async_synchronize_full+0x78/0xa0
[  206.229105]  do_init_module+0x190/0x23c
[  206.233054]  load_module+0x1754/0x1ce0
[  206.236913]  init_module_from_file+0xdc/0x100
[  206.241394]  __arm64_sys_finit_module+0x1bc/0x330
[  206.246230]  invoke_syscall+0x48/0x104
[  206.250088]  el0_svc_common.constprop.0+0xc0/0xe0
[  206.254923]  do_el0_svc+0x1c/0x28
[  206.258340]  el0_svc+0x34/0x108
[  206.261579]  el0t_64_sync_handler+0xa0/0xf0
[  206.265884]  el0t_64_sync+0x198/0x19c
[  206.269656] task:kworker/u34:1   state:D stack:0     pid:205   tgid:205   ppid:2      task_flags:0x4288060 flags:0x00000010
[  206.281076] Workqueue: pm pm_runtime_work
[  206.285203] Call trace:
[  206.287720]  __switch_to+0xec/0x1c0 (T)
[  206.291670]  __schedule+0x368/0xce0
[  206.295264]  schedule+0x34/0x118
[  206.298582]  schedule_timeout+0xd4/0x110
[  206.302620]  io_schedule_timeout+0x48/0x68
[  206.306836]  wait_for_completion_io+0x78/0x140
[  206.311406]  blk_execute_rq+0xbc/0x13c
[  206.315266]  scsi_execute_cmd+0x130/0x3f4
[  206.319393]  sd_sync_cache+0xe4/0x220
[  206.323165]  sd_suspend_common.isra.0+0x60/0x160
[  206.327913]  sd_suspend_runtime+0x18/0x38
[  206.332040]  scsi_runtime_suspend+0x6c/0xc0
[  206.336343]  __rpm_callback+0x48/0x1e0
[  206.340202]  rpm_callback+0x38/0x80
[  206.343795]  rpm_suspend+0x10c/0x580
[  206.347478]  pm_runtime_work+0xc8/0xcc
[  206.351337]  process_one_work+0x148/0x290
[  206.355463]  worker_thread+0x2c8/0x3e4
[  206.359321]  kthread+0x12c/0x204
[  206.362651]  ret_from_fork+0x10/0x20
[  206.366335] task:kworker/u34:2   state:D stack:0     pid:206   tgid:206   ppid:2      task_flags:0x4208060 flags:0x00000010
[  206.377755] Workqueue: async async_run_entry_fn
[  206.382414] Call trace:
[  206.384931]  __switch_to+0xec/0x1c0 (T)
[  206.388881]  __schedule+0x368/0xce0
[  206.392475]  schedule+0x34/0x118
[  206.395804]  schedule_timeout+0xd4/0x110
[  206.399843]  io_schedule_timeout+0x48/0x68
[  206.404057]  wait_for_completion_io+0x78/0x140
[  206.408627]  blk_execute_rq+0xbc/0x13c
[  206.412488]  scsi_execute_cmd+0x130/0x3f4
[  206.416615]  scsi_mode_sense+0x15c/0x330
[  206.420654]  sd_revalidate_disk+0xb80/0x2238
[  206.425047]  sd_probe+0x298/0x430
[  206.428464]  really_probe+0xbc/0x2c0
[  206.432148]  __driver_probe_device+0x78/0x120
[  206.436628]  driver_probe_device+0x3c/0x154
[  206.440931]  __device_attach_driver+0xb8/0x140
[  206.445500]  bus_for_each_drv+0x88/0xe8
[  206.449451]  __device_attach_async_helper+0xb4/0xd8
[  206.454463]  async_run_entry_fn+0x34/0xe0
[  206.458590]  process_one_work+0x148/0x290
[  206.462716]  worker_thread+0x2c8/0x3e4
[  206.466575]  kthread+0x12c/0x204
[  206.469905]  ret_from_fork+0x10/0x20
[  206.473589] task:irq/141-240b340 state:S stack:0     pid:207   tgid:207   ppid:2      task_flags:0x4208040 flags:0x00000010
[  206.485008] Call trace:
[  206.487525]  __switch_to+0xec/0x1c0 (T)
[  206.491475]  __schedule+0x368/0xce0
[  206.495069]  schedule+0x34/0x118
[  206.498387]  irq_thread+0x13c/0x32c
[  206.501981]  kthread+0x12c/0x204
[  206.505311]  ret_from_fork+0x10/0x20
[  206.508996] task:irq/141-240b740 state:S stack:0     pid:208   tgid:208   ppid:2      task_flags:0x4208040 flags:0x00000010
[  206.520416] Call trace:
[  206.522933]  __switch_to+0xec/0x1c0 (T)
[  206.526883]  __schedule+0x368/0xce0
[  206.530476]  schedule+0x34/0x118
[  206.533805]  irq_thread+0x13c/0x32c
[  206.537399]  kthread+0x12c/0x204
[  206.540718]  ret_from_fork+0x10/0x20
[  206.544403] task:kworker/7:2     state:I stack:0     pid:211   tgid:211   ppid:2      task_flags:0x4208060 flags:0x00000010
[  206.555823] Workqueue:  0x0 (rcu_gp)
[  206.559506] Call trace:
[  206.562023]  __switch_to+0xec/0x1c0 (T)
[  206.565973]  __schedule+0x368/0xce0
[  206.569567]  schedule+0x34/0x118
[  206.572895]  worker_thread+0x1e4/0x3e4
[  206.576754]  kthread+0x12c/0x204
[  206.580084]  ret_from_fork+0x10/0x20
[  206.583769] task:kworker/u34:3   state:I stack:0     pid:212   tgid:212   ppid:2      task_flags:0x4208060 flags:0x00000010
[  206.595188] Workqueue:  0x0 (pm)
[  206.598517] Call trace:
[  206.601034]  __switch_to+0xec/0x1c0 (T)
[  206.604984]  __schedule+0x368/0xce0
[  206.608578]  schedule+0x34/0x118
[  206.611907]  worker_thread+0x1e4/0x3e4
[  206.615765]  kthread+0x12c/0x204
[  206.619096]  ret_from_fork+0x10/0x20
[  206.622780] task:irq/145-pmic_pw state:S stack:0     pid:213   tgid:213   ppid:2      task_flags:0x4208040 flags:0x00000010
[  206.634200] Call trace:
[  206.636717]  __switch_to+0xec/0x1c0 (T)
[  206.640667]  __schedule+0x368/0xce0
[  206.644260]  schedule+0x34/0x118
[  206.647589]  irq_thread+0x13c/0x32c
[  206.651183]  kthread+0x12c/0x204
[  206.654502]  ret_from_fork+0x10/0x20
[  206.658186] task:kworker/3:3     state:I stack:0     pid:214   tgid:214   ppid:2      task_flags:0x4208060 flags:0x00000010
[  206.669606] Call trace:
[  206.672123]  __switch_to+0xec/0x1c0 (T)
[  206.676073]  __schedule+0x368/0xce0
[  206.679667]  schedule+0x34/0x118
[  206.682985]  worker_thread+0x1e4/0x3e4
[  206.686844]  kthread+0x12c/0x204
[  206.690174]  ret_from_fork+0x10/0x20
[  206.693858] task:irq/146-temp-al state:S stack:0     pid:215   tgid:215   ppid:2      task_flags:0x4208040 flags:0x00000010
[  206.705277] Call trace:
[  206.707794]  __switch_to+0xec/0x1c0 (T)
[  206.711744]  __schedule+0x368/0xce0
[  206.715338]  schedule+0x34/0x118
[  206.718656]  irq_thread+0x13c/0x32c
[  206.722250]  kthread+0x12c/0x204
[  206.725569]  ret_from_fork+0x10/0x20
[  206.729253] task:kworker/R-pdr_n state:I stack:0     pid:216   tgid:216   ppid:2      task_flags:0x4208060 flags:0x00000010
[  206.740674] Call trace:
[  206.743192]  __switch_to+0xec/0x1c0 (T)
[  206.747141]  __schedule+0x368/0xce0
[  206.750735]  schedule+0x34/0x118
[  206.754064]  rescuer_thread+0x3a4/0x4a4
[  206.758012]  kthread+0x12c/0x204
[  206.761332]  ret_from_fork+0x10/0x20
[  206.765017] task:irq/148-pmic_re state:S stack:0     pid:217   tgid:217   ppid:2      task_flags:0x4208040 flags:0x00000010
[  206.776435] Call trace:
[  206.778952]  __switch_to+0xec/0x1c0 (T)
[  206.782902]  __schedule+0x368/0xce0
[  206.786495]  schedule+0x34/0x118
[  206.789824]  irq_thread+0x13c/0x32c
[  206.793419]  kthread+0x12c/0x204
[  206.796748]  ret_from_fork+0x10/0x20
[  206.800433] task:irq/149-temp-al state:S stack:0     pid:218   tgid:218   ppid:2      task_flags:0x4208040 flags:0x00000010
[  206.811852] Call trace:
[  206.814369]  __switch_to+0xec/0x1c0 (T)
[  206.818319]  __schedule+0x368/0xce0
[  206.821913]  schedule+0x34/0x118
[  206.825231]  irq_thread+0x13c/0x32c
[  206.828825]  kthread+0x12c/0x204
[  206.832145]  ret_from_fork+0x10/0x20
[  206.835829] task:irq/150-temp-al state:S stack:0     pid:219   tgid:219   ppid:2      task_flags:0x4208040 flags:0x00000010
[  206.847249] Call trace:
[  206.849766]  __switch_to+0xec/0x1c0 (T)
[  206.853716]  __schedule+0x368/0xce0
[  206.857309]  schedule+0x34/0x118
[  206.860639]  irq_thread+0x13c/0x32c
[  206.864233]  kthread+0x12c/0x204
[  206.867552]  ret_from_fork+0x10/0x20
[  206.871237] task:irq/151-temp-al state:S stack:0     pid:220   tgid:220   ppid:2      task_flags:0x4208040 flags:0x00000010
[  206.882656] Call trace:
[  206.885173]  __switch_to+0xec/0x1c0 (T)
[  206.889123]  __schedule+0x368/0xce0
[  206.892716]  schedule+0x34/0x118
[  206.896035]  irq_thread+0x13c/0x32c
[  206.899629]  kthread+0x12c/0x204
[  206.902948]  ret_from_fork+0x10/0x20
[  206.906632] task:irq/152-temp-al state:S stack:0     pid:221   tgid:221   ppid:2      task_flags:0x4208040 flags:0x00000010
[  206.918052] Call trace:
[  206.920569]  __switch_to+0xec/0x1c0 (T)
[  206.924519]  __schedule+0x368/0xce0
[  206.928112]  schedule+0x34/0x118
[  206.931442]  irq_thread+0x13c/0x32c
[  206.935036]  kthread+0x12c/0x204
[  206.938366]  ret_from_fork+0x10/0x20
[  206.942050] task:modprobe        state:D stack:0     pid:222   tgid:222   ppid:81     task_flags:0x400100 flags:0x00000018
[  206.953380] Call trace:
[  206.955897]  __switch_to+0xec/0x1c0 (T)
[  206.959847]  __schedule+0x368/0xce0
[  206.963441]  schedule+0x34/0x118
[  206.966770]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  206.972670]  async_synchronize_full+0x78/0xa0
[  206.977151]  do_init_module+0x190/0x23c
[  206.981101]  load_module+0x1754/0x1ce0
[  206.984961]  init_module_from_file+0xdc/0x100
[  206.989442]  __arm64_sys_finit_module+0x1bc/0x330
[  206.994278]  invoke_syscall+0x48/0x104
[  206.998137]  el0_svc_common.constprop.0+0x40/0xe0
[  207.002972]  do_el0_svc+0x1c/0x28
[  207.006388]  el0_svc+0x34/0x108
[  207.009628]  el0t_64_sync_handler+0xa0/0xf0
[  207.013932]  el0t_64_sync+0x198/0x19c
[  207.017704] task:irq/153-temp-al state:S stack:0     pid:223   tgid:223   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.029123] Call trace:
[  207.031640]  __switch_to+0xec/0x1c0 (T)
[  207.035590]  __schedule+0x368/0xce0
[  207.039184]  schedule+0x34/0x118
[  207.042502]  irq_thread+0x13c/0x32c
[  207.046096]  kthread+0x12c/0x204
[  207.049426]  ret_from_fork+0x10/0x20
[  207.053110] task:irq/154-temp-al state:S stack:0     pid:224   tgid:224   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.064529] Call trace:
[  207.067046]  __switch_to+0xec/0x1c0 (T)
[  207.070996]  __schedule+0x368/0xce0
[  207.074590]  schedule+0x34/0x118
[  207.077919]  irq_thread+0x13c/0x32c
[  207.081513]  kthread+0x12c/0x204
[  207.084843]  ret_from_fork+0x10/0x20
[  207.088528] task:scsi_eh_0       state:S stack:0     pid:225   tgid:225   ppid:2      task_flags:0x208040 flags:0x00000010
[  207.099857] Call trace:
[  207.102375]  __switch_to+0xec/0x1c0 (T)
[  207.106324]  __schedule+0x368/0xce0
[  207.109918]  schedule+0x34/0x118
[  207.113247]  scsi_error_handler+0x1c4/0x344
[  207.117550]  kthread+0x12c/0x204
[  207.120880]  ret_from_fork+0x10/0x20
[  207.124564] task:irq/155-temp-al state:S stack:0     pid:226   tgid:226   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.135983] Call trace:
[  207.138500]  __switch_to+0xec/0x1c0 (T)
[  207.142450]  __schedule+0x368/0xce0
[  207.146044]  schedule+0x34/0x118
[  207.149373]  irq_thread+0x13c/0x32c
[  207.152967]  kthread+0x12c/0x204
[  207.156297]  ret_from_fork+0x10/0x20
[  207.159981] task:kworker/R-scsi_ state:I stack:0     pid:227   tgid:227   ppid:2      task_flags:0x4208060 flags:0x00000010
[  207.171401] Call trace:
[  207.173918]  __switch_to+0xec/0x1c0 (T)
[  207.177868]  __schedule+0x368/0xce0
[  207.181461]  schedule+0x34/0x118
[  207.184791]  rescuer_thread+0x3a4/0x4a4
[  207.188739]  kthread+0x12c/0x204
[  207.192070]  ret_from_fork+0x10/0x20
[  207.195754] task:irq/156-temp-al state:S stack:0     pid:228   tgid:228   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.207174] Call trace:
[  207.209691]  __switch_to+0xec/0x1c0 (T)
[  207.213640]  __schedule+0x368/0xce0
[  207.217234]  schedule+0x34/0x118
[  207.220563]  irq_thread+0x13c/0x32c
[  207.224157]  kthread+0x12c/0x204
[  207.227487]  ret_from_fork+0x10/0x20
[  207.231171] task:irq/157-temp-al state:S stack:0     pid:230   tgid:230   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.242590] Call trace:
[  207.245107]  __switch_to+0xec/0x1c0 (T)
[  207.249057]  __schedule+0x368/0xce0
[  207.252650]  schedule+0x34/0x118
[  207.255968]  irq_thread+0x13c/0x32c
[  207.259563]  kthread+0x12c/0x204
[  207.262893]  ret_from_fork+0x10/0x20
[  207.266577] task:irq/158-temp-al state:S stack:0     pid:231   tgid:231   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.277996] Call trace:
[  207.280514]  __switch_to+0xec/0x1c0 (T)
[  207.284464]  __schedule+0x368/0xce0
[  207.288057]  schedule+0x34/0x118
[  207.291386]  irq_thread+0x13c/0x32c
[  207.294980]  kthread+0x12c/0x204
[  207.298310]  ret_from_fork+0x10/0x20
[  207.301994] task:kworker/R-ufs_e state:I stack:0     pid:233   tgid:233   ppid:2      task_flags:0x4208060 flags:0x00000010
[  207.313415] Call trace:
[  207.315932]  __switch_to+0xec/0x1c0 (T)
[  207.319882]  __schedule+0x368/0xce0
[  207.323476]  schedule+0x34/0x118
[  207.326805]  rescuer_thread+0x3a4/0x4a4
[  207.330753]  kthread+0x12c/0x204
[  207.334084]  ret_from_fork+0x10/0x20
[  207.337768] task:kworker/R-ufs_c state:I stack:0     pid:234   tgid:234   ppid:2      task_flags:0x4208060 flags:0x00000010
[  207.349188] Call trace:
[  207.351705]  __switch_to+0xec/0x1c0 (T)
[  207.355655]  __schedule+0x368/0xce0
[  207.359249]  schedule+0x34/0x118
[  207.362578]  rescuer_thread+0x3a4/0x4a4
[  207.366527]  kthread+0x12c/0x204
[  207.369846]  ret_from_fork+0x10/0x20
[  207.373531] task:kworker/R-ufs_c state:I stack:0     pid:235   tgid:235   ppid:2      task_flags:0x4208060 flags:0x00000010
[  207.384951] Call trace:
[  207.387468]  __switch_to+0xec/0x1c0 (T)
[  207.391417]  __schedule+0x368/0xce0
[  207.395011]  schedule+0x34/0x118
[  207.398329]  rescuer_thread+0x3a4/0x4a4
[  207.402278]  kthread+0x12c/0x204
[  207.405598]  ret_from_fork+0x10/0x20
[  207.409282] task:irq/142-ufshcd  state:S stack:0     pid:236   tgid:236   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.420701] Call trace:
[  207.423218]  __switch_to+0xec/0x1c0 (T)
[  207.427168]  __schedule+0x368/0xce0
[  207.430761]  schedule+0x34/0x118
[  207.434080]  irq_thread+0x13c/0x32c
[  207.437674]  kthread+0x12c/0x204
[  207.441004]  ret_from_fork+0x10/0x20
[  207.444688] task:irq/159-dp_hs_p state:S stack:0     pid:237   tgid:237   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.456107] Call trace:
[  207.458624]  __switch_to+0xec/0x1c0 (T)
[  207.462574]  __schedule+0x368/0xce0
[  207.466167]  schedule+0x34/0x118
[  207.469497]  irq_thread+0x13c/0x32c
[  207.473091]  kthread+0x12c/0x204
[  207.476421]  ret_from_fork+0x10/0x20
[  207.480105] task:irq/160-dm_hs_p state:S stack:0     pid:238   tgid:238   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.491524] Call trace:
[  207.494041]  __switch_to+0xec/0x1c0 (T)
[  207.497991]  __schedule+0x368/0xce0
[  207.501585]  schedule+0x34/0x118
[  207.504914]  irq_thread+0x13c/0x32c
[  207.508508]  kthread+0x12c/0x204
[  207.511837]  ret_from_fork+0x10/0x20
[  207.515522] task:irq/161-ss_phy_ state:S stack:0     pid:239   tgid:239   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.526942] Call trace:
[  207.529458]  __switch_to+0xec/0x1c0 (T)
[  207.533408]  __schedule+0x368/0xce0
[  207.537001]  schedule+0x34/0x118
[  207.540330]  irq_thread+0x13c/0x32c
[  207.543924]  kthread+0x12c/0x204
[  207.547254]  ret_from_fork+0x10/0x20
[  207.550939] task:kworker/u33:8   state:D stack:0     pid:240   tgid:240   ppid:2      task_flags:0x4288060 flags:0x00000010
[  207.562359] Workqueue: pm pm_runtime_work
[  207.566486] Call trace:
[  207.569003]  __switch_to+0xec/0x1c0 (T)
[  207.572952]  __schedule+0x368/0xce0
[  207.576546]  schedule+0x34/0x118
[  207.579864]  schedule_timeout+0xd4/0x110
[  207.583903]  io_schedule_timeout+0x48/0x68
[  207.588117]  wait_for_completion_io+0x78/0x140
[  207.592687]  blk_execute_rq+0xbc/0x13c
[  207.596548]  scsi_execute_cmd+0x130/0x3f4
[  207.600675]  sd_sync_cache+0xe4/0x220
[  207.604447]  sd_suspend_common.isra.0+0x60/0x160
[  207.609195]  sd_suspend_runtime+0x18/0x38
[  207.613321]  scsi_runtime_suspend+0x6c/0xc0
[  207.617624]  __rpm_callback+0x48/0x1e0
[  207.621483]  rpm_callback+0x38/0x80
[  207.625076]  rpm_suspend+0x10c/0x580
[  207.628759]  pm_runtime_work+0xc8/0xcc
[  207.632618]  process_one_work+0x148/0x290
[  207.636744]  worker_thread+0x2c8/0x3e4
[  207.640603]  kthread+0x12c/0x204
[  207.643933]  ret_from_fork+0x10/0x20
[  207.647616] task:irq/163-aerdrv  state:S stack:0     pid:241   tgid:241   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.659035] Call trace:
[  207.661553]  __switch_to+0xec/0x1c0 (T)
[  207.665502]  __schedule+0x368/0xce0
[  207.669096]  schedule+0x34/0x118
[  207.672425]  irq_thread+0x13c/0x32c
[  207.676018]  kthread+0x12c/0x204
[  207.679348]  ret_from_fork+0x10/0x20
[  207.683033] task:kworker/6:2     state:I stack:0     pid:242   tgid:242   ppid:2      task_flags:0x4208060 flags:0x00000010
[  207.694454] Workqueue:  0x0 (events)
[  207.698137] Call trace:
[  207.700654]  __switch_to+0xec/0x1c0 (T)
[  207.704604]  __schedule+0x368/0xce0
[  207.708197]  schedule+0x34/0x118
[  207.711515]  worker_thread+0x1e4/0x3e4
[  207.715374]  kthread+0x12c/0x204
[  207.718704]  ret_from_fork+0x10/0x20
[  207.722388] task:irq/147-qcom_pc state:S stack:0     pid:243   tgid:243   ppid:2      task_flags:0x4208040 flags:0x00000010
[  207.733807] Call trace:
[  207.736324]  __switch_to+0xec/0x1c0 (T)
[  207.740274]  __schedule+0x368/0xce0
[  207.743868]  schedule+0x34/0x118
[  207.747196]  irq_thread+0x13c/0x32c
[  207.750791]  kthread+0x12c/0x204
[  207.754110]  ret_from_fork+0x10/0x20
[  207.757794] task:kworker/u34:4   state:I stack:0     pid:245   tgid:245   ppid:2      task_flags:0x4208060 flags:0x00000010
[  207.769214] Workqueue:  0x0 (pm)
[  207.772543] Call trace:
[  207.775060]  __switch_to+0xec/0x1c0 (T)
[  207.779010]  __schedule+0x368/0xce0
[  207.782603]  schedule+0x34/0x118
[  207.785933]  worker_thread+0x1e4/0x3e4
[  207.789792]  kthread+0x12c/0x204
[  207.793121]  ret_from_fork+0x10/0x20
[  207.796806] task:kworker/u34:5   state:I stack:0     pid:247   tgid:247   ppid:2      task_flags:0x4208060 flags:0x00000010
[  207.808226] Call trace:
[  207.810743]  __switch_to+0xec/0x1c0 (T)
[  207.814692]  __schedule+0x368/0xce0
[  207.818286]  schedule+0x34/0x118
[  207.821615]  worker_thread+0x1e4/0x3e4
[  207.825473]  kthread+0x12c/0x204
[  207.828803]  ret_from_fork+0x10/0x20
[  207.832488] task:kworker/u35:1   state:I stack:0     pid:248   tgid:248   ppid:2      task_flags:0x4208060 flags:0x00000010
[  207.843907] Call trace:
[  207.846424]  __switch_to+0xec/0x1c0 (T)
[  207.850374]  __schedule+0x368/0xce0
[  207.853967]  schedule+0x34/0x118
[  207.857297]  worker_thread+0x1e4/0x3e4
[  207.861155]  kthread+0x12c/0x204
[  207.864485]  ret_from_fork+0x10/0x20
[  207.868170] task:kworker/6:3     state:I stack:0     pid:282   tgid:282   ppid:2      task_flags:0x4208060 flags:0x00000010
[  207.879589] Workqueue:  0x0 (cgroup_offline)
[  207.883981] Call trace:
[  207.886498]  __switch_to+0xec/0x1c0 (T)
[  207.890448]  __schedule+0x368/0xce0
[  207.894042]  schedule+0x34/0x118
[  207.897361]  worker_thread+0x1e4/0x3e4
[  207.901219]  kthread+0x12c/0x204
[  207.904539]  ret_from_fork+0x10/0x20
[  207.908223] task:kworker/6:4     state:I stack:0     pid:283   tgid:283   ppid:2      task_flags:0x4208060 flags:0x00000010
[  207.919643] Workqueue:  0x0 (cgroup_free)
[  207.923769] Call trace:
[  207.926286]  __switch_to+0xec/0x1c0 (T)
[  207.930235]  __schedule+0x368/0xce0
[  207.933829]  schedule+0x34/0x118
[  207.937158]  worker_thread+0x1e4/0x3e4
[  207.941017]  kthread+0x12c/0x204
[  207.944347]  ret_from_fork+0x10/0x20
[  207.948031] task:kworker/6:5     state:I stack:0     pid:284   tgid:284   ppid:2      task_flags:0x4208060 flags:0x00000010
[  207.959451] Workqueue:  0x0 (mm_percpu_wq)
[  207.963665] Call trace:
[  207.966182]  __switch_to+0xec/0x1c0 (T)
[  207.970132]  __schedule+0x368/0xce0
[  207.973726]  schedule+0x34/0x118
[  207.977044]  worker_thread+0x1e4/0x3e4
[  207.980903]  kthread+0x12c/0x204
[  207.984222]  ret_from_fork+0x10/0x20
[  207.987906] task:dhcpcd          state:D stack:0     pid:288   tgid:288   ppid:1      task_flags:0x400100 flags:0x00000800
[  207.999235] Call trace:
[  208.001752]  __switch_to+0xec/0x1c0 (T)
[  208.005702]  __schedule+0x368/0xce0
[  208.009296]  schedule+0x34/0x118
[  208.012614]  schedule_timeout+0xd4/0x110
[  208.016653]  wait_for_completion_state+0x104/0x200
[  208.021577]  call_usermodehelper_exec+0x1bc/0x230
[  208.026414]  __request_module+0x188/0x220
[  208.030541]  sock_ioctl+0x350/0x360
[  208.034136]  __arm64_sys_ioctl+0xac/0x104
[  208.038264]  invoke_syscall+0x48/0x104
[  208.042122]  el0_svc_common.constprop.0+0xc0/0xe0
[  208.046958]  do_el0_svc+0x1c/0x28
[  208.050374]  el0_svc+0x34/0x108
[  208.053614]  el0t_64_sync_handler+0xa0/0xf0
[  208.057918]  el0t_64_sync+0x198/0x19c
[  208.061690] task:dhcpcd          state:S stack:0     pid:289   tgid:289   ppid:288    task_flags:0x400140 flags:0x00100000
[  208.073019] Call trace:
[  208.075536]  __switch_to+0xec/0x1c0 (T)
[  208.079485]  __schedule+0x368/0xce0
[  208.083079]  schedule+0x34/0x118
[  208.086408]  schedule_hrtimeout_range+0xf0/0x100
[  208.091157]  do_sys_poll+0x3a4/0x538
[  208.094841]  __arm64_sys_ppoll+0xac/0x13c
[  208.098968]  invoke_syscall+0x48/0x104
[  208.102827]  el0_svc_common.constprop.0+0x40/0xe0
[  208.107662]  do_el0_svc+0x1c/0x28
[  208.111078]  el0_svc+0x34/0x108
[  208.114318]  el0t_64_sync_handler+0xa0/0xf0
[  208.118622]  el0t_64_sync+0x198/0x19c
[  208.122393] task:dhcpcd          state:S stack:0     pid:290   tgid:290   ppid:288    task_flags:0x400140 flags:0x00100800
[  208.133723] Call trace:
[  208.136240]  __switch_to+0xec/0x1c0 (T)
[  208.140190]  __schedule+0x368/0xce0
[  208.143783]  schedule+0x34/0x118
[  208.147102]  schedule_hrtimeout_range+0xf0/0x100
[  208.151850]  do_sys_poll+0x3a4/0x538
[  208.155534]  __arm64_sys_ppoll+0xac/0x13c
[  208.159660]  invoke_syscall+0x48/0x104
[  208.163519]  el0_svc_common.constprop.0+0xc0/0xe0
[  208.168354]  do_el0_svc+0x1c/0x28
[  208.171770]  el0_svc+0x34/0x108
[  208.175010]  el0t_64_sync_handler+0xa0/0xf0
[  208.179314]  el0t_64_sync+0x198/0x19c
[  208.183086] task:dhcpcd          state:S stack:0     pid:291   tgid:291   ppid:288    task_flags:0x400140 flags:0x00100800
[  208.194416] Call trace:
[  208.196933]  __switch_to+0xec/0x1c0 (T)
[  208.200883]  __schedule+0x368/0xce0
[  208.204476]  schedule+0x34/0x118
[  208.207794]  schedule_hrtimeout_range+0xf0/0x100
[  208.212542]  do_sys_poll+0x3a4/0x538
[  208.216227]  __arm64_sys_ppoll+0xac/0x13c
[  208.220353]  invoke_syscall+0x48/0x104
[  208.224212]  el0_svc_common.constprop.0+0xc0/0xe0
[  208.229047]  do_el0_svc+0x1c/0x28
[  208.232464]  el0_svc+0x34/0x108
[  208.235703]  el0t_64_sync_handler+0xa0/0xf0
[  208.240007]  el0t_64_sync+0x198/0x19c
[  208.243780] task:modprobe        state:D stack:0     pid:292   tgid:292   ppid:55     task_flags:0x400100 flags:0x00000018
[  208.255109] Call trace:
[  208.257626]  __switch_to+0xec/0x1c0 (T)
[  208.261575]  __schedule+0x368/0xce0
[  208.265169]  schedule+0x34/0x118
[  208.268487]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  208.274388]  async_synchronize_full+0x78/0xa0
[  208.278869]  do_init_module+0x190/0x23c
[  208.282818]  load_module+0x1754/0x1ce0
[  208.286678]  init_module_from_file+0xdc/0x100
[  208.291159]  __arm64_sys_finit_module+0x1bc/0x330
[  208.295994]  invoke_syscall+0x48/0x104
[  208.299853]  el0_svc_common.constprop.0+0x40/0xe0
[  208.304688]  do_el0_svc+0x1c/0x28
[  208.308105]  el0_svc+0x34/0x108
[  208.311345]  el0t_64_sync_handler+0xa0/0xf0
[  208.315649]  el0t_64_sync+0x198/0x19c
[  208.319421] task:qrtr-ns         state:S stack:0     pid:293   tgid:293   ppid:1      task_flags:0x400100 flags:0x00000000
[  208.330751] Call trace:
[  208.333268]  __switch_to+0xec/0x1c0 (T)
[  208.337217]  __schedule+0x368/0xce0
[  208.340811]  schedule+0x34/0x118
[  208.344140]  do_nanosleep+0x64/0x160
[  208.347823]  hrtimer_nanosleep+0x94/0x108
[  208.351949]  common_nsleep+0x48/0x54
[  208.355634]  __arm64_sys_clock_nanosleep+0xd0/0x150
[  208.360645]  invoke_syscall+0x48/0x104
[  208.364504]  el0_svc_common.constprop.0+0x40/0xe0
[  208.369339]  do_el0_svc+0x1c/0x28
[  208.372756]  el0_svc+0x34/0x108
[  208.375995]  el0t_64_sync_handler+0xa0/0xf0
[  208.380299]  el0t_64_sync+0x198/0x19c
[  208.384071] task:tqftpserv       state:S stack:0     pid:297   tgid:297   ppid:1      task_flags:0x400100 flags:0x00000000
[  208.395401] Call trace:
[  208.397918]  __switch_to+0xec/0x1c0 (T)
[  208.401868]  __schedule+0x368/0xce0
[  208.405462]  schedule+0x34/0x118
[  208.408791]  schedule_hrtimeout_range+0xf0/0x100
[  208.413538]  do_select+0x434/0x6e4
[  208.417045]  core_sys_select+0x1d4/0x298
[  208.421084]  __arm64_sys_pselect6+0x134/0x1a0
[  208.425566]  invoke_syscall+0x48/0x104
[  208.429424]  el0_svc_common.constprop.0+0x40/0xe0
[  208.434259]  do_el0_svc+0x1c/0x28
[  208.437675]  el0_svc+0x34/0x108
[  208.440914]  el0t_64_sync_handler+0xa0/0xf0
[  208.445218]  el0t_64_sync+0x198/0x19c
[  208.448990] task:kworker/u33:9   state:I stack:0     pid:298   tgid:298   ppid:2      task_flags:0x4208060 flags:0x00000010
[  208.460410] Workqueue:  0x0 (events_power_efficient)
[  208.465512] Call trace:
[  208.468028]  __switch_to+0xec/0x1c0 (T)
[  208.471978]  __schedule+0x368/0xce0
[  208.475572]  schedule+0x34/0x118
[  208.478901]  worker_thread+0x1e4/0x3e4
[  208.482759]  kthread+0x12c/0x204
[  208.486079]  ret_from_fork+0x10/0x20
[  208.489763] task:login           state:S stack:0     pid:299   tgid:299   ppid:1      task_flags:0x400100 flags:0x00000000
[  208.501093] Call trace:
[  208.503610]  __switch_to+0xec/0x1c0 (T)
[  208.507560]  __schedule+0x368/0xce0
[  208.511153]  schedule+0x34/0x118
[  208.514482]  do_wait+0x5c/0xbc
[  208.517633]  kernel_wait4+0xa4/0x180
[  208.521316]  __do_sys_wait4+0xf0/0x108
[  208.525176]  __arm64_sys_wait4+0x24/0x30
[  208.529214]  invoke_syscall+0x48/0x104
[  208.533073]  el0_svc_common.constprop.0+0x40/0xe0
[  208.537908]  do_el0_svc+0x1c/0x28
[  208.541324]  el0_svc+0x34/0x108
[  208.544564]  el0t_64_sync_handler+0xa0/0xf0
[  208.548868]  el0t_64_sync+0x198/0x19c
[  208.552640] task:login           state:S stack:0     pid:300   tgid:300   ppid:1      task_flags:0x400100 flags:0x00000000
[  208.563970] Call trace:
[  208.566487]  __switch_to+0xec/0x1c0 (T)
[  208.570437]  __schedule+0x368/0xce0
[  208.574030]  schedule+0x34/0x118
[  208.577359]  do_wait+0x5c/0xbc
[  208.580510]  kernel_wait4+0xa4/0x180
[  208.584193]  __do_sys_wait4+0xf0/0x108
[  208.588053]  __arm64_sys_wait4+0x24/0x30
[  208.592091]  invoke_syscall+0x48/0x104
[  208.595950]  el0_svc_common.constprop.0+0x40/0xe0
[  208.600784]  do_el0_svc+0x1c/0x28
[  208.604201]  el0_svc+0x34/0x108
[  208.607441]  el0t_64_sync_handler+0xa0/0xf0
[  208.611745]  el0t_64_sync+0x198/0x19c
[  208.615516] task:kworker/0:5     state:I stack:0     pid:303   tgid:303   ppid:2      task_flags:0x4208060 flags:0x00000010
[  208.626936] Workqueue:  0x0 (events)
[  208.630619] Call trace:
[  208.633136]  __switch_to+0xec/0x1c0 (T)
[  208.637086]  __schedule+0x368/0xce0
[  208.640680]  schedule+0x34/0x118
[  208.644009]  worker_thread+0x1e4/0x3e4
[  208.647868]  kthread+0x12c/0x204
[  208.651198]  ret_from_fork+0x10/0x20
[  208.654883] task:systemd-userdbd state:S stack:0     pid:315   tgid:315   ppid:1      task_flags:0x400100 flags:0x00000800
[  208.666212] Call trace:
[  208.668729]  __switch_to+0xec/0x1c0 (T)
[  208.672679]  __schedule+0x368/0xce0
[  208.676272]  schedule+0x34/0x118
[  208.679601]  schedule_hrtimeout_range+0xf0/0x100
[  208.684350]  do_epoll_wait+0x47c/0x4dc
[  208.688208]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  208.693220]  __arm64_sys_epoll_pwait+0x78/0x120
[  208.697877]  invoke_syscall+0x48/0x104
[  208.701735]  el0_svc_common.constprop.0+0xc0/0xe0
[  208.706570]  do_el0_svc+0x1c/0x28
[  208.709987]  el0_svc+0x34/0x108
[  208.713226]  el0t_64_sync_handler+0xa0/0xf0
[  208.717530]  el0t_64_sync+0x198/0x19c
[  208.721302] task:systemd-userwor state:S stack:0     pid:316   tgid:316   ppid:315    task_flags:0x400100 flags:0x00000800
[  208.732632] Call trace:
[  208.735149]  __switch_to+0xec/0x1c0 (T)
[  208.739099]  __schedule+0x368/0xce0
[  208.742692]  schedule+0x34/0x118
[  208.746021]  schedule_timeout+0x8c/0x110
[  208.750060]  __skb_wait_for_more_packets+0x12c/0x198
[  208.755163]  __skb_recv_datagram+0x84/0xe8
[  208.759379]  skb_recv_datagram+0x38/0x64
[  208.763418]  unix_accept+0x8c/0x19c
[  208.767013]  do_accept+0xe8/0x1a0
[  208.770431]  __sys_accept4+0x84/0x120
[  208.774203]  __arm64_sys_accept4+0x20/0x30
[  208.778418]  invoke_syscall+0x48/0x104
[  208.782277]  el0_svc_common.constprop.0+0xc0/0xe0
[  208.787112]  do_el0_svc+0x1c/0x28
[  208.790528]  el0_svc+0x34/0x108
[  208.793768]  el0t_64_sync_handler+0xa0/0xf0
[  208.798072]  el0t_64_sync+0x198/0x19c
[  208.801844] task:systemd-userwor state:S stack:0     pid:317   tgid:317   ppid:315    task_flags:0x400100 flags:0x00000800
[  208.813173] Call trace:
[  208.815690]  __switch_to+0xec/0x1c0 (T)
[  208.819640]  __schedule+0x368/0xce0
[  208.823233]  schedule+0x34/0x118
[  208.826562]  schedule_timeout+0x8c/0x110
[  208.830601]  __skb_wait_for_more_packets+0x12c/0x198
[  208.835703]  __skb_recv_datagram+0x84/0xe8
[  208.839919]  skb_recv_datagram+0x38/0x64
[  208.843958]  unix_accept+0x8c/0x19c
[  208.847552]  do_accept+0xe8/0x1a0
[  208.850970]  __sys_accept4+0x84/0x120
[  208.854742]  __arm64_sys_accept4+0x20/0x30
[  208.858957]  invoke_syscall+0x48/0x104
[  208.862815]  el0_svc_common.constprop.0+0xc0/0xe0
[  208.867650]  do_el0_svc+0x1c/0x28
[  208.871067]  el0_svc+0x34/0x108
[  208.874306]  el0t_64_sync_handler+0xa0/0xf0
[  208.878610]  el0t_64_sync+0x198/0x19c
[  208.882382] task:systemd-userwor state:S stack:0     pid:318   tgid:318   ppid:315    task_flags:0x400100 flags:0x00000800
[  208.893712] Call trace:
[  208.896229]  __switch_to+0xec/0x1c0 (T)
[  208.900179]  __schedule+0x368/0xce0
[  208.903772]  schedule+0x34/0x118
[  208.907101]  schedule_timeout+0x8c/0x110
[  208.911140]  __skb_wait_for_more_packets+0x12c/0x198
[  208.916242]  __skb_recv_datagram+0x84/0xe8
[  208.920458]  skb_recv_datagram+0x38/0x64
[  208.924497]  unix_accept+0x8c/0x19c
[  208.928091]  do_accept+0xe8/0x1a0
[  208.931508]  __sys_accept4+0x84/0x120
[  208.935280]  __arm64_sys_accept4+0x20/0x30
[  208.939495]  invoke_syscall+0x48/0x104
[  208.943353]  el0_svc_common.constprop.0+0xc0/0xe0
[  208.948188]  do_el0_svc+0x1c/0x28
[  208.951605]  el0_svc+0x34/0x108
[  208.954844]  el0t_64_sync_handler+0xa0/0xf0
[  208.959148]  el0t_64_sync+0x198/0x19c
[  208.962921] task:sh              state:S stack:0     pid:320   tgid:320   ppid:300    task_flags:0x400100 flags:0x00000000
[  208.974250] Call trace:
[  208.976767]  __switch_to+0xec/0x1c0 (T)
[  208.980717]  __schedule+0x368/0xce0
[  208.984311]  schedule+0x34/0x118
[  208.987639]  do_wait+0x5c/0xbc
[  208.990790]  kernel_wait4+0xa4/0x180
[  208.994473]  __do_sys_wait4+0xf0/0x108
[  208.998333]  __arm64_sys_wait4+0x24/0x30
[  209.002371]  invoke_syscall+0x48/0x104
[  209.006230]  el0_svc_common.constprop.0+0x40/0xe0
[  209.011065]  do_el0_svc+0x1c/0x28
[  209.014482]  el0_svc+0x34/0x108
[  209.017721]  el0t_64_sync_handler+0xa0/0xf0
[  209.022024]  el0t_64_sync+0x198/0x19c
[  209.025797] task:sh              state:S stack:0     pid:321   tgid:321   ppid:299    task_flags:0x400100 flags:0x00000010
[  209.037126] Call trace:
[  209.039644]  __switch_to+0xec/0x1c0 (T)
[  209.043594]  __schedule+0x368/0xce0
[  209.047187]  schedule+0x34/0x118
[  209.050516]  schedule_hrtimeout_range+0xf0/0x100
[  209.055265]  do_sys_poll+0x3a4/0x538
[  209.058948]  __arm64_sys_ppoll+0xac/0x13c
[  209.063075]  invoke_syscall+0x48/0x104
[  209.066934]  el0_svc_common.constprop.0+0x40/0xe0
[  209.071769]  do_el0_svc+0x1c/0x28
[  209.075185]  el0_svc+0x34/0x108
[  209.078425]  el0t_64_sync_handler+0xa0/0xf0
[  209.082729]  el0t_64_sync+0x198/0x19c
[  209.086501] task:mkfs.ext4       state:D stack:0     pid:327   tgid:327   ppid:320    task_flags:0x440100 flags:0x00000000
[  209.097830] Call trace:
[  209.100347]  __switch_to+0xec/0x1c0 (T)
[  209.104297]  __schedule+0x368/0xce0
[  209.107891]  schedule+0x34/0x118
[  209.111220]  __bio_queue_enter+0x19c/0x298
[  209.115436]  blk_mq_submit_bio+0x3d0/0x70c
[  209.119651]  __submit_bio+0x68/0x254
[  209.123333]  submit_bio_noacct_nocheck+0x1b8/0x264
[  209.128257]  submit_bio_noacct+0x1a0/0x2e8
[  209.132471]  submit_bio+0xa4/0x1f4
[  209.135976]  mpage_readahead+0x124/0x184
[  209.140015]  blkdev_readahead+0x18/0x24
[  209.143965]  read_pages+0x98/0x2a0
[  209.147470]  page_cache_ra_unbounded+0x180/0x260
[  209.152218]  force_page_cache_ra+0xa8/0xd0
[  209.156432]  page_cache_sync_ra+0x40/0x258
[  209.160647]  filemap_get_pages+0x104/0x728
[  209.164862]  filemap_read+0xe8/0x3dc
[  209.168547]  blkdev_read_iter+0x84/0x198
[  209.172585]  vfs_read+0x230/0x31c
[  209.176005]  ksys_read+0x70/0x110
[  209.179423]  __arm64_sys_read+0x1c/0x28
[  209.183374]  invoke_syscall+0x48/0x104
[  209.187232]  el0_svc_common.constprop.0+0x40/0xe0
[  209.192067]  do_el0_svc+0x1c/0x28
[  209.195484]  el0_svc+0x34/0x108
[  209.198723]  el0t_64_sync_handler+0xa0/0xf0
[  209.203027]  el0t_64_sync+0x198/0x19c
[  209.206800] task:systemd-udevd   state:S stack:0     pid:329   tgid:329   ppid:167    task_flags:0x400140 flags:0x00000800
[  209.218129] Call trace:
[  209.220646]  __switch_to+0xec/0x1c0 (T)
[  209.224596]  __schedule+0x368/0xce0
[  209.228189]  schedule+0x34/0x118
[  209.231507]  schedule_hrtimeout_range+0xf0/0x100
[  209.236255]  do_epoll_wait+0x47c/0x4dc
[  209.240114]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  209.245126]  __arm64_sys_epoll_pwait+0x78/0x120
[  209.249783]  invoke_syscall+0x48/0x104
[  209.253642]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.258477]  do_el0_svc+0x1c/0x28
[  209.261893]  el0_svc+0x34/0x108
[  209.265133]  el0t_64_sync_handler+0xa0/0xf0
[  209.269437]  el0t_64_sync+0x198/0x19c
[  209.273209] task:systemd-udevd   state:S stack:0     pid:330   tgid:330   ppid:167    task_flags:0x400140 flags:0x00000800
[  209.284538] Call trace:
[  209.287055]  __switch_to+0xec/0x1c0 (T)
[  209.291005]  __schedule+0x368/0xce0
[  209.294599]  schedule+0x34/0x118
[  209.297928]  schedule_hrtimeout_range+0xf0/0x100
[  209.302676]  do_epoll_wait+0x47c/0x4dc
[  209.306535]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  209.311546]  __arm64_sys_epoll_pwait+0x78/0x120
[  209.316204]  invoke_syscall+0x48/0x104
[  209.320063]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.324898]  do_el0_svc+0x1c/0x28
[  209.328314]  el0_svc+0x34/0x108
[  209.331554]  el0t_64_sync_handler+0xa0/0xf0
[  209.335857]  el0t_64_sync+0x198/0x19c
[  209.339629] task:systemd-udevd   state:D stack:0     pid:331   tgid:331   ppid:167    task_flags:0x400140 flags:0x00000818
[  209.350959] Call trace:
[  209.353476]  __switch_to+0xec/0x1c0 (T)
[  209.357426]  __schedule+0x368/0xce0
[  209.361020]  schedule+0x34/0x118
[  209.364338]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  209.370239]  async_synchronize_full+0x78/0xa0
[  209.374720]  do_init_module+0x190/0x23c
[  209.378669]  load_module+0x1754/0x1ce0
[  209.382529]  init_module_from_file+0xdc/0x100
[  209.387010]  __arm64_sys_finit_module+0x1bc/0x330
[  209.391845]  invoke_syscall+0x48/0x104
[  209.395703]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.400539]  do_el0_svc+0x1c/0x28
[  209.403955]  el0_svc+0x34/0x108
[  209.407195]  el0t_64_sync_handler+0xa0/0xf0
[  209.411499]  el0t_64_sync+0x198/0x19c
[  209.415271] task:systemd-udevd   state:S stack:0     pid:332   tgid:332   ppid:167    task_flags:0x400140 flags:0x00000800
[  209.426600] Call trace:
[  209.429117]  __switch_to+0xec/0x1c0 (T)
[  209.433067]  __schedule+0x368/0xce0
[  209.436661]  schedule+0x34/0x118
[  209.439979]  schedule_hrtimeout_range+0xf0/0x100
[  209.444727]  do_epoll_wait+0x47c/0x4dc
[  209.448586]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  209.453597]  __arm64_sys_epoll_pwait+0x78/0x120
[  209.458255]  invoke_syscall+0x48/0x104
[  209.462113]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.466948]  do_el0_svc+0x1c/0x28
[  209.470365]  el0_svc+0x34/0x108
[  209.473604]  el0t_64_sync_handler+0xa0/0xf0
[  209.477908]  el0t_64_sync+0x198/0x19c
[  209.481680] task:systemd-udevd   state:S stack:0     pid:333   tgid:333   ppid:167    task_flags:0x400140 flags:0x00000800
[  209.493009] Call trace:
[  209.495527]  __switch_to+0xec/0x1c0 (T)
[  209.499476]  __schedule+0x368/0xce0
[  209.503070]  schedule+0x34/0x118
[  209.506399]  schedule_hrtimeout_range+0xf0/0x100
[  209.511147]  do_epoll_wait+0x47c/0x4dc
[  209.515006]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  209.520017]  __arm64_sys_epoll_pwait+0x78/0x120
[  209.524675]  invoke_syscall+0x48/0x104
[  209.528534]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.533369]  do_el0_svc+0x1c/0x28
[  209.536786]  el0_svc+0x34/0x108
[  209.540025]  el0t_64_sync_handler+0xa0/0xf0
[  209.544329]  el0t_64_sync+0x198/0x19c
[  209.548101] task:systemd-udevd   state:S stack:0     pid:334   tgid:334   ppid:167    task_flags:0x400140 flags:0x00000800
[  209.559430] Call trace:
[  209.561947]  __switch_to+0xec/0x1c0 (T)
[  209.565897]  __schedule+0x368/0xce0
[  209.569491]  schedule+0x34/0x118
[  209.572820]  schedule_hrtimeout_range+0xf0/0x100
[  209.577568]  do_epoll_wait+0x47c/0x4dc
[  209.581426]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  209.586438]  __arm64_sys_epoll_pwait+0x78/0x120
[  209.591096]  invoke_syscall+0x48/0x104
[  209.594954]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.599789]  do_el0_svc+0x1c/0x28
[  209.603206]  el0_svc+0x34/0x108
[  209.606445]  el0t_64_sync_handler+0xa0/0xf0
[  209.610749]  el0t_64_sync+0x198/0x19c
[  209.614521] task:systemd-udevd   state:S stack:0     pid:335   tgid:335   ppid:167    task_flags:0x400140 flags:0x00000800
[  209.625850] Call trace:
[  209.628367]  __switch_to+0xec/0x1c0 (T)
[  209.632316]  __schedule+0x368/0xce0
[  209.635910]  schedule+0x34/0x118
[  209.639239]  schedule_hrtimeout_range+0xf0/0x100
[  209.643988]  do_epoll_wait+0x47c/0x4dc
[  209.647846]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  209.652858]  __arm64_sys_epoll_pwait+0x78/0x120
[  209.657515]  invoke_syscall+0x48/0x104
[  209.661374]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.666209]  do_el0_svc+0x1c/0x28
[  209.669625]  el0_svc+0x34/0x108
[  209.672865]  el0t_64_sync_handler+0xa0/0xf0
[  209.677169]  el0t_64_sync+0x198/0x19c
[  209.680940] task:systemd-udevd   state:S stack:0     pid:336   tgid:336   ppid:167    task_flags:0x400140 flags:0x00000800
[  209.692270] Call trace:
[  209.694786]  __switch_to+0xec/0x1c0 (T)
[  209.698736]  __schedule+0x368/0xce0
[  209.702330]  schedule+0x34/0x118
[  209.705659]  schedule_hrtimeout_range+0xf0/0x100
[  209.710407]  do_epoll_wait+0x47c/0x4dc
[  209.714265]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  209.719277]  __arm64_sys_epoll_pwait+0x78/0x120
[  209.723935]  invoke_syscall+0x48/0x104
[  209.727794]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.732628]  do_el0_svc+0x1c/0x28
[  209.736045]  el0_svc+0x34/0x108
[  209.739285]  el0t_64_sync_handler+0xa0/0xf0
[  209.743589]  el0t_64_sync+0x198/0x19c
[  209.747360] task:systemd-udevd   state:S stack:0     pid:337   tgid:337   ppid:167    task_flags:0x400140 flags:0x00000800
[  209.758689] Call trace:
[  209.761206]  __switch_to+0xec/0x1c0 (T)
[  209.765156]  __schedule+0x368/0xce0
[  209.768750]  schedule+0x34/0x118
[  209.772068]  schedule_hrtimeout_range+0xf0/0x100
[  209.776816]  do_epoll_wait+0x47c/0x4dc
[  209.780675]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  209.785686]  __arm64_sys_epoll_pwait+0x78/0x120
[  209.790344]  invoke_syscall+0x48/0x104
[  209.794203]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.799038]  do_el0_svc+0x1c/0x28
[  209.802455]  el0_svc+0x34/0x108
[  209.805694]  el0t_64_sync_handler+0xa0/0xf0
[  209.809999]  el0t_64_sync+0x198/0x19c
[  209.813770] task:systemd-udevd   state:S stack:0     pid:338   tgid:338   ppid:167    task_flags:0x400140 flags:0x00000800
[  209.825100] Call trace:
[  209.827618]  __switch_to+0xec/0x1c0 (T)
[  209.831567]  __schedule+0x368/0xce0
[  209.835160]  schedule+0x34/0x118
[  209.838478]  schedule_hrtimeout_range+0xf0/0x100
[  209.843227]  do_epoll_wait+0x47c/0x4dc
[  209.847085]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  209.852096]  __arm64_sys_epoll_pwait+0x78/0x120
[  209.856753]  invoke_syscall+0x48/0x104
[  209.860612]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.865447]  do_el0_svc+0x1c/0x28
[  209.868863]  el0_svc+0x34/0x108
[  209.872102]  el0t_64_sync_handler+0xa0/0xf0
[  209.876406]  el0t_64_sync+0x198/0x19c
[  209.880178] task:systemd-udevd   state:S stack:0     pid:339   tgid:339   ppid:167    task_flags:0x400140 flags:0x00000800
[  209.891508] Call trace:
[  209.894025]  __switch_to+0xec/0x1c0 (T)
[  209.897975]  __schedule+0x368/0xce0
[  209.901568]  schedule+0x34/0x118
[  209.904898]  schedule_hrtimeout_range+0xf0/0x100
[  209.909645]  do_epoll_wait+0x47c/0x4dc
[  209.913505]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  209.918516]  __arm64_sys_epoll_pwait+0x78/0x120
[  209.923173]  invoke_syscall+0x48/0x104
[  209.927032]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.931867]  do_el0_svc+0x1c/0x28
[  209.935283]  el0_svc+0x34/0x108
[  209.938523]  el0t_64_sync_handler+0xa0/0xf0
[  209.942827]  el0t_64_sync+0x198/0x19c
[  209.946599] task:systemd-udevd   state:S stack:0     pid:340   tgid:340   ppid:167    task_flags:0x400140 flags:0x00000800
[  209.957928] Call trace:
[  209.960444]  __switch_to+0xec/0x1c0 (T)
[  209.964395]  __schedule+0x368/0xce0
[  209.967988]  schedule+0x34/0x118
[  209.971317]  schedule_hrtimeout_range+0xf0/0x100
[  209.976065]  do_epoll_wait+0x47c/0x4dc
[  209.979924]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  209.984936]  __arm64_sys_epoll_pwait+0x78/0x120
[  209.989593]  invoke_syscall+0x48/0x104
[  209.993452]  el0_svc_common.constprop.0+0xc0/0xe0
[  209.998287]  do_el0_svc+0x1c/0x28
[  210.001704]  el0_svc+0x34/0x108
[  210.004944]  el0t_64_sync_handler+0xa0/0xf0
[  210.009248]  el0t_64_sync+0x198/0x19c
[  210.013019] task:systemd-udevd   state:S stack:0     pid:341   tgid:341   ppid:167    task_flags:0x400140 flags:0x00000800
[  210.024349] Call trace:
[  210.026865]  __switch_to+0xec/0x1c0 (T)
[  210.030816]  __schedule+0x368/0xce0
[  210.034409]  schedule+0x34/0x118
[  210.037738]  schedule_hrtimeout_range+0xf0/0x100
[  210.042486]  do_epoll_wait+0x47c/0x4dc
[  210.046345]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  210.051356]  __arm64_sys_epoll_pwait+0x78/0x120
[  210.056014]  invoke_syscall+0x48/0x104
[  210.059873]  el0_svc_common.constprop.0+0xc0/0xe0
[  210.064708]  do_el0_svc+0x1c/0x28
[  210.068124]  el0_svc+0x34/0x108
[  210.071364]  el0t_64_sync_handler+0xa0/0xf0
[  210.075668]  el0t_64_sync+0x198/0x19c
[  210.079440] task:systemd-udevd   state:S stack:0     pid:342   tgid:342   ppid:167    task_flags:0x400140 flags:0x00000800
[  210.090769] Call trace:
[  210.093285]  __switch_to+0xec/0x1c0 (T)
[  210.097235]  __schedule+0x368/0xce0
[  210.100829]  schedule+0x34/0x118
[  210.104158]  schedule_hrtimeout_range+0xf0/0x100
[  210.108906]  do_epoll_wait+0x47c/0x4dc
[  210.112765]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  210.117776]  __arm64_sys_epoll_pwait+0x78/0x120
[  210.122433]  invoke_syscall+0x48/0x104
[  210.126292]  el0_svc_common.constprop.0+0xc0/0xe0
[  210.131127]  do_el0_svc+0x1c/0x28
[  210.134544]  el0_svc+0x34/0x108
[  210.137784]  el0t_64_sync_handler+0xa0/0xf0
[  210.142088]  el0t_64_sync+0x198/0x19c
[  210.145860] task:systemd-udevd   state:S stack:0     pid:343   tgid:343   ppid:167    task_flags:0x400140 flags:0x00000800
[  210.157189] Call trace:
[  210.159706]  __switch_to+0xec/0x1c0 (T)
[  210.163656]  __schedule+0x368/0xce0
[  210.167250]  schedule+0x34/0x118
[  210.170568]  schedule_hrtimeout_range+0xf0/0x100
[  210.175315]  do_epoll_wait+0x47c/0x4dc
[  210.179174]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  210.184185]  __arm64_sys_epoll_pwait+0x78/0x120
[  210.188843]  invoke_syscall+0x48/0x104
[  210.192702]  el0_svc_common.constprop.0+0xc0/0xe0
[  210.197537]  do_el0_svc+0x1c/0x28
[  210.200953]  el0_svc+0x34/0x108
[  210.204193]  el0t_64_sync_handler+0xa0/0xf0
[  210.208497]  el0t_64_sync+0x198/0x19c
[  210.212268] task:systemd-udevd   state:S stack:0     pid:344   tgid:344   ppid:167    task_flags:0x400140 flags:0x00000800
[  210.223597] Call trace:
[  210.226115]  __switch_to+0xec/0x1c0 (T)
[  210.230065]  __schedule+0x368/0xce0
[  210.233659]  schedule+0x34/0x118
[  210.236988]  schedule_hrtimeout_range+0xf0/0x100
[  210.241736]  do_epoll_wait+0x47c/0x4dc
[  210.245595]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  210.250606]  __arm64_sys_epoll_pwait+0x78/0x120
[  210.255263]  invoke_syscall+0x48/0x104
[  210.259122]  el0_svc_common.constprop.0+0xc0/0xe0
[  210.263957]  do_el0_svc+0x1c/0x28
[  210.267374]  el0_svc+0x34/0x108
[  210.270613]  el0t_64_sync_handler+0xa0/0xf0
[  210.274917]  el0t_64_sync+0x198/0x19c
[  210.278689] task:systemd-udevd   state:S stack:0     pid:345   tgid:345   ppid:167    task_flags:0x400140 flags:0x00000800
[  210.290018] Call trace:
[  210.292535]  __switch_to+0xec/0x1c0 (T)
[  210.296484]  __schedule+0x368/0xce0
[  210.300078]  schedule+0x34/0x118
[  210.303407]  schedule_hrtimeout_range+0xf0/0x100
[  210.308155]  do_epoll_wait+0x47c/0x4dc
[  210.312014]  do_compat_epoll_pwait.part.0+0x14/0xa8
[  210.317025]  __arm64_sys_epoll_pwait+0x78/0x120
[  210.321683]  invoke_syscall+0x48/0x104
[  210.325542]  el0_svc_common.constprop.0+0xc0/0xe0
[  210.330377]  do_el0_svc+0x1c/0x28
[  210.333793]  el0_svc+0x34/0x108
[  210.337033]  el0t_64_sync_handler+0xa0/0xf0
[  210.341337]  el0t_64_sync+0x198/0x19c
[  210.345109] task:kworker/u33:10  state:I stack:0     pid:347   tgid:347   ppid:2      task_flags:0x4208060 flags:0x00000010
[  210.356529] Workqueue:  0x0 (async)
[  210.360123] Call trace:
[  210.362640]  __switch_to+0xec/0x1c0 (T)
[  210.366589]  __schedule+0x368/0xce0
[  210.370183]  schedule+0x34/0x118
[  210.373501]  worker_thread+0x1e4/0x3e4
[  210.377360]  kthread+0x12c/0x204
[  210.380679]  ret_from_fork+0x10/0x20
[  210.384363] task:kworker/u33:11  state:I stack:0     pid:348   tgid:348   ppid:2      task_flags:0x4208060 flags:0x00000010
[  210.395782] Workqueue:  0x0 (async)
[  210.399376] Call trace:
[  210.401893]  __switch_to+0xec/0x1c0 (T)
[  210.405842]  __schedule+0x368/0xce0
[  210.409436]  schedule+0x34/0x118
[  210.412765]  worker_thread+0x1e4/0x3e4
[  210.416624]  kthread+0x12c/0x204
[  210.419943]  ret_from_fork+0x10/0x20
[  210.423627] task:kworker/u33:12  state:I stack:0     pid:349   tgid:349   ppid:2      task_flags:0x4208060 flags:0x00000010
[  210.435046] Workqueue:  0x0 (events_unbound)
[  210.439438] Call trace:
[  210.441955]  __switch_to+0xec/0x1c0 (T)
[  210.445904]  __schedule+0x368/0xce0
[  210.449497]  schedule+0x34/0x118
[  210.452827]  worker_thread+0x1e4/0x3e4
[  210.456685]  kthread+0x12c/0x204
[  210.460004]  ret_from_fork+0x10/0x20
[  210.463689] task:kworker/u33:13  state:I stack:0     pid:350   tgid:350   ppid:2      task_flags:0x4208060 flags:0x00000010
[  210.475108] Call trace:
[  210.477625]  __switch_to+0xec/0x1c0 (T)
[  210.481575]  __schedule+0x368/0xce0
[  210.485169]  schedule+0x34/0x118
[  210.488498]  worker_thread+0x1e4/0x3e4
[  210.492357]  kthread+0x12c/0x204
[  210.495675]  ret_from_fork+0x10/0x20
[  210.499360] task:kworker/u33:14  state:I stack:0     pid:351   tgid:351   ppid:2      task_flags:0x4208060 flags:0x00000010
[  210.510780] Call trace:
[  210.513297]  __switch_to+0xec/0x1c0 (T)
[  210.517247]  __schedule+0x368/0xce0
[  210.520840]  schedule+0x34/0x118
[  210.524169]  worker_thread+0x1e4/0x3e4
[  210.528028]  kthread+0x12c/0x204
[  210.531358]  ret_from_fork+0x10/0x20
[  210.535042] Sched Debug Version: v0.11, 6.18.0-next-20251203 #21
[  210.541207] ktime                                   : 210157.932678
[  210.547649] sched_clk                               : 210535.042204
[  210.554090] cpu_clk                                 : 210535.042256
[  210.560532] jiffies                                 : 4294944760
[  210.566697]
[  210.568239] sysctl_sched
[  210.570845]   .sysctl_sched_base_slice                 : 2.800000
[  210.577109]   .sysctl_sched_features                   : 99805183
[  210.583373]   .sysctl_sched_tunable_scaling            : 1 (logarithmic)
[  210.590258]
[  210.591802] cpu#0
[  210.593787]   .nr_running                    : 0
[  210.598533]   .nr_switches                   : 7027
[  210.603544]   .nr_uninterruptible            : -3
[  210.608379]   .next_balance                  : 4294.941947
[  210.614011]   .curr->pid                     : 0
[  210.618756]   .clock                         : 210229.152724
[  210.624567]   .clock_task                    : 193800.044865
[  210.630378]   .avg_idle                      : 1000000
[  210.635655]   .max_idle_balance_cost         : 500000
[  210.640846]
[  210.642391] cfs_rq[0]:/
[  210.644908]   .left_deadline                 : 0.000001
[  210.650274]   .left_vruntime                 : 0.000001
[  210.655640]   .zero_vruntime                 : 9352.233531
[  210.661272]   .avg_vruntime                  : 9352.233531
[  210.666903]   .right_vruntime                : 0.000001
[  210.672269]   .spread                        : 0.000000
[  210.677635]   .nr_queued                     : 0
[  210.682381]   .h_nr_runnable                 : 0
[  210.687127]   .h_nr_queued                   : 0
[  210.691873]   .h_nr_idle                     : 0
[  210.696619]   .load                          : 0
[  210.701365]   .load_avg                      : 0
[  210.706111]   .runnable_avg                  : 0
[  210.710856]   .util_avg                      : 0
[  210.715602]   .util_est                      : 0
[  210.720348]   .removed.load_avg              : 0
[  210.725094]   .removed.util_avg              : 0
[  210.729840]   .removed.runnable_avg          : 0
[  210.734586]   .tg_load_avg_contrib           : 0
[  210.739332]   .tg_load_avg                   : 0
[  210.744079]
[  210.745622] rt_rq[0]:
[  210.747962]   .rt_nr_running                 : 0
[  210.752709]
[  210.754252] dl_rq[0]:
[  210.756592]   .dl_nr_running                 : 0
[  210.761338]   .dl_bw->bw                     : 996147
[  210.766528]   .dl_bw->total_bw               : 419424
[  210.771717]
[  210.773260] runnable tasks:
[  210.776132]  S            task   PID       vruntime   eligible    deadline             slice          sum-exec      switches  prio         wait-time        sum-sleep       sum-block  node   group-id  group-path
[  210.795298] -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[  210.813832]  I kworker/R-sync_     5         0.956465   E           0.948402           0.700000         0.002344         2     100         0.000000         0.000000         0.000000   0      0        /
[  210.832194]  I kworker/R-kvfre     6         0.953431   E           0.945369           0.700000         0.002500         2     100         0.000000         0.000000         0.000000   0      0        /
[  210.850556]  I kworker/R-slub_     7         0.950467   E           0.942404           0.700000         0.002448         2     100         0.000000         0.000000         0.000000   0      0        /
[  210.868917]  I kworker/R-netns     8         0.947539   E           0.939475           0.700000         0.002292         2     100         0.000000         0.000000         0.000000   0      0        /
[  210.887279]  I     kworker/0:0     9      1530.382280   E        1533.180301           2.800000         1.782604        14     120         0.000000         0.000000         0.000000   0      0        /
[  210.905641]  I     kworker/0:1    10      1523.572094   E        1526.368501           2.800000         0.037184        11     120         0.000000         0.000000         0.000000   0      0        /
[  210.924003]  I    kworker/0:0H    11      1506.809292   E        1506.841549           2.800000         0.025419         8     100         0.000000         0.000000         0.000000   0      0        /
[  210.942365]  I kworker/R-mm_pe    13         0.922929   E           0.914866           0.700000         0.002292         2     100         0.000000         0.000000         0.000000   0      0        /
[  210.960726]  S     ksoftirqd/0    14      1531.524216   E        1534.324216           2.800000         1.650578        60     120         0.000000         0.000000         0.000000   0      0        /
[  210.979089]  S rcu_exp_par_gp_    16         9.399748   E          10.099123           0.700000         0.001875         2     120         0.000000         0.000000         0.000000   0      0        /
[  210.997451]  S     migration/0    18        17.726449   E          18.425824           0.700000        43.535775       186       0         0.000000         0.000000         0.000000   0      0        /
[  211.015812]  S         cpuhp/0    19       611.512078   E         614.305776           2.800000         0.044323        12     120         0.000000         0.000000         0.000000   0      0        /
[  211.034175]  S   kworker/u33:0    55      1516.194516   E        1518.976495           2.800000         0.263233        41     120         0.000000         0.000000         0.000000   0      0        /
[  211.052537]  I    kworker/0:1H    77       515.336110   E         515.368374           2.800000         0.008646         2     100         0.000000         0.000000         0.000000   0      0        /
[  211.070900]  I     kworker/0:2    85      1541.807318   E        1544.606380           2.800000         5.860263        60     120         0.000000         0.000000         0.000000   0      0        /
[  211.089262]  I     kworker/0:3    86      1540.568611   E        1543.355382           2.800000         0.089743        28     120         0.000000         0.000000         0.000000   0      0        /
[  211.107623]  I     kworker/0:4    87      9352.233531   E        9355.033531           2.800000        13.305894       447     120         0.000000         0.000000         0.000000   0      0        /
[  211.125986]  S   systemd-udevd   167        90.454284   E          93.228814           2.800000       106.415898       863     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  211.145423]  D   systemd-udevd   174        90.430220   E          93.208813           2.800000        62.876199       557     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  211.164859]  D   systemd-udevd   200        90.414229   E          93.209385           2.800000        34.904435       235     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  211.184295]  S irq/141-240b340   207       461.670583   E           2.795209           2.800000         0.066144        23      49         0.000000         0.000000         0.000000   0      0        /
[  211.202657]  S irq/141-240b740   208       461.668656   E           2.797136           2.800000         0.256772        36      49         0.000000         0.000000         0.000000   0      0        /
[  211.221019]  S irq/157-temp-al   230      1445.455428   E           2.798230           2.800000         0.009530         2      49         0.000000         0.000000         0.000000   0      0        /
[  211.239380]  S irq/158-temp-al   231      1445.455169   E           2.798489           2.800000         0.006562         2      49         0.000000         0.000000         0.000000   0      0        /
[  211.257741]  S  irq/142-ufshcd   236       276.172732   E           2.798177           2.800000         3.839909       437      49         0.000000         0.000000         0.000000   0      0        /
[  211.276103]  S  irq/163-aerdrv   241      1457.683136   E           2.796614           2.800000         0.029843         2      49         0.000000         0.000000         0.000000   0      0        /
[  211.294464]  S irq/147-qcom_pc   243      1457.683552   E           2.796198           2.800000         0.810416         4      49         0.000000         0.000000         0.000000   0      0        /
[  211.312826]  I   kworker/u35:1   248      1459.061903   E        1459.094186           2.800000         0.038802         2     100         0.000000         0.000000         0.000000   0      0        /
[  211.331188]  I   kworker/u33:9   298      9352.246552   E        9355.033531           2.800000       168.904642       206     120         0.000000         0.000000         0.000000   0      0        /
[  211.349550]  I     kworker/0:5   303      1530.192351   E        1532.988080           2.800000         0.037502         5     120         0.000000         0.000000         0.000000   0      0        /
[  211.367912]  S systemd-userdbd   315         1.741840   E           4.541840           2.800000        29.221824        12     120         0.000000         0.000000         0.000000   0      0        /autogroup-50
[  211.387349]  S   systemd-udevd   338        90.370895   E          93.019333           2.800000         9.113687        57     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  211.406785]  I  kworker/u33:10   347      9352.089578   E        9354.888276           2.800000         0.021718         8     120         0.000000         0.000000         0.000000   0      0        /
[  211.425147]  I  kworker/u33:14   351      9352.075282   E        9354.875230           2.800000         0.005573         2     120         0.000000         0.000000         0.000000   0      0        /
[  211.443508]
[  211.445051] cpu#1
[  211.447036]   .nr_running                    : 0
[  211.451783]   .nr_switches                   : 5515
[  211.456793]   .nr_uninterruptible            : -58
[  211.461716]   .next_balance                  : 4294.938165
[  211.467348]   .curr->pid                     : 0
[  211.472094]   .clock                         : 211253.152102
[  211.477904]   .clock_task                    : 211203.063186
[  211.483715]   .avg_idle                      : 1000000
[  211.488993]   .max_idle_balance_cost         : 500000
[  211.494183]
[  211.495727] cfs_rq[1]:/autogroup-1
[  211.499231]   .left_deadline                 : 0.000001
[  211.504597]   .left_vruntime                 : 0.000001
[  211.509963]   .zero_vruntime                 : 86.879963
[  211.515418]   .avg_vruntime                  : 86.879963
[  211.520873]   .right_vruntime                : 0.000001
[  211.526239]   .spread                        : 0.000000
[  211.531605]   .nr_queued                     : 0
[  211.536351]   .h_nr_runnable                 : 0
[  211.541097]   .h_nr_queued                   : 0
[  211.545842]   .h_nr_idle                     : 0
[  211.550588]   .load                          : 0
[  211.555334]   .load_avg                      : 0
[  211.560079]   .runnable_avg                  : 0
[  211.564826]   .util_avg                      : 0
[  211.569572]   .util_est                      : 0
[  211.574318]   .removed.load_avg              : 0
[  211.579063]   .removed.util_avg              : 0
[  211.583809]   .removed.runnable_avg          : 0
[  211.588555]   .tg_load_avg_contrib           : 0
[  211.593301]   .tg_load_avg                   : 1024
[  211.598313]   .se->exec_start                : 183568.815604
[  211.604123]   .se->vruntime                  : 737.068138
[  211.609667]   .se->sum_exec_runtime          : 321.946031
[  211.615210]   .se->load.weight               : 524288
[  211.620400]   .se->avg.load_avg              : 0
[  211.625146]   .se->avg.util_avg              : 0
[  211.629892]   .se->avg.runnable_avg          : 0
[  211.634636]
[  211.636179] cfs_rq[1]:/autogroup-16
[  211.639772]   .left_deadline                 : 0.000001
[  211.645137]   .left_vruntime                 : 0.000001
[  211.650504]   .zero_vruntime                 : 55.853815
[  211.655959]   .avg_vruntime                  : 55.853815
[  211.661414]   .right_vruntime                : 0.000001
[  211.666780]   .spread                        : 0.000000
[  211.672146]   .nr_queued                     : 0
[  211.676892]   .h_nr_runnable                 : 0
[  211.681637]   .h_nr_queued                   : 0
[  211.686383]   .h_nr_idle                     : 0
[  211.691129]   .load                          : 0
[  211.695875]   .load_avg                      : 0
[  211.700621]   .runnable_avg                  : 0
[  211.705367]   .util_avg                      : 0
[  211.710113]   .util_est                      : 0
[  211.714858]   .removed.load_avg              : 0
[  211.719604]   .removed.util_avg              : 0
[  211.724350]   .removed.runnable_avg          : 0
[  211.729096]   .tg_load_avg_contrib           : 0
[  211.733841]   .tg_load_avg                   : 0
[  211.738589]   .se->exec_start                : 183741.190864
[  211.744400]   .se->vruntime                  : 753.029444
[  211.749943]   .se->sum_exec_runtime          : 177.250266
[  211.755487]   .se->load.weight               : 587386
[  211.760676]   .se->avg.load_avg              : 0
[  211.765422]   .se->avg.util_avg              : 0
[  211.770168]   .se->avg.runnable_avg          : 0
[  211.774914]
[  211.776457] cfs_rq[1]:/
[  211.778973]   .left_deadline                 : 0.000001
[  211.784339]   .left_vruntime                 : 0.000001
[  211.789706]   .zero_vruntime                 : 752.783908
[  211.795249]   .avg_vruntime                  : 752.783908
[  211.800793]   .right_vruntime                : 0.000001
[  211.806158]   .spread                        : 0.000000
[  211.811524]   .nr_queued                     : 0
[  211.816270]   .h_nr_runnable                 : 0
[  211.821015]   .h_nr_queued                   : 0
[  211.825761]   .h_nr_idle                     : 0
[  211.830508]   .load                          : 0
[  211.835253]   .load_avg                      : 0
[  211.839999]   .runnable_avg                  : 0
[  211.844745]   .util_avg                      : 0
[  211.849491]   .util_est                      : 0
[  211.854237]   .removed.load_avg              : 0
[  211.858982]   .removed.util_avg              : 0
[  211.863728]   .removed.runnable_avg          : 0
[  211.868474]   .tg_load_avg_contrib           : 0
[  211.873220]   .tg_load_avg                   : 0
[  211.877965]
[  211.879508] rt_rq[1]:
[  211.881848]   .rt_nr_running                 : 0
[  211.886594]
[  211.888137] dl_rq[1]:
[  211.890478]   .dl_nr_running                 : 0
[  211.895223]   .dl_bw->bw                     : 996147
[  211.900413]   .dl_bw->total_bw               : 419424
[  211.905602]
[  211.907145] runnable tasks:
[  211.910017]  S            task   PID       vruntime   eligible    deadline             slice          sum-exec      switches  prio         wait-time        sum-sleep       sum-block  node   group-id  group-path
[  211.929182] -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[  211.947715]  S         cpuhp/1    20        57.093615   E          59.890229           2.800000         0.082604        12     120         0.000000         0.000000         0.000000   0      0        /
[  211.966076]  S     migration/1    21        34.034137   E          34.733356           0.700000         2.368280         7       0         0.000000         0.000000         0.000000   0      0        /
[  211.984439]  S     ksoftirqd/1    22       752.785366   E         755.583908           2.800000         2.053693        52     120         0.000000         0.000000         0.000000   0      0        /
[  212.002800]  I     kworker/1:0    23       431.852811   E         434.648592           2.800000         0.144376        16     120         0.000000         0.000000         0.000000   0      0        /
[  212.021162]  I    kworker/1:0H    24        26.977076   E          27.009360           2.800000         0.007136         5     100         0.000000         0.000000         0.000000   0      0        /
[  212.039524]  I kworker/R-blkcg    68        -1.015861   E           0.983566           2.800000         0.005938         2     100         0.000000         0.000000         0.000000   0      0        /
[  212.057886]  I     kworker/1:1    83        60.825134   E          63.624509           2.800000         0.087917        48     120         0.000000         0.000000         0.000000   0      0        /
[  212.076248]  I    kworker/1:1H    89        26.977103   E          27.009372           2.800000         0.007500         2     100         0.000000         0.000000         0.000000   0      0        /
[  212.094611]  D   kworker/u33:4    92       440.346676   E         443.142874           2.800000       292.880205       377     120         0.000000         0.000000         0.000000   0      0        /
[  212.112973]  D   kworker/u33:7    95       440.342874   E         443.142874           2.800000       292.860364       190     120         0.000000         0.000000         0.000000   0      0        /
[  212.131334]  I     kworker/1:2    99       736.789702   E         739.586889           2.800000         0.112449        25     120         0.000000         0.000000         0.000000   0      0        /
[  212.149695]  I     kworker/1:3   100       752.783908   E         755.583908           2.800000        24.366254       281     120         0.000000         0.000000         0.000000   0      0        /
[  212.168057]  I     kworker/1:4   112        63.533357   E          66.329972           2.800000         0.040781         4     120         0.000000         0.000000         0.000000   0      0        /
[  212.186418]  I     kworker/1:5   113        63.537160   E          66.332316           2.800000         0.038282         2     120         0.000000         0.000000         0.000000   0      0        /
[  212.204779]  I   kworker/R-mld   116        79.364726   E          79.397007           2.800000         0.037813         2     100         0.000000         0.000000         0.000000   0      0        /
[  212.223141]  D   systemd-udevd   195        55.853919   E          58.653815           2.800000        11.216315       239     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  212.242578]  S          dhcpcd   291         0.717691   E           0.351424           2.800000         0.330885         1     120         0.000000         0.000000         0.000000   0      0        /autogroup-29
[  212.262015]  S       tqftpserv   297         0.444983   E           0.245122           2.800000         0.709895         1     120         0.000000         0.000000         0.000000   0      0        /autogroup-34
[  212.281451]  S   systemd-udevd   330        55.991210   E          58.653815           2.800000        13.011253        67     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  212.300887]  S   systemd-udevd   339        55.813710   E          58.600845           2.800000         5.404845        36     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  212.320322]  S   systemd-udevd   340        55.873971   E          58.653815           2.800000         7.184593        53     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  212.339757]  I  kworker/u33:11   348       752.754783   E         755.538013           2.800000         0.027396         6     120         0.000000         0.000000         0.000000   0      0        /
[  212.358119]  I  kworker/u33:13   350       752.746814   E         755.538013           2.800000         0.011406         3     120         0.000000         0.000000         0.000000   0      0        /
[  212.376480]
[  212.378023] cpu#2
[  212.380008]   .nr_running                    : 0
[  212.384754]   .nr_switches                   : 11219
[  212.389854]   .nr_uninterruptible            : 35
[  212.394688]   .next_balance                  : 4294.944259
[  212.400320]   .curr->pid                     : 0
[  212.405065]   .clock                         : 212277.153199
[  212.410876]   .clock_task                    : 212212.756982
[  212.416687]   .avg_idle                      : 1000000
[  212.421964]   .max_idle_balance_cost         : 500000
[  212.427154]
[  212.428697] rt_rq[2]:
[  212.431038]   .rt_nr_running                 : 0
[  212.435784]
[  212.437326] dl_rq[2]:
[  212.439667]   .dl_nr_running                 : 0
[  212.444413]   .dl_bw->bw                     : 996147
[  212.449602]   .dl_bw->total_bw               : 419424
[  212.454791]
[  212.456334] runnable tasks:
[  212.459206]  S            task   PID       vruntime   eligible    deadline             slice          sum-exec      switches  prio         wait-time        sum-sleep       sum-block  node   group-id  group-path
[  212.478370] -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[  212.496903]  S         systemd     1        31.749610   E          33.659454           2.800000      1740.928788      1705     120         0.000000         0.000000         0.000000   0      0        /autogroup-1
[  212.516251]  I   kworker/u32:0    12       920.548307   E         923.346588           2.800000         0.013699         5     120         0.000000         0.000000         0.000000   0      0        /
[  212.534613]  S         cpuhp/2    25         1.279026   E           4.072411           2.800000         0.075628        12     120         0.000000         0.000000         0.000000   0      0        /
[  212.552974]  S     migration/2    26        34.092261   E          35.491584           1.400000         2.354426         6       0         0.000000         0.000000         0.000000   0      0        /
[  212.571335]  S     ksoftirqd/2    27       956.428383   E         959.228383           2.800000         1.010779        47     120         0.000000         0.000000         0.000000   0      0        /
[  212.589697]  I     kworker/2:0    28       102.432649   E         105.226296           2.800000         0.430364        63     120         0.000000         0.000000         0.000000   0      0        /
[  212.608059]  I    kworker/2:0H    29       855.038697   E         855.070927           2.800000         0.018752         6     100         0.000000         0.000000         0.000000   0      0        /
[  212.626420]  S       kdevtmpfs    57       855.041489   E         857.838625           2.800000         1.323598       289     120         0.000000         0.000000         0.000000   0      0        /
[  212.644781]  I     kworker/2:1    75       102.464378   E         105.252867           2.800000         2.340367        12     120         0.000000         0.000000         0.000000   0      0        /
[  212.663143]  S   kworker/u33:2    81       821.228796   E         824.011244           2.800000       137.203338       109     120         0.000000         0.000000         0.000000   0      0        /
[  212.681506]  I kworker/R-vfio-   101         1.272418   E           1.304708           2.800000         0.006720         2     100         0.000000         0.000000         0.000000   0      0        /
[  212.699869]  S irq/16-smp2p-ad   103         1.275067   E           2.797344           2.800000         0.045832         2      49         0.000000         0.000000         0.000000   0      0        /
[  212.718230]  S irq/17-smp2p-cd   104         1.274859   E           2.797552           2.800000         0.041927         2      49         0.000000         0.000000         0.000000   0      0        /
[  212.736591]  S irq/18-smp2p-mo   105         1.274911   E           2.797500           2.800000         0.041511         2      49         0.000000         0.000000         0.000000   0      0        /
[  212.754953]  I    kworker/2:1H   115        20.015365   E          20.047634           2.800000         0.040312         2     100         0.000000         0.000000         0.000000   0      0        /
[  212.773315]  I   kworker/u32:1   118       920.561171   E         923.338515           2.800000         0.312548       298     120         0.000000         0.000000         0.000000   0      0        /
[  212.791677]  I     kworker/2:2   138       957.424946   E         960.224061           2.800000        81.302502       231     120         0.000000         0.000000         0.000000   0      0        /
[  212.810038]  S systemd-journal   141         0.362744   E           2.404080           2.800000       216.876741      3375     120         0.000000         0.000000         0.000000   0      0        /autogroup-6
[  212.829387]  I     kworker/2:3   157       825.700663   E         828.498267           2.800000         0.130315        25     120         0.000000         0.000000         0.000000   0      0        /
[  212.847749]  I     kworker/2:4   158       102.457299   E         105.255268           2.800000         0.039687         3     120         0.000000         0.000000         0.000000   0      0        /
[  212.866110]  I     kworker/2:5   159       825.631304   E         828.426773           2.800000         0.063908         7     120         0.000000         0.000000         0.000000   0      0        /
[  212.884472]  D   systemd-udevd   178       122.135273   E         124.927304           2.800000        63.643808       341     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  212.903908]  D   systemd-udevd   186       122.135600   E         124.934350           2.800000        82.518337       371     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  212.923343]  D   systemd-udevd   203       122.132129   E         124.930827           2.800000        35.183179       241     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  212.942778]  S irq/146-temp-al   215       818.739682   E           2.794948           2.800000         0.012812         2      49         0.000000         0.000000         0.000000   0      0        /
[  212.961140]  I   kworker/u34:5   247       849.049773   E         851.849357           2.800000         0.038957         2     120         0.000000         0.000000         0.000000   0      0        /
[  212.979501]  S         qrtr-ns   293         0.407482   E           0.235487           2.800000         0.757031         1     120         0.000000         0.000000         0.000000   0      0        /autogroup-30
[  212.998938]  S systemd-userwor   316        -1.014305   E           1.751424           2.800000         2.327502         9     120         0.000000         0.000000         0.000000   0      0        /autogroup-50
[  213.018375]  S              sh   320         0.831284   E           1.751424           2.800000     17330.213988       414     120         0.000000         0.000000         0.000000   0      0        /autogroup-49
[  213.037811]  S   systemd-udevd   333       122.080749   E         124.865958           2.800000         8.037757        48     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  213.057247]  S   systemd-udevd   344       122.087573   E         124.868458           2.800000         7.083646        37     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  213.076684]
[  213.078227] cpu#3
[  213.080212]   .nr_running                    : 0
[  213.084958]   .nr_switches                   : 3274
[  213.089969]   .nr_uninterruptible            : 36
[  213.094803]   .next_balance                  : 4294.941707
[  213.100435]   .curr->pid                     : 0
[  213.105181]   .clock                         : 212789.152888
[  213.110992]   .clock_task                    : 212750.735304
[  213.116802]   .avg_idle                      : 1000000
[  213.122080]   .max_idle_balance_cost         : 500000
[  213.127270]
[  213.128813] cfs_rq[3]:/autogroup-50
[  213.132406]   .left_deadline                 : 0.000001
[  213.137772]   .left_vruntime                 : 0.000001
[  213.143138]   .zero_vruntime                 : -1.048576
[  213.148593]   .avg_vruntime                  : -1.048576
[  213.154049]   .right_vruntime                : 0.000001
[  213.159415]   .spread                        : 0.000000
[  213.164780]   .nr_queued                     : 0
[  213.169526]   .h_nr_runnable                 : 0
[  213.174272]   .h_nr_queued                   : 0
[  213.179018]   .h_nr_idle                     : 0
[  213.183765]   .load                          : 0
[  213.188511]   .load_avg                      : 0
[  213.193257]   .runnable_avg                  : 0
[  213.198003]   .util_avg                      : 0
[  213.202749]   .util_est                      : 0
[  213.207495]   .removed.load_avg              : 0
[  213.212241]   .removed.util_avg              : 0
[  213.216987]   .removed.runnable_avg          : 0
[  213.221732]   .tg_load_avg_contrib           : 0
[  213.226479]   .tg_load_avg                   : 0
[  213.231227]   .se->exec_start                : 197937.048959
[  213.237037]   .se->vruntime                  : 572.410223
[  213.242581]   .se->sum_exec_runtime          : 1.771670
[  213.247947]   .se->load.weight               : 1048576
[  213.253225]   .se->avg.load_avg              : 0
[  213.257971]   .se->avg.util_avg              : 0
[  213.262716]   .se->avg.runnable_avg          : 0
[  213.267462]
[  213.269005] cfs_rq[3]:/
[  213.271522]   .left_deadline                 : 0.000001
[  213.276888]   .left_vruntime                 : 0.000001
[  213.282254]   .zero_vruntime                 : 572.375795
[  213.287798]   .avg_vruntime                  : 572.375795
[  213.293341]   .right_vruntime                : 0.000001
[  213.298707]   .spread                        : 0.000000
[  213.304073]   .nr_queued                     : 0
[  213.308819]   .h_nr_runnable                 : 0
[  213.313565]   .h_nr_queued                   : 0
[  213.318311]   .h_nr_idle                     : 0
[  213.323057]   .load                          : 0
[  213.327803]   .load_avg                      : 0
[  213.332548]   .runnable_avg                  : 0
[  213.337294]   .util_avg                      : 0
[  213.342040]   .util_est                      : 0
[  213.346786]   .removed.load_avg              : 0
[  213.351532]   .removed.util_avg              : 0
[  213.356278]   .removed.runnable_avg          : 0
[  213.361024]   .tg_load_avg_contrib           : 0
[  213.365770]   .tg_load_avg                   : 0
[  213.370516]
[  213.372059] rt_rq[3]:
[  213.374399]   .rt_nr_running                 : 0
[  213.379145]
[  213.380688] dl_rq[3]:
[  213.383028]   .dl_nr_running                 : 0
[  213.387774]   .dl_bw->bw                     : 996147
[  213.392963]   .dl_bw->total_bw               : 419424
[  213.398152]
[  213.399695] runnable tasks:
[  213.402567]  S            task   PID       vruntime   eligible    deadline             slice          sum-exec      switches  prio         wait-time        sum-sleep       sum-block  node   group-id  group-path
[  213.421731] -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[  213.440264]  I kworker/R-rcu_g     4       273.715376   E         273.747569           2.800000         0.025417         6     100         0.000000         0.000000         0.000000   0      0        /
[  213.458625]  S rcu_exp_gp_kthr    17       549.106566   E         551.903337           2.800000        98.602187        90     120         0.000000         0.000000         0.000000   0      0        /
[  213.476988]  S         cpuhp/3    30         3.100384   E           5.894342           2.800000         0.078696        12     120         0.000000         0.000000         0.000000   0      0        /
[  213.495349]  S     migration/3    31        34.362074   E          35.761501           1.400000         2.358229         7       0         0.000000         0.000000         0.000000   0      0        /
[  213.513711]  S     ksoftirqd/3    32       571.768733   E         574.568733           2.800000         0.071928        21     120         0.000000         0.000000         0.000000   0      0        /
[  213.532073]  I     kworker/3:0    33       283.078716   E         285.872726           2.800000         0.071092        14     120         0.000000         0.000000         0.000000   0      0        /
[  213.550435]  I    kworker/3:0H    34        36.221506   E          36.253737           2.800000         0.013125         5     100         0.000000         0.000000         0.000000   0      0        /
[  213.568797]  I kworker/R-inet_    58        -1.020911   E           0.988619           2.800000         0.008958         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.587159]  D   kworker/u33:1    61       502.430318   E         505.228547           2.800000      1173.444728       320     120         0.000000         0.000000         0.000000   0      0        /
[  213.605521]  S      oom_reaper    62        -1.020295   E           1.779080           2.800000         0.006406         2     120         0.000000         0.000000         0.000000   0      0        /
[  213.623882]  S            ksmd    65        -1.017735   E           7.537091           2.800000         0.007239         2     125         0.000000         0.000000         0.000000   0      0        /
[  213.642244]  I kworker/R-kbloc    67        -1.020915   E           0.988619           2.800000         0.004947         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.660606]  I kworker/R-kinte    69        -1.020916   E           0.988618           2.800000         0.004896         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.678968]  I kworker/R-tpm_d    70        -1.020915   E           0.988619           2.800000         0.005885         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.697329]  I kworker/R-ata_s    71        -1.020916   E           0.988618           2.800000         0.005052         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.715691]  I kworker/R-edac-    72        -1.020916   E           0.988619           2.800000         0.005574         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.734053]  I kworker/R-devfr    73        -1.020915   E           0.988620           2.800000         0.005624         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.752414]  S       watchdogd    74        -1.019045   E           0.375850           2.800000         0.005469         2      49         0.000000         0.000000         0.000000   0      0        /
[  213.770776]  I kworker/R-quota    76        -1.020915   E           0.988626           2.800000         0.007188         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.789137]  I kworker/R-rpcio    78        -1.020914   E           0.988624           2.800000         0.006095         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.807498]  I kworker/R-xprti    79        -1.020915   E           0.988624           2.800000         0.005833         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.825860]  S         kswapd0    80         3.095020   E           5.894342           2.800000         0.009116         3     120         0.000000         0.000000         0.000000   0      0        /
[  213.844222]  I kworker/R-nfsio    82        -1.020915   E           0.988622           2.800000         0.005989         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.862583]  S           hwrng   102       558.374900   E         561.145838           2.800000         0.494581        15     120         0.000000         0.000000         0.000000   0      0        /
[  213.880944]  I     kworker/3:1   106       572.375795   E         575.175795           2.800000        94.024160       131     120         0.000000         0.000000         0.000000   0      0        /
[  213.899306]  I     kworker/3:2   107       272.252857   E         275.049368           2.800000         0.074740         6     120         0.000000         0.000000         0.000000   0      0        /
[  213.917668]  I    kworker/3:1H   140        36.224240   E          36.256503           2.800000         0.041667         2     100         0.000000         0.000000         0.000000   0      0        /
[  213.936030]  D   systemd-udevd   179        88.167837   E          90.959920           2.800000        37.475995       325     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  213.955465]  D   systemd-udevd   183        88.160276   E          90.958974           2.800000        44.187489       538     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  213.974901]  D   systemd-udevd   187        88.164659   E          90.963252           2.800000        29.801721       456     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  213.994336]  D   systemd-udevd   201        88.156249   E          90.947343           2.800000        20.526720       321     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  214.013773]  I     kworker/3:3   214       276.583072   E         279.381249           2.800000         0.006823         2     120         0.000000         0.000000         0.000000   0      0        /
[  214.032134]  I kworker/R-scsi_   227       386.631849   E         386.664103           2.800000         2.086460         2     100         0.000000         0.000000         0.000000   0      0        /
[  214.050495]  S irq/156-temp-al   228       386.637548   E           2.794271           2.800000         0.013176         3      49         0.000000         0.000000         0.000000   0      0        /
[  214.068857]  D          dhcpcd   288         0.605225   E           3.393976           2.800000         2.099583         7     120         0.000000         0.000000         0.000000   0      0        /autogroup-29
[  214.088293]  S           login   299         0.547846   E           1.882102           2.800000         3.110313        10     120         0.000000         0.000000         0.000000   0      0        /autogroup-48
[  214.107729]  S systemd-userwor   318        -1.014148   E           1.751424           2.800000         1.771670         7     120         0.000000         0.000000         0.000000   0      0        /autogroup-50
[  214.127165]  D       mkfs.ext4   327         0.000661   E           0.351424           2.800000         1.047915         1     120         0.000000         0.000000         0.000000   0      0        /autogroup-49
[  214.146602]  S   systemd-udevd   343        88.168982   E          90.863618           2.800000         6.528592        50     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  214.166037]
[  214.167580] cpu#4
[  214.169565]   .nr_running                    : 0
[  214.174310]   .nr_switches                   : 4237
[  214.179321]   .nr_uninterruptible            : -76
[  214.184243]   .next_balance                  : 4294.941707
[  214.189876]   .curr->pid                     : 0
[  214.194622]   .clock                         : 213813.153516
[  214.200433]   .clock_task                    : 213781.472659
[  214.206243]   .avg_idle                      : 1000000
[  214.211521]   .max_idle_balance_cost         : 500000
[  214.216711]
[  214.218253] cfs_rq[4]:/
[  214.220770]   .left_deadline                 : 0.000001
[  214.226136]   .left_vruntime                 : 0.000001
[  214.231502]   .zero_vruntime                 : 305.293214
[  214.237046]   .avg_vruntime                  : 305.293214
[  214.242589]   .right_vruntime                : 0.000001
[  214.247955]   .spread                        : 0.000000
[  214.253321]   .nr_queued                     : 0
[  214.258067]   .h_nr_runnable                 : 0
[  214.262812]   .h_nr_queued                   : 0
[  214.267558]   .h_nr_idle                     : 0
[  214.272304]   .load                          : 0
[  214.277050]   .load_avg                      : 0
[  214.281796]   .runnable_avg                  : 0
[  214.286542]   .util_avg                      : 0
[  214.291288]   .util_est                      : 0
[  214.296034]   .removed.load_avg              : 0
[  214.300780]   .removed.util_avg              : 0
[  214.305525]   .removed.runnable_avg          : 0
[  214.310272]   .tg_load_avg_contrib           : 0
[  214.315017]   .tg_load_avg                   : 0
[  214.319763]
[  214.321306] rt_rq[4]:
[  214.323646]   .rt_nr_running                 : 0
[  214.328392]
[  214.329935] dl_rq[4]:
[  214.332275]   .dl_nr_running                 : 0
[  214.337021]   .dl_bw->bw                     : 996147
[  214.342211]   .dl_bw->total_bw               : 419424
[  214.347401]
[  214.348944] runnable tasks:
[  214.351816]  S            task   PID       vruntime   eligible    deadline             slice          sum-exec      switches  prio         wait-time        sum-sleep       sum-block  node   group-id  group-path
[  214.370981] -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[  214.389513]  S        kthreadd     2       305.139177   E         307.928917           2.800000         1.931201       174     120         0.000000         0.000000         0.000000   0      0        /
[  214.407876]  S         cpuhp/4    35         0.983419   E           1.810383           2.800000         0.080936        12     120         0.000000         0.000000         0.000000   0      0        /
[  214.426238]  S     migration/4    36        34.631771   E          36.731250           2.100000         2.366564         9       0         0.000000         0.000000         0.000000   0      0        /
[  214.444599]  S     ksoftirqd/4    37       304.426936   E         307.219489           2.800000         0.041197        17     120         0.000000         0.000000         0.000000   0      0        /
[  214.462961]  I     kworker/4:0    38       305.296600   E         308.093214           2.800000         7.328860        75     120         0.000000         0.000000         0.000000   0      0        /
[  214.481323]  I    kworker/4:0H    39        10.164449   E          10.196679           2.800000         0.013332         5     100         0.000000         0.000000         0.000000   0      0        /
[  214.499685]  I rcu_tasks_kthre    59        -1.019670   E           1.778612           2.800000         0.009583         2     120         0.000000         0.000000         0.000000   0      0        /
[  214.518046]  I kworker/R-write    63        -1.021381   E           0.989086           2.800000         0.005833         2     100         0.000000         0.000000         0.000000   0      0        /
[  214.536408]  I   kworker/u33:3    91       305.213065   E         307.993169           2.800000       344.402502       495     120         0.000000         0.000000         0.000000   0      0        /
[  214.554769]  I   kworker/u35:0    98       293.520217   E         293.552431           2.800000         0.353857        18     100         0.000000         0.000000         0.000000   0      0        /
[  214.573131]  I     kworker/4:1   108       304.421625   E         307.219489           2.800000         0.084009        10     120         0.000000         0.000000         0.000000   0      0        /
[  214.591491]  I     kworker/4:2   114         1.928874   E           4.723561           2.800000         1.846251         2     120         0.000000         0.000000         0.000000   0      0        /
[  214.609853]  I    kworker/4:1H   142        10.167151   E          10.199414           2.800000         0.041511         2     100         0.000000         0.000000         0.000000   0      0        /
[  214.628214]  D   systemd-udevd   172        62.508200   E          65.307263           2.800000        36.987706       586     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  214.647651]  D   systemd-udevd   175        60.530216   E          63.328966           2.800000        23.466609       220     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  214.667086]  D   systemd-udevd   193        63.872201   E          66.655378           2.800000        31.602589       282     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  214.686523]  D   systemd-udevd   199        62.773825   E          65.573044           2.800000        41.076192       237     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  214.705959]  I kworker/R-pdr_n   216       276.094947   E         276.127211           2.800000         0.009427         2     100         0.000000         0.000000         0.000000   0      0        /
[  214.724321]  D        modprobe   222       305.205122   E         307.999654           2.800000        59.809895        29     120         0.000000         0.000000         0.000000   0      0        /
[  214.742682]  I kworker/R-ufs_e   233       276.170916   E         276.203211           2.800000         0.005937         2     100         0.000000         0.000000         0.000000   0      0        /
[  214.761044]  I kworker/R-ufs_c   234       276.170914   E         276.203210           2.800000         0.004949         2     100         0.000000         0.000000         0.000000   0      0        /
[  214.779406]  I kworker/R-ufs_c   235       276.170912   E         276.203211           2.800000         0.004532         2     100         0.000000         0.000000         0.000000   0      0        /
[  214.797767]  S irq/159-dp_hs_p   237       276.173774   E           2.797135           2.800000         0.043906         2      49         0.000000         0.000000         0.000000   0      0        /
[  214.816130]  S irq/160-dm_hs_p   238       276.173773   E           2.797136           2.800000         0.042917         2      49         0.000000         0.000000         0.000000   0      0        /
[  214.834491]  S irq/161-ss_phy_   239       276.172941   E           2.797968           2.800000         0.041562         2      49         0.000000         0.000000         0.000000   0      0        /
[  214.852852]  D   kworker/u33:8   240       293.522056   E         296.320129           2.800000         0.870471        17     120         0.000000         0.000000         0.000000   0      0        /
[  214.871213]  S          dhcpcd   289        -1.047013   E           1.751424           2.800000         0.694011         6     120         0.000000         0.000000         0.000000   0      0        /autogroup-29
[  214.890650]  D        modprobe   292       305.203120   E         308.001192           2.800000         0.895002         7     120         0.000000         0.000000         0.000000   0      0        /
[  214.909012]  S systemd-userwor   317        -1.014514   E           1.751424           2.800000         2.231352         9     120         0.000000         0.000000         0.000000   0      0        /autogroup-50
[  214.928447]  S              sh   321        -1.039774   E           1.751424           2.800000         1.395940         5     120         0.000000         0.000000         0.000000   0      0        /autogroup-48
[  214.947883]  S   systemd-udevd   334        63.992357   E          66.670847           2.800000         9.740889        61     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  214.967318]  S   systemd-udevd   336        63.947462   E          66.655378           2.800000         6.986455        52     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  214.986754]
[  214.988297] cpu#5
[  214.990282]   .nr_running                    : 0
[  214.995028]   .nr_switches                   : 10690
[  215.000128]   .nr_uninterruptible            : 5
[  215.004874]   .next_balance                  : 4294.945915
[  215.010506]   .curr->pid                     : 0
[  215.015252]   .clock                         : 214837.151019
[  215.021062]   .clock_task                    : 214815.701499
[  215.026873]   .avg_idle                      : 1000000
[  215.032151]   .max_idle_balance_cost         : 500000
[  215.037340]
[  215.038883] cfs_rq[5]:/
[  215.041400]   .left_deadline                 : 0.000001
[  215.046766]   .left_vruntime                 : 0.000001
[  215.052132]   .zero_vruntime                 : 683.531916
[  215.057675]   .avg_vruntime                  : 683.531916
[  215.063219]   .right_vruntime                : 0.000001
[  215.068585]   .spread                        : 0.000000
[  215.073951]   .nr_queued                     : 0
[  215.078697]   .h_nr_runnable                 : 0
[  215.083442]   .h_nr_queued                   : 0
[  215.088188]   .h_nr_idle                     : 0
[  215.092934]   .load                          : 0
[  215.097680]   .load_avg                      : 0
[  215.102426]   .runnable_avg                  : 0
[  215.107172]   .util_avg                      : 0
[  215.111918]   .util_est                      : 0
[  215.116664]   .removed.load_avg              : 0
[  215.121410]   .removed.util_avg              : 0
[  215.126156]   .removed.runnable_avg          : 0
[  215.130902]   .tg_load_avg_contrib           : 0
[  215.135647]   .tg_load_avg                   : 0
[  215.140393]
[  215.141936] rt_rq[5]:
[  215.144277]   .rt_nr_running                 : 0
[  215.149023]
[  215.150565] dl_rq[5]:
[  215.152905]   .dl_nr_running                 : 0
[  215.157651]   .dl_bw->bw                     : 996147
[  215.162841]   .dl_bw->total_bw               : 419424
[  215.168030]
[  215.169573] runnable tasks:
[  215.172445]  S            task   PID       vruntime   eligible    deadline             slice          sum-exec      switches  prio         wait-time        sum-sleep       sum-block  node   group-id  group-path
[  215.191610] -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[  215.210143]  S pool_workqueue_     3       484.468656   E         487.261677           2.800000         0.030886         7     120         0.000000         0.000000         0.000000   0      0        /
[  215.228504]  I     rcu_preempt    15       683.535978   E         686.331916           2.800000        13.725211      4268     120         0.000000         0.000000         0.000000   0      0        /
[  215.246866]  S         cpuhp/5    40         2.729757   E           5.523819           2.800000         1.974844        12     120         0.000000         0.000000         0.000000   0      0        /
[  215.265228]  S     migration/5    41        34.902014   E          37.001493           2.100000         2.350782         7       0         0.000000         0.000000         0.000000   0      0        /
[  215.283590]  S     ksoftirqd/5    42       671.530210   E         674.330210           2.800000         0.038075        14     120         0.000000         0.000000         0.000000   0      0        /
[  215.301951]  I     kworker/5:0    43       122.416155   E         125.214488           2.800000         0.021357        11     120         0.000000         0.000000         0.000000   0      0        /
[  215.320312]  I    kworker/5:0H    44       169.146437   E         169.178571           2.800000         0.016770         4     100         0.000000         0.000000         0.000000   0      0        /
[  215.338673]  I rcu_tasks_trace    60        -1.021389   E           1.777882           2.800000         0.007030         2     120         0.000000         0.000000         0.000000   0      0        /
[  215.357034]  S      kcompactd0    64       683.532124   E         686.331916           2.800000         0.851038       421     120         0.000000         0.000000         0.000000   0      0        /
[  215.375396]  I   kworker/u33:5    93       682.679795   E         685.461774           2.800000       193.532293        68     120         0.000000         0.000000         0.000000   0      0        /
[  215.393759]  I     kworker/5:1    96       122.268903   E         125.064477           2.800000         2.386769        11     120         0.000000         0.000000         0.000000   0      0        /
[  215.412121]  I     kworker/5:2    97       122.456674   E         125.255372           2.800000         0.020833         6     120         0.000000         0.000000         0.000000   0      0        /
[  215.430482]  I     kworker/5:3   109       683.534728   E         686.331916           2.800000        87.944946       110     120         0.000000         0.000000         0.000000   0      0        /
[  215.448844]  I     kworker/5:4   110       122.466310   E         125.265112           2.800000         0.038021         3     120         0.000000         0.000000         0.000000   0      0        /
[  215.467206]  I     kworker/5:5   111       646.516062   E         649.309812           2.800000         0.060520         5     120         0.000000         0.000000         0.000000   0      0        /
[  215.485567]  I kworker/R-ipv6_   117       158.371483   E         158.403767           2.800000         0.038594         2     100         0.000000         0.000000         0.000000   0      0        /
[  215.503929]  I    kworker/5:1H   129       647.064976   E         647.097260           2.800000         0.012604         4     100         0.000000         0.000000         0.000000   0      0        /
[  215.522291]  D   systemd-udevd   202        77.403298   E          80.187413           2.800000        24.500400       269     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  215.541728]  S irq/150-temp-al   219       480.234751   E           2.798854           2.800000         0.009739         2      49         0.000000         0.000000         0.000000   0      0        /
[  215.560089]  S irq/151-temp-al   220       480.811139   E           2.799063           2.800000         0.008177         2      49         0.000000         0.000000         0.000000   0      0        /
[  215.578451]  S irq/152-temp-al   221       481.600279   E           2.798750           2.800000         0.008699         2      49         0.000000         0.000000         0.000000   0      0        /
[  215.596813]  S irq/153-temp-al   223       485.053844   E           2.798542           2.800000         0.005156         2      49         0.000000         0.000000         0.000000   0      0        /
[  215.615174]  S irq/154-temp-al   224       487.202864   E           2.796979           2.800000         1.871354         2      49         0.000000         0.000000         0.000000   0      0        /
[  215.633536]  S       scsi_eh_0   225       487.337125   E         488.732073           2.800000         0.005052         2     120         0.000000         0.000000         0.000000   0      0        /
[  215.651898]  S irq/155-temp-al   226       487.341865   E           2.798437           2.800000         0.007813         2      49         0.000000         0.000000         0.000000   0      0        /
[  215.670260]  S          dhcpcd   290         0.653473   E           0.351424           2.800000         0.395103         1     120         0.000000         0.000000         0.000000   0      0        /autogroup-29
[  215.689697]  S           login   300         0.670399   E           1.751424           2.800000         3.602135        10     120         0.000000         0.000000         0.000000   0      0        /autogroup-49
[  215.709133]  D   systemd-udevd   331        77.442570   E          80.211319           2.800000        13.044945        57     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  215.728568]  S   systemd-udevd   337        77.381684   E          80.171163           2.800000         5.415413        41     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  215.748002]  S   systemd-udevd   341        77.463975   E          80.187413           2.800000         6.335731        51     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  215.767438]  S   systemd-udevd   342        77.387413   E          80.172881           2.800000         7.900622        44     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  215.786874]  S   systemd-udevd   345        77.386944   E          80.171163           2.800000         6.371825        36     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  215.806309]  I  kworker/u33:12   349       683.548166   E         686.331916           2.800000         0.903956        15     120         0.000000         0.000000         0.000000   0      0        /
[  215.824671]
[  215.826214] cpu#6
[  215.828199]   .nr_running                    : 0
[  215.832945]   .nr_switches                   : 2693
[  215.837955]   .nr_uninterruptible            : 54
[  215.842790]   .next_balance                  : 4294.938152
[  215.848422]   .curr->pid                     : 0
[  215.853168]   .clock                         : 215349.152531
[  215.858978]   .clock_task                    : 215321.553062
[  215.864789]   .avg_idle                      : 192465
[  215.869978]   .max_idle_balance_cost         : 500000
[  215.875168]
[  215.876711] cfs_rq[6]:/autogroup-16
[  215.880304]   .left_deadline                 : 0.000001
[  215.885670]   .left_vruntime                 : 0.000001
[  215.891036]   .zero_vruntime                 : 28.382741
[  215.896490]   .avg_vruntime                  : 28.382741
[  215.901946]   .right_vruntime                : 0.000001
[  215.907311]   .spread                        : 0.000000
[  215.912677]   .nr_queued                     : 0
[  215.917423]   .h_nr_runnable                 : 0
[  215.922168]   .h_nr_queued                   : 0
[  215.926914]   .h_nr_idle                     : 0
[  215.931660]   .load                          : 0
[  215.936406]   .load_avg                      : 0
[  215.941153]   .runnable_avg                  : 0
[  215.945898]   .util_avg                      : 0
[  215.950644]   .util_est                      : 0
[  215.955390]   .removed.load_avg              : 0
[  215.960136]   .removed.util_avg              : 0
[  215.964882]   .removed.runnable_avg          : 0
[  215.969627]   .tg_load_avg_contrib           : 0
[  215.974373]   .tg_load_avg                   : 0
[  215.979119]   .se->exec_start                : 183622.494527
[  215.984930]   .se->vruntime                  : 10018.765986
[  215.990650]   .se->sum_exec_runtime          : 91.488746
[  215.996105]   .se->load.weight               : 72330
[  216.001205]   .se->avg.load_avg              : 0
[  216.005951]   .se->avg.util_avg              : 0
[  216.010698]   .se->avg.runnable_avg          : 2
[  216.015444]
[  216.016986] cfs_rq[6]:/
[  216.019503]   .left_deadline                 : 0.000001
[  216.024869]   .left_vruntime                 : 0.000001
[  216.030235]   .zero_vruntime                 : 10018.364447
[  216.035955]   .avg_vruntime                  : 10018.364447
[  216.041675]   .right_vruntime                : 0.000001
[  216.047041]   .spread                        : 0.000000
[  216.052407]   .nr_queued                     : 0
[  216.057153]   .h_nr_runnable                 : 0
[  216.061899]   .h_nr_queued                   : 0
[  216.066645]   .h_nr_idle                     : 0
[  216.071391]   .load                          : 0
[  216.076136]   .load_avg                      : 0
[  216.080883]   .runnable_avg                  : 0
[  216.085628]   .util_avg                      : 0
[  216.090374]   .util_est                      : 0
[  216.095120]   .removed.load_avg              : 0
[  216.099866]   .removed.util_avg              : 0
[  216.104613]   .removed.runnable_avg          : 0
[  216.109358]   .tg_load_avg_contrib           : 0
[  216.114105]   .tg_load_avg                   : 0
[  216.118850]
[  216.120393] rt_rq[6]:
[  216.122734]   .rt_nr_running                 : 0
[  216.127480]
[  216.129023] dl_rq[6]:
[  216.131363]   .dl_nr_running                 : 0
[  216.136108]   .dl_bw->bw                     : 996147
[  216.141298]   .dl_bw->total_bw               : 419424
[  216.146488]
[  216.148031] runnable tasks:
[  216.150903]  S            task   PID       vruntime   eligible    deadline             slice          sum-exec      switches  prio         wait-time        sum-sleep       sum-block  node   group-id  group-path
[  216.170068] -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[  216.188602]  S         cpuhp/6    45        24.263833   E          27.050083           2.800000         0.220732        12     120         0.000000         0.000000         0.000000   0      0        /
[  216.206963]  S     migration/6    46        35.172658   E          37.272085           2.100000         7.775410       184       0         0.000000         0.000000         0.000000   0      0        /
[  216.225324]  S     ksoftirqd/6    47       770.672011   E         773.472011           2.800000         0.131455        36     120         0.000000         0.000000         0.000000   0      0        /
[  216.243686]  I     kworker/6:0    48       764.505806   E         767.297107           2.800000         0.177919        48     120         0.000000         0.000000         0.000000   0      0        /
[  216.262047]  I    kworker/6:0H    49       459.307130   E         459.339198           2.800000         0.022603         5     100         0.000000         0.000000         0.000000   0      0        /
[  216.280410]  I     kworker/6:1    84       772.447180   E         775.238951           2.800000         0.092034        15     120         0.000000         0.000000         0.000000   0      0        /
[  216.298773]  D   kworker/u33:6    94       748.923509   E         751.709967           2.800000         2.818177        77     120         0.000000         0.000000         0.000000   0      0        /
[  216.317134]  I    kworker/6:1H   188       459.308293   E         459.340527           2.800000         0.017916         2     100         0.000000         0.000000         0.000000   0      0        /
[  216.335496]  I   kworker/u34:3   212       748.790332   E         751.538822           2.800000        54.821455        24     120         0.000000         0.000000         0.000000   0      0        /
[  216.353857]  S irq/148-pmic_re   217       561.512529   E           2.798333           2.800000         0.014532         2      49         0.000000         0.000000         0.000000   0      0        /
[  216.372219]  S irq/149-temp-al   218       561.514612   E           2.796250           2.800000         0.009792         2      49         0.000000         0.000000         0.000000   0      0        /
[  216.390582]  I     kworker/6:2   242       764.507036   E         767.297297           2.800000         0.875786       120     120         0.000000         0.000000         0.000000   0      0        /
[  216.408944]  I   kworker/u34:4   245       781.756863   E         784.541707           2.800000         0.290573        77     120         0.000000         0.000000         0.000000   0      0        /
[  216.427305]  I     kworker/6:3   282       764.513101   E         767.309768           2.800000         0.048906         3     120         0.000000         0.000000         0.000000   0      0        /
[  216.445667]  I     kworker/6:4   283       781.758530   E         784.541707           2.800000         4.599949        18     120         0.000000         0.000000         0.000000   0      0        /
[  216.464028]  I     kworker/6:5   284      9985.250789   E        9988.043914           2.800000         0.316093        36     120         0.000000         0.000000         0.000000   0      0        /
[  216.482391]
[  216.483933] cpu#7
[  216.485918]   .nr_running                    : 0
[  216.490664]   .nr_switches                   : 1780
[  216.495674]   .nr_uninterruptible            : 34
[  216.500509]   .next_balance                  : 4294.938152
[  216.506141]   .curr->pid                     : 0
[  216.510887]   .clock                         : 216373.152274
[  216.516698]   .clock_task                    : 216365.653557
[  216.522508]   .avg_idle                      : 228251
[  216.527697]   .max_idle_balance_cost         : 500000
[  216.532887]
[  216.534430] cfs_rq[7]:/autogroup-16
[  216.538022]   .left_deadline                 : 0.000001
[  216.543388]   .left_vruntime                 : 0.000001
[  216.548754]   .zero_vruntime                 : 38.123597
[  216.554209]   .avg_vruntime                  : 38.123597
[  216.559664]   .right_vruntime                : 0.000001
[  216.565030]   .spread                        : 0.000000
[  216.570396]   .nr_queued                     : 0
[  216.575142]   .h_nr_runnable                 : 0
[  216.579888]   .h_nr_queued                   : 0
[  216.584634]   .h_nr_idle                     : 0
[  216.589379]   .load                          : 0
[  216.594125]   .load_avg                      : 0
[  216.598871]   .runnable_avg                  : 0
[  216.603617]   .util_avg                      : 0
[  216.608363]   .util_est                      : 0
[  216.613108]   .removed.load_avg              : 0
[  216.617854]   .removed.util_avg              : 0
[  216.622600]   .removed.runnable_avg          : 0
[  216.627346]   .tg_load_avg_contrib           : 0
[  216.632091]   .tg_load_avg                   : 0
[  216.636838]   .se->exec_start                : 183643.439552
[  216.642648]   .se->vruntime                  : 712.522192
[  216.648192]   .se->sum_exec_runtime          : 86.865471
[  216.653647]   .se->load.weight               : 166111
[  216.658836]   .se->avg.load_avg              : 0
[  216.663582]   .se->avg.util_avg              : 0
[  216.668328]   .se->avg.runnable_avg          : 0
[  216.673074]
[  216.674617] cfs_rq[7]:/
[  216.677134]   .left_deadline                 : 0.000001
[  216.682499]   .left_vruntime                 : 0.000001
[  216.687865]   .zero_vruntime                 : 712.334213
[  216.693409]   .avg_vruntime                  : 712.334213
[  216.698952]   .right_vruntime                : 0.000001
[  216.704317]   .spread                        : 0.000000
[  216.709683]   .nr_queued                     : 0
[  216.714430]   .h_nr_runnable                 : 0
[  216.719175]   .h_nr_queued                   : 0
[  216.723921]   .h_nr_idle                     : 0
[  216.728667]   .load                          : 0
[  216.733413]   .load_avg                      : 0
[  216.738159]   .runnable_avg                  : 0
[  216.742905]   .util_avg                      : 0
[  216.747650]   .util_est                      : 0
[  216.752396]   .removed.load_avg              : 0
[  216.757142]   .removed.util_avg              : 0
[  216.761888]   .removed.runnable_avg          : 0
[  216.766634]   .tg_load_avg_contrib           : 0
[  216.771380]   .tg_load_avg                   : 0
[  216.776126]
[  216.777669] rt_rq[7]:
[  216.780009]   .rt_nr_running                 : 0
[  216.784755]
[  216.786298] dl_rq[7]:
[  216.788638]   .dl_nr_running                 : 0
[  216.793384]   .dl_bw->bw                     : 996147
[  216.798574]   .dl_bw->total_bw               : 419424
[  216.803763]
[  216.805306] runnable tasks:
[  216.808178]  S            task   PID       vruntime   eligible    deadline             slice          sum-exec      switches  prio         wait-time        sum-sleep       sum-block  node   group-id  group-path
[  216.827343] -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[  216.845877]  S         cpuhp/7    50       100.490796   E         103.282983           2.800000         0.140733        12     120         0.000000         0.000000         0.000000   0      0        /
[  216.864238]  S     migration/7    51        35.223017   E          37.322392           2.100000         2.408749        11       0         0.000000         0.000000         0.000000   0      0        /
[  216.882599]  S     ksoftirqd/7    52       680.287268   E         683.087268           2.800000         0.041977        14     120         0.000000         0.000000         0.000000   0      0        /
[  216.900961]  I     kworker/7:0    53       680.334056   E         683.092806           2.800000       174.550836        83     120         0.000000         0.000000         0.000000   0      0        /
[  216.919323]  I    kworker/7:0H    54       142.635127   E         142.667382           2.800000         0.012397         6     100         0.000000         0.000000         0.000000   0      0        /
[  216.937684]  I   kworker/u34:0    56       670.294271   E         673.091250           2.800000        15.124843       160     120         0.000000         0.000000         0.000000   0      0        /
[  216.956047]  S      khugepaged    66       596.097014   E         786.888148           2.800000         0.144270         6     139         0.000000         0.000000         0.000000   0      0        /
[  216.974409]  I     kworker/7:1    90       670.278426   E         673.074364           2.800000         0.025936         6     120         0.000000         0.000000         0.000000   0      0        /
[  216.992772]  I    kworker/7:1H   189       142.638268   E         142.670516           2.800000         0.014062         2     100         0.000000         0.000000         0.000000   0      0        /
[  217.011133]  D   kworker/u34:1   205       595.741638   E         598.541482           2.800000       374.005363       101     120         0.000000         0.000000         0.000000   0      0        /
[  217.029495]  D   kworker/u34:2   206       596.195650   E         598.989764           2.800000        64.802709        42     120         0.000000         0.000000         0.000000   0      0        /
[  217.047855]  I     kworker/7:2   211       405.230885   E         408.024166           2.800000         0.010469         2     120         0.000000         0.000000         0.000000   0      0        /
[  217.066217]  S irq/145-pmic_pw   213       443.163409   E           2.794428           2.800000         0.020000         2      49         0.000000         0.000000         0.000000   0      0        /
[  217.084578]  S   systemd-udevd   329        38.151097   E          40.923597           2.800000        11.475417        48     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  217.104013]  S   systemd-udevd   332        38.153336   E          40.923597           2.800000         6.923018        51     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  217.123449]  S   systemd-udevd   335        38.291774   E          40.923597           2.800000         9.868077        61     120         0.000000         0.000000         0.000000   0      0        /autogroup-16
[  217.142885]
[  217.144428] Showing busy workqueues and worker pools:
[  217.149619] workqueue events_unbound: flags=0x2
[  217.154277]   pwq 33: cpus=0-7 node=0 flags=0x4 nice=0 active=1 refcnt=2
[  217.154281]     in-flight: 55:call_usermodehelper_exec_work
[  217.154286]   pwq 33: cpus=0-7 node=0 flags=0x4 nice=0 active=1 refcnt=2
[  217.154289]     in-flight: 81:call_usermodehelper_exec_work
[  217.154296] workqueue async: flags=0x2
[  217.183358]   pwq 34: cpus=0-7 node=0 flags=0x4 nice=0 active=1 refcnt=2
[  217.183361]     in-flight: 206:async_run_entry_fn
[  217.183366] workqueue pm: flags=0x6
[  217.198675]   pwq 33: cpus=0-7 node=0 flags=0x4 nice=0 active=1 refcnt=2
[  217.198677]     in-flight: 61:pm_runtime_work
[  217.198680]   pwq 33: cpus=0-7 node=0 flags=0x4 nice=0 active=1 refcnt=2
[  217.198683]     in-flight: 92:pm_runtime_work
[  217.198686]   pwq 33: cpus=0-7 node=0 flags=0x4 nice=0 active=2 refcnt=3
[  217.198688]     in-flight: 95:pm_runtime_work ,240:pm_runtime_work
[  217.198693]   pwq 34: cpus=0-7 node=0 flags=0x4 nice=0 active=1 refcnt=2
[  217.198696]     in-flight: 205:pm_runtime_work
[  217.198702] workqueue devfreq_wq: flags=0x4000e
[  217.250766]   pwq 33: cpus=0-7 node=0 flags=0x4 nice=0 active=1 refcnt=2
[  217.250769]     in-flight: 94:devfreq_monitor
[  217.250780] pool 33: cpus=0-7 node=0 flags=0x4 nice=0 hung=0s workers=15 idle: 349 298 347 348 91 93 351 350
[  217.250789] pool 34: cpus=0-7 node=0 flags=0x4 nice=0 hung=0s workers=6 idle: 56 245 212 247
[  217.280994] systemd-journald[141]: /dev/kmsg buffer overrun, some messages lost.

[-- Attachment #3: blocked tasks.txt --]
[-- Type: text/plain, Size: 25098 bytes --]

[  274.283517] sysrq: Show Blocked State
[  274.287303] task:kworker/u33:1   state:D stack:0     pid:61    tgid:61    ppid:2      task_flags:0x4288160 flags:0x00000010
[  274.298726] Workqueue: pm pm_runtime_work
[  274.302857] Call trace:
[  274.305375]  __switch_to+0xec/0x1c0 (T)
[  274.309327]  __schedule+0x368/0xce0
[  274.312921]  schedule+0x34/0x118
[  274.316250]  schedule_timeout+0xd4/0x110
[  274.320291]  io_schedule_timeout+0x48/0x68
[  274.324505]  wait_for_completion_io+0x78/0x140
[  274.329075]  blk_execute_rq+0xbc/0x13c
[  274.332938]  scsi_execute_cmd+0x130/0x3f4
[  274.337066]  sd_sync_cache+0xe4/0x220
[  274.340839]  sd_suspend_common.isra.0+0x60/0x160
[  274.345587]  sd_suspend_runtime+0x18/0x38
[  274.349713]  scsi_runtime_suspend+0x6c/0xc0
[  274.354017]  __rpm_callback+0x48/0x1e0
[  274.357876]  rpm_callback+0x38/0x80
[  274.361469]  rpm_suspend+0x10c/0x580
[  274.365152]  pm_runtime_work+0xc8/0xcc
[  274.369011]  process_one_work+0x148/0x290
[  274.373139]  worker_thread+0x2c8/0x3e4
[  274.376998]  kthread+0x12c/0x204
[  274.380328]  ret_from_fork+0x10/0x20
[  274.384016] task:kworker/u33:4   state:D stack:0     pid:92    tgid:92    ppid:2      task_flags:0x4288060 flags:0x00000010
[  274.395437] Workqueue: pm pm_runtime_work
[  274.399565] Call trace:
[  274.402082]  __switch_to+0xec/0x1c0 (T)
[  274.406032]  __schedule+0x368/0xce0
[  274.409626]  schedule+0x34/0x118
[  274.412955]  schedule_timeout+0xd4/0x110
[  274.416994]  io_schedule_timeout+0x48/0x68
[  274.421209]  wait_for_completion_io+0x78/0x140
[  274.425779]  blk_execute_rq+0xbc/0x13c
[  274.429639]  scsi_execute_cmd+0x130/0x3f4
[  274.433766]  sd_sync_cache+0xe4/0x220
[  274.437538]  sd_suspend_common.isra.0+0x60/0x160
[  274.442286]  sd_suspend_runtime+0x18/0x38
[  274.446412]  scsi_runtime_suspend+0x6c/0xc0
[  274.450715]  __rpm_callback+0x48/0x1e0
[  274.454574]  rpm_callback+0x38/0x80
[  274.458167]  rpm_suspend+0x10c/0x580
[  274.461850]  pm_runtime_work+0xc8/0xcc
[  274.465709]  process_one_work+0x148/0x290
[  274.469835]  worker_thread+0x2c8/0x3e4
[  274.473694]  kthread+0x12c/0x204
[  274.477024]  ret_from_fork+0x10/0x20
[  274.480707] task:kworker/u33:6   state:D stack:0     pid:94    tgid:94    ppid:2      task_flags:0x4208060 flags:0x00000010
[  274.492127] Workqueue: devfreq_wq devfreq_monitor
[  274.496964] Call trace:
[  274.499481]  __switch_to+0xec/0x1c0 (T)
[  274.503431]  __schedule+0x368/0xce0
[  274.507025]  schedule+0x34/0x118
[  274.510354]  schedule_timeout+0xd4/0x110
[  274.514393]  io_schedule_timeout+0x48/0x68
[  274.518608]  wait_for_completion_io+0x78/0x140
[  274.523178]  blk_execute_rq+0xbc/0x13c
[  274.527038]  ufshcd_exec_dev_cmd+0x1e0/0x260
[  274.531431]  ufshcd_query_flag+0x158/0x1e0
[  274.535646]  ufshcd_query_flag_retry+0x4c/0xa8
[  274.540215]  ufshcd_wb_toggle+0x54/0xc0
[  274.544165]  ufshcd_devfreq_scale+0x2c0/0x448
[  274.548645]  ufshcd_devfreq_target+0xd4/0x24c
[  274.553125]  devfreq_set_target+0x90/0x184
[  274.557340]  devfreq_update_target+0xc0/0xdc
[  274.561732]  devfreq_monitor+0x34/0xa0
[  274.565591]  process_one_work+0x148/0x290
[  274.569717]  worker_thread+0x2c8/0x3e4
[  274.573576]  kthread+0x12c/0x204
[  274.576895]  ret_from_fork+0x10/0x20
[  274.580579] task:kworker/u33:7   state:D stack:0     pid:95    tgid:95    ppid:2      task_flags:0x4288060 flags:0x00000010
[  274.591999] Workqueue: pm pm_runtime_work
[  274.596125] Call trace:
[  274.598642]  __switch_to+0xec/0x1c0 (T)
[  274.602592]  __schedule+0x368/0xce0
[  274.606185]  schedule+0x34/0x118
[  274.609514]  schedule_timeout+0xd4/0x110
[  274.613554]  io_schedule_timeout+0x48/0x68
[  274.617769]  wait_for_completion_io+0x78/0x140
[  274.622339]  blk_execute_rq+0xbc/0x13c
[  274.626198]  scsi_execute_cmd+0x130/0x3f4
[  274.630326]  sd_sync_cache+0xe4/0x220
[  274.634098]  sd_suspend_common.isra.0+0x60/0x160
[  274.638845]  sd_suspend_runtime+0x18/0x38
[  274.642972]  scsi_runtime_suspend+0x6c/0xc0
[  274.647275]  __rpm_callback+0x48/0x1e0
[  274.651134]  rpm_callback+0x38/0x80
[  274.654727]  rpm_suspend+0x10c/0x580
[  274.658409]  pm_runtime_work+0xc8/0xcc
[  274.662269]  process_one_work+0x148/0x290
[  274.666395]  worker_thread+0x2c8/0x3e4
[  274.670254]  kthread+0x12c/0x204
[  274.673584]  ret_from_fork+0x10/0x20
[  274.677274] task:systemd-udevd   state:D stack:0     pid:172   tgid:172   ppid:167    task_flags:0x400140 flags:0x00000819
[  274.688604] Call trace:
[  274.691121]  __switch_to+0xec/0x1c0 (T)
[  274.695071]  __schedule+0x368/0xce0
[  274.698665]  schedule+0x34/0x118
[  274.701994]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  274.707895]  async_synchronize_full+0x78/0xa0
[  274.712376]  do_init_module+0x190/0x23c
[  274.716327]  load_module+0x1754/0x1ce0
[  274.720186]  init_module_from_file+0xdc/0x100
[  274.724667]  __arm64_sys_finit_module+0x1bc/0x330
[  274.729503]  invoke_syscall+0x48/0x104
[  274.733364]  el0_svc_common.constprop.0+0xc0/0xe0
[  274.738199]  do_el0_svc+0x1c/0x28
[  274.741615]  el0_svc+0x34/0x108
[  274.744855]  el0t_64_sync_handler+0xa0/0xf0
[  274.749159]  el0t_64_sync+0x198/0x19c
[  274.752930] task:systemd-udevd   state:D stack:0     pid:174   tgid:174   ppid:167    task_flags:0x400140 flags:0x00000819
[  274.764260] Call trace:
[  274.766777]  __switch_to+0xec/0x1c0 (T)
[  274.770728]  __schedule+0x368/0xce0
[  274.774322]  schedule+0x34/0x118
[  274.777651]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  274.783551]  async_synchronize_full+0x78/0xa0
[  274.788032]  do_init_module+0x190/0x23c
[  274.791981]  load_module+0x1754/0x1ce0
[  274.795841]  init_module_from_file+0xdc/0x100
[  274.800322]  __arm64_sys_finit_module+0x1bc/0x330
[  274.805158]  invoke_syscall+0x48/0x104
[  274.809017]  el0_svc_common.constprop.0+0xc0/0xe0
[  274.813851]  do_el0_svc+0x1c/0x28
[  274.817268]  el0_svc+0x34/0x108
[  274.820508]  el0t_64_sync_handler+0xa0/0xf0
[  274.824812]  el0t_64_sync+0x198/0x19c
[  274.828583] task:systemd-udevd   state:D stack:0     pid:175   tgid:175   ppid:167    task_flags:0x400140 flags:0x00000819
[  274.839913] Call trace:
[  274.842430]  __switch_to+0xec/0x1c0 (T)
[  274.846380]  __schedule+0x368/0xce0
[  274.849974]  schedule+0x34/0x118
[  274.853292]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  274.859193]  async_synchronize_full+0x78/0xa0
[  274.863674]  do_init_module+0x190/0x23c
[  274.867623]  load_module+0x1754/0x1ce0
[  274.871483]  init_module_from_file+0xdc/0x100
[  274.875964]  __arm64_sys_finit_module+0x1bc/0x330
[  274.880799]  invoke_syscall+0x48/0x104
[  274.884658]  el0_svc_common.constprop.0+0xc0/0xe0
[  274.889493]  do_el0_svc+0x1c/0x28
[  274.892910]  el0_svc+0x34/0x108
[  274.896149]  el0t_64_sync_handler+0xa0/0xf0
[  274.900453]  el0t_64_sync+0x198/0x19c
[  274.904225] task:systemd-udevd   state:D stack:0     pid:178   tgid:178   ppid:167    task_flags:0x400140 flags:0x00000819
[  274.915555] Call trace:
[  274.918073]  __switch_to+0xec/0x1c0 (T)
[  274.922022]  __schedule+0x368/0xce0
[  274.925616]  schedule+0x34/0x118
[  274.928945]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  274.934845]  async_synchronize_full+0x78/0xa0
[  274.939326]  do_init_module+0x190/0x23c
[  274.943275]  load_module+0x1754/0x1ce0
[  274.947135]  init_module_from_file+0xdc/0x100
[  274.951615]  __arm64_sys_finit_module+0x1bc/0x330
[  274.956451]  invoke_syscall+0x48/0x104
[  274.960310]  el0_svc_common.constprop.0+0xc0/0xe0
[  274.965145]  do_el0_svc+0x1c/0x28
[  274.968562]  el0_svc+0x34/0x108
[  274.971801]  el0t_64_sync_handler+0xa0/0xf0
[  274.976105]  el0t_64_sync+0x198/0x19c
[  274.979877] task:systemd-udevd   state:D stack:0     pid:179   tgid:179   ppid:167    task_flags:0x400140 flags:0x00000819
[  274.991207] Call trace:
[  274.993724]  __switch_to+0xec/0x1c0 (T)
[  274.997674]  __schedule+0x368/0xce0
[  275.001267]  schedule+0x34/0x118
[  275.004596]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  275.010497]  async_synchronize_full+0x78/0xa0
[  275.014978]  do_init_module+0x190/0x23c
[  275.018927]  load_module+0x1754/0x1ce0
[  275.022786]  init_module_from_file+0xdc/0x100
[  275.027267]  __arm64_sys_finit_module+0x1bc/0x330
[  275.032103]  invoke_syscall+0x48/0x104
[  275.035961]  el0_svc_common.constprop.0+0xc0/0xe0
[  275.040796]  do_el0_svc+0x1c/0x28
[  275.044213]  el0_svc+0x34/0x108
[  275.047452]  el0t_64_sync_handler+0xa0/0xf0
[  275.051756]  el0t_64_sync+0x198/0x19c
[  275.055529] task:systemd-udevd   state:D stack:0     pid:183   tgid:183   ppid:167    task_flags:0x400140 flags:0x00000819
[  275.066858] Call trace:
[  275.069375]  __switch_to+0xec/0x1c0 (T)
[  275.073325]  __schedule+0x368/0xce0
[  275.076918]  schedule+0x34/0x118
[  275.080247]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  275.086148]  async_synchronize_full+0x78/0xa0
[  275.090629]  do_init_module+0x190/0x23c
[  275.094578]  load_module+0x1754/0x1ce0
[  275.098437]  init_module_from_file+0xdc/0x100
[  275.102918]  __arm64_sys_finit_module+0x1bc/0x330
[  275.107754]  invoke_syscall+0x48/0x104
[  275.111613]  el0_svc_common.constprop.0+0xc0/0xe0
[  275.116448]  do_el0_svc+0x1c/0x28
[  275.119865]  el0_svc+0x34/0x108
[  275.123104]  el0t_64_sync_handler+0xa0/0xf0
[  275.127408]  el0t_64_sync+0x198/0x19c
[  275.131180] task:systemd-udevd   state:D stack:0     pid:186   tgid:186   ppid:167    task_flags:0x400140 flags:0x00000819
[  275.142509] Call trace:
[  275.145026]  __switch_to+0xec/0x1c0 (T)
[  275.148976]  __schedule+0x368/0xce0
[  275.152570]  schedule+0x34/0x118
[  275.155899]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  275.161800]  async_synchronize_full+0x78/0xa0
[  275.166281]  do_init_module+0x190/0x23c
[  275.170230]  load_module+0x1754/0x1ce0
[  275.174090]  init_module_from_file+0xdc/0x100
[  275.178570]  __arm64_sys_finit_module+0x1bc/0x330
[  275.183406]  invoke_syscall+0x48/0x104
[  275.187264]  el0_svc_common.constprop.0+0xc0/0xe0
[  275.192099]  do_el0_svc+0x1c/0x28
[  275.195516]  el0_svc+0x34/0x108
[  275.198756]  el0t_64_sync_handler+0xa0/0xf0
[  275.203060]  el0t_64_sync+0x198/0x19c
[  275.206832] task:systemd-udevd   state:D stack:0     pid:187   tgid:187   ppid:167    task_flags:0x400140 flags:0x00000819
[  275.218161] Call trace:
[  275.220678]  __switch_to+0xec/0x1c0 (T)
[  275.224628]  __schedule+0x368/0xce0
[  275.228222]  schedule+0x34/0x118
[  275.231551]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  275.237452]  async_synchronize_full+0x78/0xa0
[  275.241933]  do_init_module+0x190/0x23c
[  275.245881]  load_module+0x1754/0x1ce0
[  275.249741]  init_module_from_file+0xdc/0x100
[  275.254222]  __arm64_sys_finit_module+0x1bc/0x330
[  275.259058]  invoke_syscall+0x48/0x104
[  275.262916]  el0_svc_common.constprop.0+0xc0/0xe0
[  275.267751]  do_el0_svc+0x1c/0x28
[  275.271168]  el0_svc+0x34/0x108
[  275.274407]  el0t_64_sync_handler+0xa0/0xf0
[  275.278711]  el0t_64_sync+0x198/0x19c
[  275.282484] task:systemd-udevd   state:D stack:0     pid:193   tgid:193   ppid:167    task_flags:0x400140 flags:0x00000819
[  275.293814] Call trace:
[  275.296331]  __switch_to+0xec/0x1c0 (T)
[  275.300280]  __schedule+0x368/0xce0
[  275.303874]  schedule+0x34/0x118
[  275.307203]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  275.313104]  async_synchronize_full+0x78/0xa0
[  275.317584]  do_init_module+0x190/0x23c
[  275.321533]  load_module+0x1754/0x1ce0
[  275.325393]  init_module_from_file+0xdc/0x100
[  275.329874]  __arm64_sys_finit_module+0x1bc/0x330
[  275.334710]  invoke_syscall+0x48/0x104
[  275.338569]  el0_svc_common.constprop.0+0xc0/0xe0
[  275.343404]  do_el0_svc+0x1c/0x28
[  275.346820]  el0_svc+0x34/0x108
[  275.350060]  el0t_64_sync_handler+0xa0/0xf0
[  275.354364]  el0t_64_sync+0x198/0x19c
[  275.358135] task:systemd-udevd   state:D stack:0     pid:195   tgid:195   ppid:167    task_flags:0x400140 flags:0x00000819
[  275.369465] Call trace:
[  275.371981]  __switch_to+0xec/0x1c0 (T)
[  275.375931]  __schedule+0x368/0xce0
[  275.379525]  schedule+0x34/0x118
[  275.382843]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  275.388744]  async_synchronize_full+0x78/0xa0
[  275.393225]  do_init_module+0x190/0x23c
[  275.397173]  load_module+0x1754/0x1ce0
[  275.401033]  init_module_from_file+0xdc/0x100
[  275.405514]  __arm64_sys_finit_module+0x1bc/0x330
[  275.410351]  invoke_syscall+0x48/0x104
[  275.414209]  el0_svc_common.constprop.0+0xc0/0xe0
[  275.419044]  do_el0_svc+0x1c/0x28
[  275.422461]  el0_svc+0x34/0x108
[  275.425700]  el0t_64_sync_handler+0xa0/0xf0
[  275.430004]  el0t_64_sync+0x198/0x19c
[  275.433776] task:systemd-udevd   state:D stack:0     pid:199   tgid:199   ppid:167    task_flags:0x400140 flags:0x00000819
[  275.445105] Call trace:
[  275.447622]  __switch_to+0xec/0x1c0 (T)
[  275.451572]  __schedule+0x368/0xce0
[  275.455166]  schedule+0x34/0x118
[  275.458494]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  275.464395]  async_synchronize_full+0x78/0xa0
[  275.468876]  do_init_module+0x190/0x23c
[  275.472825]  load_module+0x1754/0x1ce0
[  275.476685]  init_module_from_file+0xdc/0x100
[  275.481166]  __arm64_sys_finit_module+0x1bc/0x330
[  275.486002]  invoke_syscall+0x48/0x104
[  275.489861]  el0_svc_common.constprop.0+0xc0/0xe0
[  275.494696]  do_el0_svc+0x1c/0x28
[  275.498113]  el0_svc+0x34/0x108
[  275.501352]  el0t_64_sync_handler+0xa0/0xf0
[  275.505656]  el0t_64_sync+0x198/0x19c
[  275.509428] task:systemd-udevd   state:D stack:0     pid:200   tgid:200   ppid:167    task_flags:0x400140 flags:0x00000819
[  275.520757] Call trace:
[  275.523274]  __switch_to+0xec/0x1c0 (T)
[  275.527224]  __schedule+0x368/0xce0
[  275.530818]  schedule+0x34/0x118
[  275.534136]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  275.540037]  async_synchronize_full+0x78/0xa0
[  275.544518]  do_init_module+0x190/0x23c
[  275.548467]  load_module+0x1754/0x1ce0
[  275.552327]  init_module_from_file+0xdc/0x100
[  275.556808]  __arm64_sys_finit_module+0x1bc/0x330
[  275.561644]  invoke_syscall+0x48/0x104
[  275.565502]  el0_svc_common.constprop.0+0xc0/0xe0
[  275.570338]  do_el0_svc+0x1c/0x28
[  275.573754]  el0_svc+0x34/0x108
[  275.576993]  el0t_64_sync_handler+0xa0/0xf0
[  275.581297]  el0t_64_sync+0x198/0x19c
[  275.585069] task:systemd-udevd   state:D stack:0     pid:201   tgid:201   ppid:167    task_flags:0x400140 flags:0x00000819
[  275.596399] Call trace:
[  275.598916]  __switch_to+0xec/0x1c0 (T)
[  275.602866]  __schedule+0x368/0xce0
[  275.606459]  schedule+0x34/0x118
[  275.609789]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  275.615690]  async_synchronize_full+0x78/0xa0
[  275.620171]  do_init_module+0x190/0x23c
[  275.624120]  load_module+0x1754/0x1ce0
[  275.627980]  init_module_from_file+0xdc/0x100
[  275.632460]  __arm64_sys_finit_module+0x1bc/0x330
[  275.637296]  invoke_syscall+0x48/0x104
[  275.641155]  el0_svc_common.constprop.0+0xc0/0xe0
[  275.645990]  do_el0_svc+0x1c/0x28
[  275.649406]  el0_svc+0x34/0x108
[  275.652646]  el0t_64_sync_handler+0xa0/0xf0
[  275.656950]  el0t_64_sync+0x198/0x19c
[  275.660722] task:systemd-udevd   state:D stack:0     pid:202   tgid:202   ppid:167    task_flags:0x400140 flags:0x00000819
[  275.672051] Call trace:
[  275.674568]  __switch_to+0xec/0x1c0 (T)
[  275.678518]  __schedule+0x368/0xce0
[  275.682112]  schedule+0x34/0x118
[  275.685430]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  275.691330]  async_synchronize_full+0x78/0xa0
[  275.695811]  do_init_module+0x190/0x23c
[  275.699761]  load_module+0x1754/0x1ce0
[  275.703621]  init_module_from_file+0xdc/0x100
[  275.708102]  __arm64_sys_finit_module+0x1bc/0x330
[  275.712938]  invoke_syscall+0x48/0x104
[  275.716796]  el0_svc_common.constprop.0+0xc0/0xe0
[  275.721631]  do_el0_svc+0x1c/0x28
[  275.725048]  el0_svc+0x34/0x108
[  275.728287]  el0t_64_sync_handler+0xa0/0xf0
[  275.732591]  el0t_64_sync+0x198/0x19c
[  275.736364] task:systemd-udevd   state:D stack:0     pid:203   tgid:203   ppid:167    task_flags:0x400140 flags:0x00000819
[  275.747693] Call trace:
[  275.750210]  __switch_to+0xec/0x1c0 (T)
[  275.754160]  __schedule+0x368/0xce0
[  275.757753]  schedule+0x34/0x118
[  275.761071]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  275.766973]  async_synchronize_full+0x78/0xa0
[  275.771453]  do_init_module+0x190/0x23c
[  275.775402]  load_module+0x1754/0x1ce0
[  275.779261]  init_module_from_file+0xdc/0x100
[  275.783742]  __arm64_sys_finit_module+0x1bc/0x330
[  275.788578]  invoke_syscall+0x48/0x104
[  275.792437]  el0_svc_common.constprop.0+0xc0/0xe0
[  275.797272]  do_el0_svc+0x1c/0x28
[  275.800688]  el0_svc+0x34/0x108
[  275.803928]  el0t_64_sync_handler+0xa0/0xf0
[  275.808232]  el0t_64_sync+0x198/0x19c
[  275.812004] task:kworker/u34:1   state:D stack:0     pid:205   tgid:205   ppid:2      task_flags:0x4288060 flags:0x00000010
[  275.823425] Workqueue: pm pm_runtime_work
[  275.827552] Call trace:
[  275.830068]  __switch_to+0xec/0x1c0 (T)
[  275.834018]  __schedule+0x368/0xce0
[  275.837612]  schedule+0x34/0x118
[  275.840941]  schedule_timeout+0xd4/0x110
[  275.844980]  io_schedule_timeout+0x48/0x68
[  275.849194]  wait_for_completion_io+0x78/0x140
[  275.853764]  blk_execute_rq+0xbc/0x13c
[  275.857625]  scsi_execute_cmd+0x130/0x3f4
[  275.861752]  sd_sync_cache+0xe4/0x220
[  275.865524]  sd_suspend_common.isra.0+0x60/0x160
[  275.870272]  sd_suspend_runtime+0x18/0x38
[  275.874398]  scsi_runtime_suspend+0x6c/0xc0
[  275.878701]  __rpm_callback+0x48/0x1e0
[  275.882560]  rpm_callback+0x38/0x80
[  275.886153]  rpm_suspend+0x10c/0x580
[  275.889835]  pm_runtime_work+0xc8/0xcc
[  275.893694]  process_one_work+0x148/0x290
[  275.897820]  worker_thread+0x2c8/0x3e4
[  275.901679]  kthread+0x12c/0x204
[  275.905009]  ret_from_fork+0x10/0x20
[  275.908693] task:kworker/u34:2   state:D stack:0     pid:206   tgid:206   ppid:2      task_flags:0x4208060 flags:0x00000010
[  275.920114] Workqueue: async async_run_entry_fn
[  275.924773] Call trace:
[  275.927290]  __switch_to+0xec/0x1c0 (T)
[  275.931240]  __schedule+0x368/0xce0
[  275.934834]  schedule+0x34/0x118
[  275.938153]  schedule_timeout+0xd4/0x110
[  275.942192]  io_schedule_timeout+0x48/0x68
[  275.946406]  wait_for_completion_io+0x78/0x140
[  275.950977]  blk_execute_rq+0xbc/0x13c
[  275.954837]  scsi_execute_cmd+0x130/0x3f4
[  275.958965]  scsi_mode_sense+0x15c/0x330
[  275.963004]  sd_revalidate_disk+0xb80/0x2238
[  275.967396]  sd_probe+0x298/0x430
[  275.970814]  really_probe+0xbc/0x2c0
[  275.974497]  __driver_probe_device+0x78/0x120
[  275.978977]  driver_probe_device+0x3c/0x154
[  275.983280]  __device_attach_driver+0xb8/0x140
[  275.987850]  bus_for_each_drv+0x88/0xe8
[  275.991801]  __device_attach_async_helper+0xb4/0xd8
[  275.996813]  async_run_entry_fn+0x34/0xe0
[  276.000939]  process_one_work+0x148/0x290
[  276.005065]  worker_thread+0x2c8/0x3e4
[  276.008924]  kthread+0x12c/0x204
[  276.012254]  ret_from_fork+0x10/0x20
[  276.015941] task:modprobe        state:D stack:0     pid:222   tgid:222   ppid:81     task_flags:0x400100 flags:0x00000018
[  276.027271] Call trace:
[  276.029788]  __switch_to+0xec/0x1c0 (T)
[  276.033738]  __schedule+0x368/0xce0
[  276.037332]  schedule+0x34/0x118
[  276.040650]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  276.046551]  async_synchronize_full+0x78/0xa0
[  276.051032]  do_init_module+0x190/0x23c
[  276.054980]  load_module+0x1754/0x1ce0
[  276.058840]  init_module_from_file+0xdc/0x100
[  276.063320]  __arm64_sys_finit_module+0x1bc/0x330
[  276.068156]  invoke_syscall+0x48/0x104
[  276.072015]  el0_svc_common.constprop.0+0x40/0xe0
[  276.076850]  do_el0_svc+0x1c/0x28
[  276.080267]  el0_svc+0x34/0x108
[  276.083507]  el0t_64_sync_handler+0xa0/0xf0
[  276.087810]  el0t_64_sync+0x198/0x19c
[  276.091583] task:kworker/u33:8   state:D stack:0     pid:240   tgid:240   ppid:2      task_flags:0x4288060 flags:0x00000010
[  276.103003] Workqueue: pm pm_runtime_work
[  276.107130] Call trace:
[  276.109647]  __switch_to+0xec/0x1c0 (T)
[  276.113597]  __schedule+0x368/0xce0
[  276.117191]  schedule+0x34/0x118
[  276.120520]  schedule_timeout+0xd4/0x110
[  276.124559]  io_schedule_timeout+0x48/0x68
[  276.128774]  wait_for_completion_io+0x78/0x140
[  276.133344]  blk_execute_rq+0xbc/0x13c
[  276.137204]  scsi_execute_cmd+0x130/0x3f4
[  276.141331]  sd_sync_cache+0xe4/0x220
[  276.145103]  sd_suspend_common.isra.0+0x60/0x160
[  276.149850]  sd_suspend_runtime+0x18/0x38
[  276.153977]  scsi_runtime_suspend+0x6c/0xc0
[  276.158280]  __rpm_callback+0x48/0x1e0
[  276.162139]  rpm_callback+0x38/0x80
[  276.165732]  rpm_suspend+0x10c/0x580
[  276.169415]  pm_runtime_work+0xc8/0xcc
[  276.173274]  process_one_work+0x148/0x290
[  276.177401]  worker_thread+0x2c8/0x3e4
[  276.181260]  kthread+0x12c/0x204
[  276.184579]  ret_from_fork+0x10/0x20
[  276.188265] task:dhcpcd          state:D stack:0     pid:288   tgid:288   ppid:1      task_flags:0x400100 flags:0x00000800
[  276.199594] Call trace:
[  276.202111]  __switch_to+0xec/0x1c0 (T)
[  276.206061]  __schedule+0x368/0xce0
[  276.209655]  schedule+0x34/0x118
[  276.212984]  schedule_timeout+0xd4/0x110
[  276.217023]  wait_for_completion_state+0x104/0x200
[  276.221947]  call_usermodehelper_exec+0x1bc/0x230
[  276.226784]  __request_module+0x188/0x220
[  276.230910]  sock_ioctl+0x350/0x360
[  276.234505]  __arm64_sys_ioctl+0xac/0x104
[  276.238634]  invoke_syscall+0x48/0x104
[  276.242492]  el0_svc_common.constprop.0+0xc0/0xe0
[  276.247327]  do_el0_svc+0x1c/0x28
[  276.250744]  el0_svc+0x34/0x108
[  276.253984]  el0t_64_sync_handler+0xa0/0xf0
[  276.258288]  el0t_64_sync+0x198/0x19c
[  276.262059] task:modprobe        state:D stack:0     pid:292   tgid:292   ppid:55     task_flags:0x400100 flags:0x00000018
[  276.273389] Call trace:
[  276.275906]  __switch_to+0xec/0x1c0 (T)
[  276.279855]  __schedule+0x368/0xce0
[  276.283449]  schedule+0x34/0x118
[  276.286778]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  276.292678]  async_synchronize_full+0x78/0xa0
[  276.297159]  do_init_module+0x190/0x23c
[  276.301108]  load_module+0x1754/0x1ce0
[  276.304968]  init_module_from_file+0xdc/0x100
[  276.309449]  __arm64_sys_finit_module+0x1bc/0x330
[  276.314284]  invoke_syscall+0x48/0x104
[  276.318143]  el0_svc_common.constprop.0+0x40/0xe0
[  276.322978]  do_el0_svc+0x1c/0x28
[  276.326394]  el0_svc+0x34/0x108
[  276.329634]  el0t_64_sync_handler+0xa0/0xf0
[  276.333938]  el0t_64_sync+0x198/0x19c
[  276.337711] task:mkfs.ext4       state:D stack:0     pid:327   tgid:327   ppid:320    task_flags:0x440100 flags:0x00000000
[  276.349040] Call trace:
[  276.351557]  __switch_to+0xec/0x1c0 (T)
[  276.355507]  __schedule+0x368/0xce0
[  276.359100]  schedule+0x34/0x118
[  276.362429]  __bio_queue_enter+0x19c/0x298
[  276.366646]  blk_mq_submit_bio+0x3d0/0x70c
[  276.370860]  __submit_bio+0x68/0x254
[  276.374542]  submit_bio_noacct_nocheck+0x1b8/0x264
[  276.379466]  submit_bio_noacct+0x1a0/0x2e8
[  276.383680]  submit_bio+0xa4/0x1f4
[  276.387185]  mpage_readahead+0x124/0x184
[  276.391225]  blkdev_readahead+0x18/0x24
[  276.395174]  read_pages+0x98/0x2a0
[  276.398681]  page_cache_ra_unbounded+0x180/0x260
[  276.403429]  force_page_cache_ra+0xa8/0xd0
[  276.407643]  page_cache_sync_ra+0x40/0x258
[  276.411858]  filemap_get_pages+0x104/0x728
[  276.416075]  filemap_read+0xe8/0x3dc
[  276.419760]  blkdev_read_iter+0x84/0x198
[  276.423798]  vfs_read+0x230/0x31c
[  276.427218]  ksys_read+0x70/0x110
[  276.430636]  __arm64_sys_read+0x1c/0x28
[  276.434586]  invoke_syscall+0x48/0x104
[  276.438445]  el0_svc_common.constprop.0+0x40/0xe0
[  276.443280]  do_el0_svc+0x1c/0x28
[  276.446697]  el0_svc+0x34/0x108
[  276.449936]  el0t_64_sync_handler+0xa0/0xf0
[  276.454240]  el0t_64_sync+0x198/0x19c
[  276.458013] task:systemd-udevd   state:D stack:0     pid:331   tgid:331   ppid:167    task_flags:0x400140 flags:0x00000818
[  276.469342] Call trace:
[  276.471859]  __switch_to+0xec/0x1c0 (T)
[  276.475809]  __schedule+0x368/0xce0
[  276.479403]  schedule+0x34/0x118
[  276.482721]  async_synchronize_cookie_domain.part.0+0x64/0xd8
[  276.488622]  async_synchronize_full+0x78/0xa0
[  276.493103]  do_init_module+0x190/0x23c
[  276.497053]  load_module+0x1754/0x1ce0
[  276.500913]  init_module_from_file+0xdc/0x100
[  276.505393]  __arm64_sys_finit_module+0x1bc/0x330
[  276.510229]  invoke_syscall+0x48/0x104
[  276.514087]  el0_svc_common.constprop.0+0xc0/0xe0
[  276.518922]  do_el0_svc+0x1c/0x28
[  276.522339]  el0_svc+0x34/0x108
[  276.525579]  el0t_64_sync_handler+0xa0/0xf0
[  276.529883]  el0t_64_sync+0x198/0x19c

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-03 16:47                       ` Nitin Rawat
@ 2025-12-03 18:27                         ` Bart Van Assche
  2025-12-03 19:43                           ` Roger Shimizu
  0 siblings, 1 reply; 63+ messages in thread
From: Bart Van Assche @ 2025-12-03 18:27 UTC (permalink / raw)
  To: Nitin Rawat, Roger Shimizu
  Cc: Manivannan Sadhasivam, Martin K . Petersen, linux-scsi,
	James E.J. Bottomley, Nitin Rawat

On 12/3/25 6:47 AM, Nitin Rawat wrote:
> I tested on other platforms - SM8650 and SM8750 , and the same error 
> occurs there as well. Seems like the issue impacts all targets.
> 
> I suspect the problem is related to the new tag implementation in the 
> device management command.
> 
> Below is the call stack observed each time the issue occurs:
> [  274.480707] task:kworker/u33:6   state:D stack:0     pid:94 
> tgid:94    ppid:2      task_flags:0x4208060 flags:0x00000010
> [  274.492127] Workqueue: devfreq_wq devfreq_monitor
> [  274.496964] Call trace:
> [  274.499481]  __switch_to+0xec/0x1c0 (T)
> [  274.503431]  __schedule+0x368/0xce0
> [  274.507025]  schedule+0x34/0x118
> [  274.510354]  schedule_timeout+0xd4/0x110
> [  274.514393]  io_schedule_timeout+0x48/0x68
> [  274.518608]  wait_for_completion_io+0x78/0x140
> [  274.523178]  blk_execute_rq+0xbc/0x13c
> [  274.527038]  ufshcd_exec_dev_cmd+0x1e0/0x260
> [  274.531431]  ufshcd_query_flag+0x158/0x1e0
> [  274.535646]  ufshcd_query_flag_retry+0x4c/0xa8
> [  274.540215]  ufshcd_wb_toggle+0x54/0xc0
> [  274.544165]  ufshcd_devfreq_scale+0x2c0/0x448
> [  274.548645]  ufshcd_devfreq_target+0xd4/0x24c
> [  274.553125]  devfreq_set_target+0x90/0x184
> [  274.557340]  devfreq_update_target+0xc0/0xdc
> [  274.561732]  devfreq_monitor+0x34/0xa0
> [  274.565591]  process_one_work+0x148/0x290
> [  274.569717]  worker_thread+0x2c8/0x3e4
> [  274.573576]  kthread+0x12c/0x204
> [  274.576895]  ret_from_fork+0x10/0x20
Thanks Nitin, this is very helpful. Is applying the patch below on top
of Martin's for-next branch sufficient to fix this deadlock?

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 1b3fe1d8655e..fd0b6b620b53 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -1455,15 +1455,14 @@ static int ufshcd_clock_scaling_prepare(struct 
ufs_hba *hba, u64 timeout_us)
  static void ufshcd_clock_scaling_unprepare(struct ufs_hba *hba, int err)
  {
  	up_write(&hba->clk_scaling_lock);
-
+	mutex_unlock(&hba->wb_mutex);
+	blk_mq_unquiesce_tagset(&hba->host->tag_set);
+	mutex_unlock(&hba->host->scan_mutex);
+	
  	/* Enable Write Booster if current gear requires it else disable it */
  	if (ufshcd_enable_wb_if_scaling_up(hba) && !err)
  		ufshcd_wb_toggle(hba, hba->pwr_info.gear_rx >= 
hba->clk_scaling.wb_gear);

-	mutex_unlock(&hba->wb_mutex);
-
-	blk_mq_unquiesce_tagset(&hba->host->tag_set);
-	mutex_unlock(&hba->host->scan_mutex);
  	ufshcd_release(hba);
  }


Thanks,

Bart.

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-03 18:27                         ` Bart Van Assche
@ 2025-12-03 19:43                           ` Roger Shimizu
  2025-12-03 21:32                             ` Bart Van Assche
  0 siblings, 1 reply; 63+ messages in thread
From: Roger Shimizu @ 2025-12-03 19:43 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: Nitin Rawat, Manivannan Sadhasivam, Martin K . Petersen,
	linux-scsi, James E.J. Bottomley, Nitin Rawat

On Wed, Dec 3, 2025 at 10:27 AM Bart Van Assche <bvanassche@acm.org> wrote:
>
> On 12/3/25 6:47 AM, Nitin Rawat wrote:
> > I tested on other platforms - SM8650 and SM8750 , and the same error
> > occurs there as well. Seems like the issue impacts all targets.
> >
> > I suspect the problem is related to the new tag implementation in the
> > device management command.
> >
> > Below is the call stack observed each time the issue occurs:
> > [  274.480707] task:kworker/u33:6   state:D stack:0     pid:94
> > tgid:94    ppid:2      task_flags:0x4208060 flags:0x00000010
> > [  274.492127] Workqueue: devfreq_wq devfreq_monitor
> > [  274.496964] Call trace:
> > [  274.499481]  __switch_to+0xec/0x1c0 (T)
> > [  274.503431]  __schedule+0x368/0xce0
> > [  274.507025]  schedule+0x34/0x118
> > [  274.510354]  schedule_timeout+0xd4/0x110
> > [  274.514393]  io_schedule_timeout+0x48/0x68
> > [  274.518608]  wait_for_completion_io+0x78/0x140
> > [  274.523178]  blk_execute_rq+0xbc/0x13c
> > [  274.527038]  ufshcd_exec_dev_cmd+0x1e0/0x260
> > [  274.531431]  ufshcd_query_flag+0x158/0x1e0
> > [  274.535646]  ufshcd_query_flag_retry+0x4c/0xa8
> > [  274.540215]  ufshcd_wb_toggle+0x54/0xc0
> > [  274.544165]  ufshcd_devfreq_scale+0x2c0/0x448
> > [  274.548645]  ufshcd_devfreq_target+0xd4/0x24c
> > [  274.553125]  devfreq_set_target+0x90/0x184
> > [  274.557340]  devfreq_update_target+0xc0/0xdc
> > [  274.561732]  devfreq_monitor+0x34/0xa0
> > [  274.565591]  process_one_work+0x148/0x290
> > [  274.569717]  worker_thread+0x2c8/0x3e4
> > [  274.573576]  kthread+0x12c/0x204
> > [  274.576895]  ret_from_fork+0x10/0x20
> Thanks Nitin, this is very helpful. Is applying the patch below on top
> of Martin's for-next branch sufficient to fix this deadlock?
>
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index 1b3fe1d8655e..fd0b6b620b53 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -1455,15 +1455,14 @@ static int ufshcd_clock_scaling_prepare(struct
> ufs_hba *hba, u64 timeout_us)
>   static void ufshcd_clock_scaling_unprepare(struct ufs_hba *hba, int err)
>   {
>         up_write(&hba->clk_scaling_lock);
> -
> +       mutex_unlock(&hba->wb_mutex);
> +       blk_mq_unquiesce_tagset(&hba->host->tag_set);
> +       mutex_unlock(&hba->host->scan_mutex);
> +
>         /* Enable Write Booster if current gear requires it else disable it */
>         if (ufshcd_enable_wb_if_scaling_up(hba) && !err)
>                 ufshcd_wb_toggle(hba, hba->pwr_info.gear_rx >=
> hba->clk_scaling.wb_gear);
>
> -       mutex_unlock(&hba->wb_mutex);
> -
> -       blk_mq_unquiesce_tagset(&hba->host->tag_set);
> -       mutex_unlock(&hba->host->scan_mutex);
>         ufshcd_release(hba);
>   }

Yes, this patch fixed the boot issue on my RUBIK Pi 3 (QCS6490). Thank you!

Tested-by: Roger Shimizu <rosh@debian.org>

-Roger

> Thanks,
>
> Bart.

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-03 19:43                           ` Roger Shimizu
@ 2025-12-03 21:32                             ` Bart Van Assche
  0 siblings, 0 replies; 63+ messages in thread
From: Bart Van Assche @ 2025-12-03 21:32 UTC (permalink / raw)
  To: Roger Shimizu
  Cc: Nitin Rawat, Manivannan Sadhasivam, Martin K . Petersen,
	linux-scsi, James E.J. Bottomley, Nitin Rawat

On 12/3/25 9:43 AM, Roger Shimizu wrote:
> Yes, this patch fixed the boot issue on my RUBIK Pi 3 (QCS6490). Thank you!
> 
> Tested-by: Roger Shimizu <rosh@debian.org>

Thanks Roger for having tested this patch!

Bart.

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-03  5:46                     ` Bart Van Assche
  2025-12-03 16:47                       ` Nitin Rawat
@ 2025-12-03 22:40                       ` Nitin Rawat
  2025-12-03 23:26                         ` Bart Van Assche
  1 sibling, 1 reply; 63+ messages in thread
From: Nitin Rawat @ 2025-12-03 22:40 UTC (permalink / raw)
  To: Bart Van Assche, Roger Shimizu
  Cc: Manivannan Sadhasivam, Martin K . Petersen, linux-scsi,
	James E.J. Bottomley, Nitin Rawat



On 12/3/2025 11:16 AM, Bart Van Assche wrote:
> On 12/2/25 2:56 PM, Roger Shimizu wrote:
>> On Tue, Dec 2, 2025 at 8:03 AM Bart Van Assche <bvanassche@acm.org> 
>> wrote:
>>> Can you please help with the following:
>>> * Verify whether or not Martin's for-next branch boots fine on the
>>>     Qcom RB3Gen2 board (I expect this not to be the case). Martin's
>>>     Linux kernel git repository is available at
>>>     git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git.
>>
>> No, same boot issue for mkp/for-next branch.
>>
>>> * If Martin's for-next branch boots fine, bisect linux-next.
>>> * If the boot hang is reproducible with Martin's for-next branch,
>>>     bisect that branch. After every bisection step, apply the patch
>>>     below to work around bisectability issues in this patch series.
>>>     If any part of that patch fails to apply, ignore the failures.
>>>     We already know that the boot hang does not occur with commit
>>>     1d0af94ffb5d ("scsi: ufs: core: Make the reserved slot a reserved
>>>     request"). There are only 35 UFS patches on Martin's for-next branch
>>>     past that commit:
>>>     $ git log 1d0af94ffb5d..mkp-scsi/for-next */ufs|grep -c ^commit
>>>     35
>>
>> First I want to clarify 1d0af94ffb5d ("scsi: ufs: core: Make the
>> reserved slot a reserved request")
>> has boot issue.
>> But applying for the debugging patch from your email, it boots fine.
>> So the bisecting start from here.
>>
>> Bisecting result is:
>> 08b12cda6c44 ("scsi: ufs: core: Switch to scsi_get_internal_cmd()") is
>> the first bad commit.
>>
>> And this commit can apply the debugging patch (below) without any 
>> conflict.
>> Hope it helps, and thank you!
> Thanks Roger for having taken the time to bisect this issue!
> Unfortunately this information is not sufficient to identify the root
> cause. This is what we can conclude from the information that has been
> shared so far:
> - The boot hang can't be caused by a ufshcd_get_dev_mgmt_cmd() hang
>    because that function specifies the flag BLK_MQ_REQ_NOWAIT. That flag
>    makes scsi_get_internal_cmd() return immediately if no reserved tag is
>    available. If scsi_get_internal_cmd() would fail, the caller would
>    emit a kernel warning. I haven't seen any kernel warnings in any of
>    the kernel logs that have been shared so far.
> - The boot hang can't be caused by a device management command timeout
>    because blk_execute_rq() is used for submitting device management
>    commands. blk_execute_rq() uses rq->timeout as timeout. Even if
>    rq->timeout wouldn't be set, the block layer would initialize that
>    timeout value. I haven't seen any data in any of the kernel logs that
>    indicates a device management request timeout.
> 
> Could anyone share the call traces produced by
> "echo w >/proc/sysrq-trigger" and also the output produced by
> "echo t >/proc/sysrq-trigge"" after having reproduced the boot hang?



Hi Bart,

With the fix shared by you , SDB mode on SM8750 works fine now but MCQ 
mode still have below error.


[    3.720396] ufshcd-qcom 1d84000.ufs: ufshcd_err_handler started; HBA 
state eh_non_fatal; powered 1; shutting down 0; saved_err = 0x4; 
saved_uic_err = 0x40; force_reset = 0
[    3.740078] Unable to handle kernel NULL pointer dereference at 
virtual address 0000000000000378
[    3.740084] Mem abort info:
[    3.740086]   ESR = 0x0000000096000006
[    3.740089]   EC = 0x25: DABT (current EL), IL = 32 bits
[    3.740092]   SET = 0, FnV = 0
[    3.740094]   EA = 0, S1PTW = 0
[    3.740096]   FSC = 0x06: level 2 translation fault
[    3.740099] Data abort info:
[    3.740100]   ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000
[    3.740103]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
[    3.740105]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
[    3.740108] user pgtable: 4k pages, 48-bit VAs, pgdp=000000088f66d000
[    3.740111] [0000000000000378] pgd=080000088f66c403, 
p4d=080000088f66c403, pud=080000088f66b403, pmd=0000000000000000
[    3.740123] Internal error: Oops: 0000000096000006 [#1]  SMP

[    3.815406] CPU: 7 UID: 0 PID: 213 Comm: kworker/u32:2 Not tainted 
6.18.0-next-20251203-00001-gc131083d7359 #27 PREEMPT
[    3.918160] Hardware name: Qualcomm Technologies, Inc. SM8750 MTP (DT)
[    3.918163] Workqueue: ufs_eh_wq_0 ufshcd_err_handler
[    3.918171] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS 
BTYPE=--)
[    3.918176] pc : ufshcd_err_handler+0xac/0x9ec
[    3.918181] lr : ufshcd_err_handler+0x9c/0x9ec
[    3.918184] sp : ffff800081153d10
[    3.918186] x29: ffff800081153d50 x28: 0000000000000000 x27: 
ffff0008104508b0
[    3.918194] x26: 0000000000000000 x25: ffff000800968ac0 x24: 
ffff000801c76405
[    3.918200] x23: 0000000000000000 x22: ffff000800028000 x21: 
ffff000801c76400
[    3.918206] x20: ffffc34adec2e068 x19: ffff000810450b18 x18: 
0000000000000006
[    3.918212] x17: 0000000000000000 x16: 0000000000000000 x15: 
ffff80008115383f
[    3.918218] x14: 000000000000000e x13: 655f646368736675 x12: 
ffffc34adfee6c48
[    3.993771] x11: 0000000000000001 x10: ffff00080f7f4cc0 x9 : 
ffff0008013d6e00
[    4.001105] x8 : ffff000b7e150cc0 x7 : 0000000000000000 x6 : 
0000000000000002
[    4.008438] x5 : ffff000b7e146408 x4 : 0000000000000001 x3 : 
0000000000000000
[    4.015771] x2 : 0000000000000000 x1 : 0000000000000001 x0 : 
0000000000000378
[    4.023106] Call trace:
[    4.025629]  ufshcd_err_handler+0xac/0x9ec (P)
[    4.030207]  process_one_work+0x148/0x290
[    4.034336]  worker_thread+0x2c8/0x3e4
[    4.038192]  kthread+0x12c/0x204
[    4.041527]  ret_from_fork+0x10/0x20
[    4.045210] Code: f9402760 d503201f 910de000 52800021 (b821001f)
[    4.051474] ---[ end trace 0000000000000000 ]---
[    4.056981] scsi 0:0:0:49488: Well-known LUN    MICRON 
MT512GAYAX4U40   0100 PQ: 0 ANSI: 6


[    4.281093] devfreq 1d84000.ufs: dvfs failed with (-16) error
[    4.360921] devfreq 1d84000.ufs: dvfs failed with (-16) error
[    4.746782] devfreq 1d84000.ufs: dvfs failed with (-16) error
[    4.817093] devfreq 1d84000.ufs: dvfs failed with (-16) error
[    4.893131] devfreq 1d84000.ufs: dvfs failed with (-16) error
[    5.013146] devfreq 1d84000.ufs: dvfs failed with (-16) error
[    7.249155] devfreq 1d84000.ufs: dvfs failed with (-16) error
[    7.341071] devfreq 1d84000.ufs: dvfs failed with (-16) error


However, after switching to previous tag next-20251110 of linux-next, 
where this series of changes is not present, the issues is not seen.

Regards,
Nitin




> 
> Thanks,
> 
> Bart.
> 


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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-03 22:40                       ` Nitin Rawat
@ 2025-12-03 23:26                         ` Bart Van Assche
  2025-12-04 14:36                           ` Nitin Rawat
  0 siblings, 1 reply; 63+ messages in thread
From: Bart Van Assche @ 2025-12-03 23:26 UTC (permalink / raw)
  To: Nitin Rawat, Roger Shimizu
  Cc: Manivannan Sadhasivam, Martin K . Petersen, linux-scsi,
	James E.J. Bottomley, Nitin Rawat

On 12/3/25 12:40 PM, Nitin Rawat wrote:
> With the fix shared by you , SDB mode on SM8750 works fine now but MCQ 
> mode still have below error.
> 
> 
> [    3.720396] ufshcd-qcom 1d84000.ufs: ufshcd_err_handler started; HBA 
> state eh_non_fatal; powered 1; shutting down 0; saved_err = 0x4; 
> saved_uic_err = 0x40; force_reset = 0
> [    3.740078] Unable to handle kernel NULL pointer dereference at 
> virtual address 0000000000000378
> [    3.740084] Mem abort info:
> [    3.740086]   ESR = 0x0000000096000006
> [    3.740089]   EC = 0x25: DABT (current EL), IL = 32 bits
> [    3.740092]   SET = 0, FnV = 0
> [    3.740094]   EA = 0, S1PTW = 0
> [    3.740096]   FSC = 0x06: level 2 translation fault
> [    3.740099] Data abort info:
> [    3.740100]   ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000
> [    3.740103]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
> [    3.740105]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
> [    3.740108] user pgtable: 4k pages, 48-bit VAs, pgdp=000000088f66d000
> [    3.740111] [0000000000000378] pgd=080000088f66c403, 
> p4d=080000088f66c403, pud=080000088f66b403, pmd=0000000000000000
> [    3.740123] Internal error: Oops: 0000000096000006 [#1]  SMP
> 
> [    3.815406] CPU: 7 UID: 0 PID: 213 Comm: kworker/u32:2 Not tainted 
> 6.18.0-next-20251203-00001-gc131083d7359 #27 PREEMPT
> [    3.918160] Hardware name: Qualcomm Technologies, Inc. SM8750 MTP (DT)
> [    3.918163] Workqueue: ufs_eh_wq_0 ufshcd_err_handler
> [    3.918171] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS 
> BTYPE=--)
> [    3.918176] pc : ufshcd_err_handler+0xac/0x9ec
> [    3.918181] lr : ufshcd_err_handler+0x9c/0x9ec
> [    4.023106] Call trace:
> [    4.025629]  ufshcd_err_handler+0xac/0x9ec (P)
> [    4.030207]  process_one_work+0x148/0x290
> [    4.034336]  worker_thread+0x2c8/0x3e4
> [    4.038192]  kthread+0x12c/0x204
> [    4.041527]  ret_from_fork+0x10/0x20
> [    4.045210] Code: f9402760 d503201f 910de000 52800021 (b821001f)
> [    4.051474] ---[ end trace 0000000000000000 ]---
> [    4.056981] scsi 0:0:0:49488: Well-known LUN    MICRON 
> MT512GAYAX4U40   0100 PQ: 0 ANSI: 6
> 
> 
> [    4.281093] devfreq 1d84000.ufs: dvfs failed with (-16) error
> [    4.360921] devfreq 1d84000.ufs: dvfs failed with (-16) error
> [    4.746782] devfreq 1d84000.ufs: dvfs failed with (-16) error
> [    4.817093] devfreq 1d84000.ufs: dvfs failed with (-16) error
> [    4.893131] devfreq 1d84000.ufs: dvfs failed with (-16) error
> [    5.013146] devfreq 1d84000.ufs: dvfs failed with (-16) error
> [    7.249155] devfreq 1d84000.ufs: dvfs failed with (-16) error
> [    7.341071] devfreq 1d84000.ufs: dvfs failed with (-16) error
> 
> 
> However, after switching to previous tag next-20251110 of linux-next, 
> where this series of changes is not present, the issues is not seen.

Hi Nitin,

Does the patch below help? If not, can you please help with translating
the crash address into a source code line number? Please note that the
patch below is unrelated to any of my recent UFS driver kernel patches.

Thanks,

Bart.


diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index b834b9635062..0f0944ea8b46 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -6698,6 +6698,7 @@ static void ufshcd_err_handler(struct work_struct 
*work)
  		 hba->saved_uic_err, hba->force_reset,
  		 ufshcd_is_link_broken(hba) ? "; link is broken" : "");

+	if (hba->ufs_device_wlun) {
  	/*
  	 * Use ufshcd_rpm_get_noresume() here to safely perform link recovery
  	 * even if an error occurs during runtime suspend or runtime resume.
@@ -6711,6 +6712,7 @@ static void ufshcd_err_handler(struct work_struct 
*work)
  		return;
  	}
  	ufshcd_rpm_put(hba);
+	}

  	down(&hba->host_sem);
  	spin_lock_irqsave(hba->host->host_lock, flags);


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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  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
  0 siblings, 2 replies; 63+ messages in thread
From: Nitin Rawat @ 2025-12-04 14:36 UTC (permalink / raw)
  To: Bart Van Assche, Nitin Rawat, Roger Shimizu
  Cc: Manivannan Sadhasivam, Martin K . Petersen, linux-scsi,
	James E.J. Bottomley



On 12/4/2025 4:56 AM, Bart Van Assche wrote:
> On 12/3/25 12:40 PM, Nitin Rawat wrote:
>> With the fix shared by you , SDB mode on SM8750 works fine now but MCQ 
>> mode still have below error.
>>
>>
>> [    3.720396] ufshcd-qcom 1d84000.ufs: ufshcd_err_handler started; 
>> HBA state eh_non_fatal; powered 1; shutting down 0; saved_err = 0x4; 
>> saved_uic_err = 0x40; force_reset = 0
>> [    3.740078] Unable to handle kernel NULL pointer dereference at 
>> virtual address 0000000000000378
>> [    3.740084] Mem abort info:
>> [    3.740086]   ESR = 0x0000000096000006
>> [    3.740089]   EC = 0x25: DABT (current EL), IL = 32 bits
>> [    3.740092]   SET = 0, FnV = 0
>> [    3.740094]   EA = 0, S1PTW = 0
>> [    3.740096]   FSC = 0x06: level 2 translation fault
>> [    3.740099] Data abort info:
>> [    3.740100]   ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000
>> [    3.740103]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
>> [    3.740105]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
>> [    3.740108] user pgtable: 4k pages, 48-bit VAs, pgdp=000000088f66d000
>> [    3.740111] [0000000000000378] pgd=080000088f66c403, 
>> p4d=080000088f66c403, pud=080000088f66b403, pmd=0000000000000000
>> [    3.740123] Internal error: Oops: 0000000096000006 [#1]  SMP
>>
>> [    3.815406] CPU: 7 UID: 0 PID: 213 Comm: kworker/u32:2 Not tainted 
>> 6.18.0-next-20251203-00001-gc131083d7359 #27 PREEMPT
>> [    3.918160] Hardware name: Qualcomm Technologies, Inc. SM8750 MTP (DT)
>> [    3.918163] Workqueue: ufs_eh_wq_0 ufshcd_err_handler
>> [    3.918171] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS 
>> BTYPE=--)
>> [    3.918176] pc : ufshcd_err_handler+0xac/0x9ec
>> [    3.918181] lr : ufshcd_err_handler+0x9c/0x9ec
>> [    4.023106] Call trace:
>> [    4.025629]  ufshcd_err_handler+0xac/0x9ec (P)
>> [    4.030207]  process_one_work+0x148/0x290
>> [    4.034336]  worker_thread+0x2c8/0x3e4
>> [    4.038192]  kthread+0x12c/0x204
>> [    4.041527]  ret_from_fork+0x10/0x20
>> [    4.045210] Code: f9402760 d503201f 910de000 52800021 (b821001f)
>> [    4.051474] ---[ end trace 0000000000000000 ]---
>> [    4.056981] scsi 0:0:0:49488: Well-known LUN    MICRON 
>> MT512GAYAX4U40   0100 PQ: 0 ANSI: 6
>>
>>
>> [    4.281093] devfreq 1d84000.ufs: dvfs failed with (-16) error
>> [    4.360921] devfreq 1d84000.ufs: dvfs failed with (-16) error
>> [    4.746782] devfreq 1d84000.ufs: dvfs failed with (-16) error
>> [    4.817093] devfreq 1d84000.ufs: dvfs failed with (-16) error
>> [    4.893131] devfreq 1d84000.ufs: dvfs failed with (-16) error
>> [    5.013146] devfreq 1d84000.ufs: dvfs failed with (-16) error
>> [    7.249155] devfreq 1d84000.ufs: dvfs failed with (-16) error
>> [    7.341071] devfreq 1d84000.ufs: dvfs failed with (-16) error
>>
>>
>> However, after switching to previous tag next-20251110 of linux-next, 
>> where this series of changes is not present, the issues is not seen.
> 
> Hi Nitin,
> 
> Does the patch below help? If not, can you please help with translating
> the crash address into a source code line number? Please note that the
> patch below is unrelated to any of my recent UFS driver kernel patches.
> 
> Thanks,
> 
> Bart.

Thanks Bart.

I also applied a similar change as yours, and the NULL pointer 
dereference issue is resolved. The clock scaling error (dvfs failed with 
(-16) error) also no longer appears.

It seems the NULL pointer dereference occurred because the UFS error 
handler (ufshcd_err_handler) was scheduled and executed before the UFS 
device WLUNs (Well-Known Logical Units) were initialized during boot. 
These WLUNs were being accessed in ufshcd_rpm_get_noresume() before 
ufshcd_err_handling_should_stop performed the NULL check.


However, the UIC error persists, causing the error handler to run on 
every boot. The behaviour is same on both SM8650 and SM8750.


[    0.639606] /soc@0/phy@1d80000: Fixed dependency cycle(s) with 
/soc@0/ufs@1d84000
[    0.647298] /soc@0/ufs@1d84000: Fixed dependency cycle(s) with 
/soc@0/phy@1d80000
[    0.681909] /soc@0/phy@1d80000: Fixed dependency cycle(s) with 
/soc@0/ufs@1d84000
[    0.689688] /soc@0/phy@1d80000: Fixed dependency cycle(s) with 
/soc@0/ufs@1d84000
[    0.697392] /soc@0/ufs@1d84000: Fixed dependency cycle(s) with 
/soc@0/phy@1d80000
[    1.228095] platform 1d84000.ufs: Adding to iommu group 4
[    3.440633] ufshcd-qcom 1d84000.ufs: freq-table-hz property not specified
[    3.447622] ufshcd-qcom 1d84000.ufs: ufshcd_populate_vreg: Unable to 
find vdd-hba-supply regulator, assuming enabled
[    3.470491] ufshcd-qcom 1d84000.ufs: ufshcd_populate_vreg: Unable to 
find vccq2-supply regulator, assuming enabled
[    3.516236] ufshcd-qcom 1d84000.ufs: ESI configured
[    3.516272] ufshcd-qcom 1d84000.ufs: MCQ configured, nr_queues=9, 
io_queues=8, read_queue=0, poll_queues=1, queue_depth=64
[    3.516275] scsi host0: ufshcd
[    3.584233] ufshcd-qcom 1d84000.ufs: ufshcd_err_handler started; HBA 
state eh_non_fatal; powered 1; shutting down 0; saved_err = 0x4; 
saved_uic_err = 0x40; force_reset = 0
[    3.607898] ufshcd-qcom 1d84000.ufs: ufshcd_err_handler started; HBA 
state operational; powered 1; shutting down 0; saved_err = 0x4; 
saved_uic_err = 0x40; force_reset = 0


Regards,
Nitin

> 
> 
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index b834b9635062..0f0944ea8b46 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -6698,6 +6698,7 @@ static void ufshcd_err_handler(struct work_struct 
> *work)
>            hba->saved_uic_err, hba->force_reset,
>            ufshcd_is_link_broken(hba) ? "; link is broken" : "");
> 
> +    if (hba->ufs_device_wlun) {
>       /*
>        * Use ufshcd_rpm_get_noresume() here to safely perform link recovery
>        * even if an error occurs during runtime suspend or runtime resume.
> @@ -6711,6 +6712,7 @@ static void ufshcd_err_handler(struct work_struct 
> *work)
>           return;
>       }
>       ufshcd_rpm_put(hba);
> +    }
> 
>       down(&hba->host_sem);
>       spin_lock_irqsave(hba->host->host_lock, flags);
> 


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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-04 14:36                           ` Nitin Rawat
@ 2025-12-04 17:06                             ` Bart Van Assche
  2025-12-16 20:53                             ` Bart Van Assche
  1 sibling, 0 replies; 63+ messages in thread
From: Bart Van Assche @ 2025-12-04 17:06 UTC (permalink / raw)
  To: Nitin Rawat, Nitin Rawat, Roger Shimizu
  Cc: Manivannan Sadhasivam, Martin K . Petersen, linux-scsi,
	James E.J. Bottomley

On 12/4/25 4:36 AM, Nitin Rawat wrote:
> I also applied a similar change as yours, and the NULL pointer 
> dereference issue is resolved. The clock scaling error (dvfs failed with 
> (-16) error) also no longer appears.

Thanks for having confirmed this!
> However, the UIC error persists, causing the error handler to run on 
> every boot. The behaviour is same on both SM8650 and SM8750.

I'm not sure what is causing this. I will try to find a platform on 
which I can reproduce this issue next week (I'm traveling this week).

Thanks,

Bart.

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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  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
  1 sibling, 1 reply; 63+ messages in thread
From: Bart Van Assche @ 2025-12-16 20:53 UTC (permalink / raw)
  To: Nitin Rawat, Nitin Rawat, Roger Shimizu
  Cc: Manivannan Sadhasivam, Martin K . Petersen, linux-scsi,
	James E.J. Bottomley

On 12/4/25 6:36 AM, Nitin Rawat wrote:
> However, the UIC error persists, causing the error handler to run on 
> every boot. The behaviour is same on both SM8650 and SM8750.
>
> [    3.516236] ufshcd-qcom 1d84000.ufs: ESI configured
> [    3.516272] ufshcd-qcom 1d84000.ufs: MCQ configured, nr_queues=9, 
> io_queues=8, read_queue=0, poll_queues=1, queue_depth=64
> [    3.516275] scsi host0: ufshcd
> [    3.584233] ufshcd-qcom 1d84000.ufs: ufshcd_err_handler started; HBA 
> state eh_non_fatal; powered 1; shutting down 0; saved_err = 0x4; 
> saved_uic_err = 0x40; force_reset = 0
> [    3.607898] ufshcd-qcom 1d84000.ufs: ufshcd_err_handler started; HBA 
> state operational; powered 1; shutting down 0; saved_err = 0x4; 
> saved_uic_err = 0x40; force_reset = 0

Does the patch below help? This patch is sufficient to solve this issue
on my test setup.

Thanks,

Bart.


Subject: [PATCH] ufs: core: Configure MCQ after link startup

Commit f46b9a595fa9 ("scsi: ufs: core: Allocate the SCSI host earlier")
did not only cause scsi_add_host() to be called earlier. It also swapped
the order of link startup and enabling and configuring MCQ mode. Before
that commit, the call chains for link startup and enabling MCQ were as
follows:

ufshcd_init()
   ufshcd_link_startup()
   ufshcd_add_scsi_host()
     ufshcd_mcq_enable()

Apparently this change causes link startup to fail. Fix this by configuring
MCQ after link startup has completed.

Fixes: f46b9a595fa9 ("scsi: ufs: core: Allocate the SCSI host earlier")
Change-Id: I59754fdd910b9a88bdd681280342b923c4c494b0
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
  drivers/ufs/core/ufshcd.c | 7 ++++---
  1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index d18a3e616c8a..310fd3fa0897 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -10812,9 +10812,7 @@ static int ufshcd_add_scsi_host(struct ufs_hba *hba)
  	if (is_mcq_supported(hba)) {
  		ufshcd_mcq_enable(hba);
  		err = ufshcd_alloc_mcq(hba);
-		if (!err) {
-			ufshcd_config_mcq(hba);
-		} else {
+		if (err) {
  			/* Continue with SDB mode */
  			ufshcd_mcq_disable(hba);
  			use_mcq_mode = false;
@@ -11088,6 +11086,9 @@ int ufshcd_init(struct ufs_hba *hba, void 
__iomem *mmio_base, unsigned int irq)
  	if (err)
  		goto out_disable;

+	if (hba->mcq_enabled)
+		ufshcd_config_mcq(hba);
+
  	if (hba->quirks & UFSHCD_QUIRK_SKIP_PH_CONFIGURATION)
  		goto initialized;



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

* Re: [PATCH v8 21/28] ufs: core: Make the reserved slot a reserved request
  2025-12-16 20:53                             ` Bart Van Assche
@ 2025-12-17 17:29                               ` Nitin Rawat
  0 siblings, 0 replies; 63+ messages in thread
From: Nitin Rawat @ 2025-12-17 17:29 UTC (permalink / raw)
  To: Bart Van Assche, Nitin Rawat, Roger Shimizu
  Cc: Manivannan Sadhasivam, Martin K . Petersen, linux-scsi,
	James E.J. Bottomley



On 12/17/2025 2:23 AM, Bart Van Assche wrote:
> On 12/4/25 6:36 AM, Nitin Rawat wrote:
>> However, the UIC error persists, causing the error handler to run on 
>> every boot. The behaviour is same on both SM8650 and SM8750.
>>
>> [    3.516236] ufshcd-qcom 1d84000.ufs: ESI configured
>> [    3.516272] ufshcd-qcom 1d84000.ufs: MCQ configured, nr_queues=9, 
>> io_queues=8, read_queue=0, poll_queues=1, queue_depth=64
>> [    3.516275] scsi host0: ufshcd
>> [    3.584233] ufshcd-qcom 1d84000.ufs: ufshcd_err_handler started; 
>> HBA state eh_non_fatal; powered 1; shutting down 0; saved_err = 0x4; 
>> saved_uic_err = 0x40; force_reset = 0
>> [    3.607898] ufshcd-qcom 1d84000.ufs: ufshcd_err_handler started; 
>> HBA state operational; powered 1; shutting down 0; saved_err = 0x4; 
>> saved_uic_err = 0x40; force_reset = 0
> 
> Does the patch below help? This patch is sufficient to solve this issue
> on my test setup.


Hi Bart,

It resolved the issue on my end as well. I tested it on SM8750, where 
the error was previously reported. Thanks


-Nitin



> 
> Thanks,
> 
> Bart.
> 
> 
> Subject: [PATCH] ufs: core: Configure MCQ after link startup
> 
> Commit f46b9a595fa9 ("scsi: ufs: core: Allocate the SCSI host earlier")
> did not only cause scsi_add_host() to be called earlier. It also swapped
> the order of link startup and enabling and configuring MCQ mode. Before
> that commit, the call chains for link startup and enabling MCQ were as
> follows:
> 
> ufshcd_init()
>    ufshcd_link_startup()
>    ufshcd_add_scsi_host()
>      ufshcd_mcq_enable()
> 
> Apparently this change causes link startup to fail. Fix this by configuring
> MCQ after link startup has completed.
> 
> Fixes: f46b9a595fa9 ("scsi: ufs: core: Allocate the SCSI host earlier")
> Change-Id: I59754fdd910b9a88bdd681280342b923c4c494b0
> Signed-off-by: Bart Van Assche <bvanassche@acm.org>
> ---
>   drivers/ufs/core/ufshcd.c | 7 ++++---
>   1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index d18a3e616c8a..310fd3fa0897 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -10812,9 +10812,7 @@ static int ufshcd_add_scsi_host(struct ufs_hba 
> *hba)
>       if (is_mcq_supported(hba)) {
>           ufshcd_mcq_enable(hba);
>           err = ufshcd_alloc_mcq(hba);
> -        if (!err) {
> -            ufshcd_config_mcq(hba);
> -        } else {
> +        if (err) {
>               /* Continue with SDB mode */
>               ufshcd_mcq_disable(hba);
>               use_mcq_mode = false;
> @@ -11088,6 +11086,9 @@ int ufshcd_init(struct ufs_hba *hba, void 
> __iomem *mmio_base, unsigned int irq)
>       if (err)
>           goto out_disable;
> 
> +    if (hba->mcq_enabled)
> +        ufshcd_config_mcq(hba);
> +
>       if (hba->quirks & UFSHCD_QUIRK_SKIP_PH_CONFIGURATION)
>           goto initialized;
> 
> 


^ 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