Linux SCSI subsystem development
 help / color / mirror / Atom feed
From: John Garry <john.g.garry@oracle.com>
To: Bart Van Assche <bvanassche@acm.org>,
	"Martin K . Petersen" <martin.petersen@oracle.com>
Cc: linux-scsi@vger.kernel.org,
	"James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
Subject: Re: [PATCH v4 07/29] scsi_debug: Allocate a pseudo SCSI device
Date: Wed, 17 Sep 2025 13:09:11 +0100	[thread overview]
Message-ID: <75018e17-4dea-4e1b-8c92-7a224a1e13b9@oracle.com> (raw)
In-Reply-To: <20250912182340.3487688-8-bvanassche@acm.org>

On 12/09/2025 19:21, Bart Van Assche wrote:
> Make sure that the code for allocating a pseudo SCSI device gets triggered
> while running blktests.
> 
> Signed-off-by: Bart Van Assche <bvanassche@acm.org>
> ---
>   drivers/scsi/scsi_debug.c | 14 ++++++++++++++
>   1 file changed, 14 insertions(+)
> 
> diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
> index 2a8638937d23..3f7884025d19 100644
> --- a/drivers/scsi/scsi_debug.c
> +++ b/drivers/scsi/scsi_debug.c
> @@ -9197,6 +9197,19 @@ static int sdebug_fail_cmd(struct scsi_cmnd *cmnd, int *retval,
>   	return ret;
>   }
>   
> +/*

Hi Bart,

Could you consider integrating the following patch into this series? I 
think maybe some ideas can be applied to the UFS driver. I made this 
change on top of your series. My motivation is that I would like to be 
able to test reserved commands handling.

Thanks.

-------8<------

 From 67bff76aacaffcf8f22c634d5b8afaee8e705424 Mon Sep 17 00:00:00 2001
From: John Garry <john.g.garry@oracle.com>
Date: Wed, 17 Sep 2025 12:58:10 +0100
Subject: [PATCH] scsi_debug: really handle reserved commands

Use the scsi reserved command handling for issuing aborts.

This allows developers without specific HW access to test reserved
commands handling.

In reality, the only thing which we are doing is changing the context
in which we abort commands. But at least we are trying to emulate real
HW handling for such a scenario.

Other users of scsi_debug_abort_cmnd() can we switched over eventually.

Signed-off-by: John Garry <john.g.garry@oracle.com>

diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 3f7884025d19..1c5d0b012c65 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -6729,20 +6729,53 @@ static bool scsi_debug_stop_cmnd(struct 
scsi_cmnd *cmnd)
  	return false;
  }

+struct scsi_debug_abort_cmd {
+	u16 tag;
+	u16 hwq;
+};
+
+enum {
+	SCSI_DEBUG_ABORT_CMD,
+};
+
+struct scsi_debug_reserved_data {
+	unsigned int type;
+
+	union {
+		struct scsi_debug_abort_cmd abort_cmd;
+	};
+};
+
  /*
   * Called from scsi_debug_abort() only, which is for timed-out cmd.
   */
  static bool scsi_debug_abort_cmnd(struct scsi_cmnd *cmnd)
  {
-	struct sdebug_scsi_cmd *sdsc = scsi_cmd_priv(cmnd);
-	unsigned long flags;
-	bool res;
+	struct request *rq = scsi_cmd_to_rq(cmnd);
+	u32 unique_tag = blk_mq_unique_tag(rq);
+	u16 hwq = blk_mq_unique_tag_to_hwq(unique_tag);
+	u16 tag = blk_mq_unique_tag_to_tag(unique_tag);
+	struct scsi_device *sdev = cmnd->device;
+	struct Scsi_Host *shost = sdev->host;
+	int err;
+	struct scsi_exec_args args = {
+		.req_flags = BLK_MQ_REQ_RESERVED | BLK_MQ_REQ_NOWAIT,
+	};
+	struct scsi_debug_reserved_data data = {
+		.type = SCSI_DEBUG_ABORT_CMD,
+		.abort_cmd = {
+			.tag = tag,
+			.hwq = hwq,
+		},
+	};

-	spin_lock_irqsave(&sdsc->lock, flags);
-	res = scsi_debug_stop_cmnd(cmnd);
-	spin_unlock_irqrestore(&sdsc->lock, flags);
+	err = scsi_execute_cmd(shost->pseudo_sdev, NULL, REQ_OP_DRV_OUT,
+			&data, sizeof(data), 3000, 0, &args);

-	return res;
+	if (err)
+		return false;
+	return true;
  }

  /*
@@ -9197,14 +9230,41 @@ static int sdebug_fail_cmd(struct scsi_cmnd 
*cmnd, int *retval,
  	return ret;
  }

-/*
- * The only purpose of this function is to make the SCSI core allocate a
- * pseudo SCSI device.
- */
  static int scsi_debug_queue_reserved_command(struct Scsi_Host *shost,
  					     struct scsi_cmnd *scp)
  {
-	WARN_ON_ONCE(true);
+	struct request *rq = scsi_cmd_to_rq(scp);
+	struct scsi_debug_reserved_data *data = bio_data(rq->bio);
+
+	switch (data->type) {
+	case SCSI_DEBUG_ABORT_CMD:
+		struct scsi_debug_abort_cmd *abort_cmd = &data->abort_cmd;
+		struct blk_mq_tag_set *tag_set = &shost->tag_set;
+		unsigned int tag = abort_cmd->tag;
+		unsigned int hwq = abort_cmd->hwq;
+		struct scsi_cmnd *abort_scmd;
+		struct sdebug_scsi_cmd *sdsc;
+		struct request *abort_rq;
+		struct blk_mq_tags *tags;
+		unsigned long flags;
+		bool res;
+
+		tags = tag_set->tags[hwq];
+		abort_rq = blk_mq_tag_to_rq(tags, tag);
+		abort_scmd = blk_mq_rq_to_pdu(abort_rq);
+		sdsc = scsi_cmd_priv(abort_scmd);
+		spin_lock_irqsave(&sdsc->lock, flags);
+		res = scsi_debug_stop_cmnd(abort_scmd);
+		spin_unlock_irqrestore(&sdsc->lock, flags);
+		if (res == true) {
+			scp->result = DID_OK << 16;
+			scsi_done(scp);
+			return 0;
+		}
+		fallthrough;
+		default:
+	}
+
  	scp->result = DID_ERROR << 16;
  	scsi_done(scp);
  	return 0;
@@ -9451,6 +9511,7 @@ static const struct scsi_host_template 
sdebug_driver_template = {
  	.init_cmd_priv = sdebug_init_cmd_priv,
  	.target_alloc =		sdebug_target_alloc,
  	.target_destroy =	sdebug_target_destroy,
+	.nr_reserved_cmds =	1,
  };

  static int sdebug_driver_probe(struct device *dev)
-- 
2.43.0




  reply	other threads:[~2025-09-17 12:09 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-12 18:21 [PATCH v4 00/29] Optimize the hot path in the UFS driver Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 01/29] scsi: core: Support allocating reserved commands Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 02/29] scsi: core: Move two statements Bart Van Assche
