All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bart Van Assche <bvanassche@acm.org>
To: "Martin K . Petersen" <martin.petersen@oracle.com>
Cc: linux-scsi@vger.kernel.org, Bart Van Assche <bvanassche@acm.org>,
	Benjamin Block <bblock@linux.ibm.com>,
	Bean Huo <beanhuo@micron.com>, Hannes Reinecke <hare@suse.com>,
	Ming Lei <ming.lei@redhat.com>, Christoph Hellwig <hch@lst.de>,
	"James E.J. Bottomley" <jejb@linux.ibm.com>
Subject: [PATCH v3 01/88] scsi: core: Use a structure member to track the SCSI command submitter
Date: Thu,  7 Oct 2021 13:27:56 -0700	[thread overview]
Message-ID: <20211007202923.2174984-2-bvanassche@acm.org> (raw)
In-Reply-To: <20211007202923.2174984-1-bvanassche@acm.org>

Conditional statements are faster than indirect calls. Use a structure
member to track the SCSI command submitter such that later patches can
call scsi_done(scmd) instead of scmd->scsi_done(scmd).

The asymmetric behavior that scsi_send_eh_cmnd() sets the submission
context to the SCSI error handler and that it does not restore the
submission context to the SCSI core is retained.

Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
Reviewed-by: Bean Huo <beanhuo@micron.com>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Ming Lei <ming.lei@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/scsi_error.c | 17 ++++++-----------
 drivers/scsi/scsi_lib.c   | 10 ++++++++++
 drivers/scsi/scsi_priv.h  |  1 +
 include/scsi/scsi_cmnd.h  |  7 +++++++
 4 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index b6c86cce57bf..3de03925550e 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -50,8 +50,6 @@
 
 #include <asm/unaligned.h>
 
-static void scsi_eh_done(struct scsi_cmnd *scmd);
-
 /*
  * These should *probably* be handled by the host itself.
  * Since it is allowed to sleep, it probably should.
@@ -520,7 +518,8 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
 		/* handler does not care. Drop down to default handling */
 	}
 
-	if (scmd->cmnd[0] == TEST_UNIT_READY && scmd->scsi_done != scsi_eh_done)
+	if (scmd->cmnd[0] == TEST_UNIT_READY &&
+	    scmd->submitter != SUBMITTED_BY_SCSI_ERROR_HANDLER)
 		/*
 		 * nasty: for mid-layer issued TURs, we need to return the
 		 * actual sense data without any recovery attempt.  For eh
@@ -782,7 +781,7 @@ static enum scsi_disposition scsi_eh_completed_normally(struct scsi_cmnd *scmd)
  * scsi_eh_done - Completion function for error handling.
  * @scmd:	Cmd that is done.
  */
-static void scsi_eh_done(struct scsi_cmnd *scmd)
+void scsi_eh_done(struct scsi_cmnd *scmd)
 {
 	struct completion *eh_action;
 
@@ -1082,7 +1081,7 @@ static enum scsi_disposition scsi_send_eh_cmnd(struct scsi_cmnd *scmd,
 	shost->eh_action = &done;
 
 	scsi_log_send(scmd);
-	scmd->scsi_done = scsi_eh_done;
+	scmd->submitter = SUBMITTED_BY_SCSI_ERROR_HANDLER;
 
 	/*
 	 * Lock sdev->state_mutex to avoid that scsi_device_quiesce() can
@@ -1109,6 +1108,7 @@ static enum scsi_disposition scsi_send_eh_cmnd(struct scsi_cmnd *scmd,
 	if (rtn) {
 		if (timeleft > stall_for) {
 			scsi_eh_restore_cmnd(scmd, &ses);
+
 			timeleft -= stall_for;
 			msleep(jiffies_to_msecs(stall_for));
 			goto retry;
@@ -2338,11 +2338,6 @@ void scsi_report_device_reset(struct Scsi_Host *shost, int channel, int target)
 }
 EXPORT_SYMBOL(scsi_report_device_reset);
 
-static void
-scsi_reset_provider_done_command(struct scsi_cmnd *scmd)
-{
-}
-
 /**
  * scsi_ioctl_reset: explicitly reset a host/bus/target/device
  * @dev:	scsi_device to operate on
@@ -2379,7 +2374,7 @@ scsi_ioctl_reset(struct scsi_device *dev, int __user *arg)
 	scsi_init_command(dev, scmd);
 	scmd->cmnd = scsi_req(rq)->cmd;
 
-	scmd->scsi_done		= scsi_reset_provider_done_command;
+	scmd->submitter = SUBMITTED_BY_SCSI_RESET_IOCTL;
 	memset(&scmd->sdb, 0, sizeof(scmd->sdb));
 
 	scmd->cmd_len			= 0;
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 5f5ad22512f5..3fd24144b805 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1577,6 +1577,15 @@ static blk_status_t scsi_prepare_cmd(struct request *req)
 
 static void scsi_mq_done(struct scsi_cmnd *cmd)
 {
+	switch (cmd->submitter) {
+	case SUBMITTED_BY_BLOCK_LAYER:
+		break;
+	case SUBMITTED_BY_SCSI_ERROR_HANDLER:
+		return scsi_eh_done(cmd);
+	case SUBMITTED_BY_SCSI_RESET_IOCTL:
+		return;
+	}
+
 	if (unlikely(blk_should_fake_timeout(scsi_cmd_to_rq(cmd)->q)))
 		return;
 	if (unlikely(test_and_set_bit(SCMD_STATE_COMPLETE, &cmd->state)))
@@ -1683,6 +1692,7 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx,
 
 	scsi_set_resid(cmd, 0);
 	memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
+	cmd->submitter = SUBMITTED_BY_BLOCK_LAYER;
 	cmd->scsi_done = scsi_mq_done;
 
 	blk_mq_start_request(req);
diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
index 6d9152031a40..b7f963149352 100644
--- a/drivers/scsi/scsi_priv.h
+++ b/drivers/scsi/scsi_priv.h
@@ -84,6 +84,7 @@ void scsi_eh_ready_devs(struct Scsi_Host *shost,
 int scsi_eh_get_sense(struct list_head *work_q,
 		      struct list_head *done_q);
 int scsi_noretry_cmd(struct scsi_cmnd *scmd);
+void scsi_eh_done(struct scsi_cmnd *scmd);
 
 /* scsi_lib.c */
 extern int scsi_maybe_unblock_host(struct scsi_device *sdev);
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h
index a2315aac93c7..893c24aab8e4 100644
--- a/include/scsi/scsi_cmnd.h
+++ b/include/scsi/scsi_cmnd.h
@@ -64,6 +64,12 @@ struct scsi_pointer {
 #define SCMD_STATE_COMPLETE	0
 #define SCMD_STATE_INFLIGHT	1
 
+enum scsi_cmnd_submitter {
+	SUBMITTED_BY_BLOCK_LAYER = 0,
+	SUBMITTED_BY_SCSI_ERROR_HANDLER = 1,
+	SUBMITTED_BY_SCSI_RESET_IOCTL = 2,
+} __packed;
+
 struct scsi_cmnd {
 	struct scsi_request req;
 	struct scsi_device *device;
@@ -89,6 +95,7 @@ struct scsi_cmnd {
 	unsigned char prot_op;
 	unsigned char prot_type;
 	unsigned char prot_flags;
+	enum scsi_cmnd_submitter submitter;
 
 	unsigned short cmd_len;
 	enum dma_data_direction sc_data_direction;

  reply	other threads:[~2021-10-07 20:29 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-07 20:27 [PATCH v3 00/88] Call scsi_done() directly Bart Van Assche
2021-10-07 20:27 ` Bart Van Assche [this message]
2021-10-07 20:27 ` [PATCH v3 02/88] scsi: core: Rename scsi_mq_done() into scsi_done() and export it Bart Van Assche
2021-10-07 20:27 ` [PATCH v3 03/88] ata: Call scsi_done() directly Bart Van Assche
2021-10-07 20:27 ` [PATCH v3 04/88] firewire: sbp2: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 05/88] ib_srp: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 06/88] message: fusion: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 07/88] zfcp_scsi: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 08/88] 3w-9xxx: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 09/88] 3w-sas: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 10/88] 3w-xxxx: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 11/88] 53c700: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 12/88] BusLogic: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 13/88] NCR5380: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 14/88] a100u2w: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 15/88] aacraid: Introduce aac_scsi_done() Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 16/88] aacraid: Call scsi_done() directly Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 17/88] acornscsi: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 18/88] advansys: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 19/88] aha152x: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 20/88] aha1542: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 21/88] aic7xxx: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 22/88] arcmsr: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 23/88] atp870u: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 24/88] bfa: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 25/88] bnx2fc: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 26/88] csiostor: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 27/88] cxlflash: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 28/88] dc395x: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 29/88] dpt_i2o: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 30/88] esas2r: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 31/88] esp_scsi: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 32/88] fas216: Introduce struct fas216_cmd_priv Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 33/88] fas216: Stop using scsi_cmnd.scsi_done Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 34/88] fdomain: Call scsi_done() directly Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 35/88] fnic: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 36/88] hpsa: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 37/88] hptiop: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 38/88] ibmvscsi: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 39/88] imm: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 40/88] initio: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 41/88] ipr: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 42/88] ips: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 43/88] libfc: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 44/88] libiscsi: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 45/88] libsas: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 46/88] lpfc: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 47/88] mac53c94: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 48/88] megaraid: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 49/88] " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 50/88] mesh: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 51/88] mpi3mr: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 52/88] mpt3sas: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 53/88] mvumi: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 54/88] myrb: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 55/88] myrs: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 56/88] ncr53c8xx: Remove unused code Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 57/88] ncr53c8xx: Call scsi_done() directly Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 58/88] nsp32: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 59/88] pcmcia: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 60/88] pmcraid: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 61/88] ppa: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 62/88] ps3rom: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 63/88] qedf: " Bart Van Assche
2021-10-07 20:28 ` [PATCH v3 64/88] qla1280: " Bart Van Assche
2021-10-07 20:29 ` [PATCH v3 65/88] qla2xxx: " Bart Van Assche
2021-10-07 20:29 ` [PATCH v3 66/88] qla4xxx: " Bart Van Assche
2021-10-07 20:29 ` [PATCH v3 67/88] qlogicfas408: " Bart Van Assche
2021-10-07 20:29 ` [PATCH v3 68/88] qlogicpti: " Bart Van Assche
2021-10-07 20:29 ` [PATCH v3 69/88] scsi_debug: " Bart Van Assche
2021-10-07 21:50   ` Douglas Gilbert
2021-10-07 20:29 ` [PATCH v3 70/88] smartpqi: " Bart Van Assche
2021-10-07 20:29 ` [PATCH v3 71/88] snic: " Bart Van Assche
2021-10-07 20:29 ` [PATCH v3 72/88] stex: " Bart Van Assche
2021-10-07 20:29 ` [PATCH v3 73/88] storvsc_drv: " Bart Van Assche
2021-10-07 20:29 ` [PATCH v3 74/88] sym53c8xx_2: " Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 75/88] ufs: " Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 76/88] virtio_scsi: " Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 77/88] vmw_pvscsi: " Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 78/88] wd33c93: " Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 79/88] wd719x: " Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 80/88] xen-scsifront: " Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 81/88] staging: rts5208: " Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 82/88] staging: unisys: visorhba: " Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 83/88] target/tcm_loop: " Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 84/88] usb: " Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 85/88] scsi: core: Call scsi_done directly Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 86/88] isci: Remove a declaration Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 87/88] fas216: Introduce the function fas216_queue_command_internal() Bart Van Assche
2021-10-07 20:46 ` [PATCH v3 88/88] scsi: Remove the 'done' argument from SCSI queuecommand_lck functions Bart Van Assche
2021-10-17  1:48 ` [PATCH v3 00/88] Call scsi_done() directly Martin K. Petersen
2021-10-21  3:42 ` Martin K. Petersen

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=20211007202923.2174984-2-bvanassche@acm.org \
    --to=bvanassche@acm.org \
    --cc=bblock@linux.ibm.com \
    --cc=beanhuo@micron.com \
    --cc=hare@suse.com \
    --cc=hch@lst.de \
    --cc=jejb@linux.ibm.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=ming.lei@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.