2025-09-16  8:03   ` John Garry
2025-09-16  8:28   ` Hannes Reinecke
2025-09-12 18:21 ` [PATCH v4 03/29] scsi: core: Make the budget map optional Bart Van Assche
2025-09-16  8:34   ` Hannes Reinecke
2025-09-16 15:45     ` Bart Van Assche
2025-09-16 20:38     ` Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 04/29] scsi: core: Support allocating a pseudo SCSI device Bart Van Assche
2025-09-16  8:21   ` John Garry
2025-09-16  8:44     ` Hannes Reinecke
2025-09-16  9:21       ` John Garry
2025-09-12 18:21 ` [PATCH v4 05/29] scsi: core: Introduce .queue_reserved_command() Bart Van Assche
2025-09-16  9:33   ` John Garry
2025-09-12 18:21 ` [PATCH v4 06/29] scsi: core: Extend the scsi_execute_cmd() functionality Bart Van Assche
2025-09-12 20:03   ` michael.christie
2025-09-12 20:14     ` Bart Van Assche
2025-09-16  9:09   ` John Garry
2025-09-16 15:44     ` Bart Van Assche
2025-09-17 13:08       ` John Garry
2025-09-17 18:21         ` Bart Van Assche
2025-09-17 23:42           ` Bart Van Assche
2025-09-18  8:01             ` John Garry
2025-09-18 19:49               ` Bart Van Assche
2025-09-19  7:45                 ` John Garry
2025-09-12 18:21 ` [PATCH v4 07/29] scsi_debug: Allocate a pseudo SCSI device Bart Van Assche
2025-09-17 12:09   ` John Garry [this message]
2025-09-17 21:37     ` Bart Van Assche
2025-09-18  7:30       ` John Garry
2025-09-12 18:21 ` [PATCH v4 08/29] ufs: core: Move an assignment in ufshcd_mcq_process_cqe() Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 09/29] ufs: core: Change the type of one ufshcd_add_cmd_upiu_trace() argument Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 10/29] ufs: core: Only call ufshcd_add_command_trace() for SCSI commands Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 11/29] ufs: core: Change the type of one ufshcd_add_command_trace() argument Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 12/29] ufs: core: Change the type of one ufshcd_send_command() argument Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 13/29] ufs: core: Only call ufshcd_should_inform_monitor() for SCSI commands Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 14/29] ufs: core: Change the monitor function argument types Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 15/29] ufs: core: Rework ufshcd_mcq_compl_pending_transfer() Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 16/29] ufs: core: Rework ufshcd_eh_device_reset_handler() Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 17/29] ufs: core: Rework the SCSI host queue depth calculation code Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 18/29] ufs: core: Allocate the SCSI host earlier Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 19/29] ufs: core: Call ufshcd_init_lrb() later Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 20/29] ufs: core: Use hba->reserved_slot Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 21/29] ufs: core: Make the reserved slot a reserved request Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 22/29] ufs: core: Do not clear driver-private command data Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 23/29] ufs: core: Optimize the hot path Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 24/29] ufs: core: Pass a SCSI pointer instead of an LRB pointer Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 25/29] ufs: core: Remove the ufshcd_lrb task_tag member Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 26/29] ufs: core: Make blk_mq_tagset_busy_iter() skip reserved requests Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 27/29] ufs: core: Move code out of ufshcd_wait_for_dev_cmd() Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 28/29] ufs: core: Rework the ufshcd_issue_dev_cmd() callers Bart Van Assche
2025-09-12 18:21 ` [PATCH v4 29/29] ufs: core: Switch to scsi_execute_cmd() Bart Van Assche

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=75018e17-4dea-4e1b-8c92-7a224a1e13b9@oracle.com \
    --to=john.g.garry@oracle.com \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=bvanassche@acm.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox