All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bart Van Assche <bart.vanassche@sandisk.com>
To: "Martin K . Petersen" <martin.petersen@oracle.com>,
	James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: <linux-scsi@vger.kernel.org>, <linux-block@vger.kernel.org>,
	"Bart Van Assche" <bart.vanassche@sandisk.com>,
	Christoph Hellwig <hch@lst.de>, "Hannes Reinecke" <hare@suse.com>,
	Johannes Thumshirn <jthumshirn@suse.de>
Subject: [PATCH 07/31] scsi: Use blk_mq_rq_to_pdu() to convert a request to a SCSI command pointer
Date: Tue, 23 May 2017 17:33:56 -0700	[thread overview]
Message-ID: <20170524003420.5381-8-bart.vanassche@sandisk.com> (raw)
In-Reply-To: <20170524003420.5381-1-bart.vanassche@sandisk.com>

Since commit e9c787e65c0c ("scsi: allocate scsi_cmnd structures as
part of struct request") struct request and struct scsi_cmnd are
adjacent. This means that there is now an alternative to reading
req->special to convert a pointer to a prepared request into a
SCSI command pointer, namely by using blk_mq_rq_to_pdu(). Make
this change where appropriate. Although this patch does not
change any functionality, it slightly improves performance and
slightly improves readability.

Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Johannes Thumshirn <jthumshirn@suse.de>
---
 drivers/scsi/scsi_error.c |  2 +-
 drivers/scsi/scsi_lib.c   | 18 +++++++++---------
 include/scsi/scsi_tcq.h   |  2 +-
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 19cafa3efb17..7ba5f988426c 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -265,7 +265,7 @@ void scsi_eh_scmd_add(struct scsi_cmnd *scmd)
  */
 enum blk_eh_timer_return scsi_times_out(struct request *req)
 {
-	struct scsi_cmnd *scmd = req->special;
+	struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(req);
 	enum blk_eh_timer_return rtn = BLK_EH_NOT_HANDLED;
 	struct Scsi_Host *host = scmd->device->host;
 
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 5c6874cf4388..30a7900d331c 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -637,7 +637,7 @@ static void scsi_release_bidi_buffers(struct scsi_cmnd *cmd)
 static bool scsi_end_request(struct request *req, int error,
 		unsigned int bytes, unsigned int bidi_bytes)
 {
-	struct scsi_cmnd *cmd = req->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
 	struct scsi_device *sdev = cmd->device;
 	struct request_queue *q = sdev->request_queue;
 
@@ -1156,7 +1156,7 @@ void scsi_init_command(struct scsi_device *dev, struct scsi_cmnd *cmd)
 
 static int scsi_setup_scsi_cmnd(struct scsi_device *sdev, struct request *req)
 {
-	struct scsi_cmnd *cmd = req->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
 
 	/*
 	 * Passthrough requests may transfer data, in which case they must
@@ -1187,7 +1187,7 @@ static int scsi_setup_scsi_cmnd(struct scsi_device *sdev, struct request *req)
  */
 static int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req)
 {
-	struct scsi_cmnd *cmd = req->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
 
 	if (unlikely(sdev->handler && sdev->handler->prep_fn)) {
 		int ret = sdev->handler->prep_fn(sdev, req);
@@ -1202,7 +1202,7 @@ static int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req)
 
 static int scsi_setup_cmnd(struct scsi_device *sdev, struct request *req)
 {
-	struct scsi_cmnd *cmd = req->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
 
 	if (!blk_rq_bytes(req))
 		cmd->sc_data_direction = DMA_NONE;
@@ -1339,7 +1339,7 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req)
 
 static void scsi_unprep_fn(struct request_queue *q, struct request *req)
 {
-	scsi_uninit_cmd(req->special);
+	scsi_uninit_cmd(blk_mq_rq_to_pdu(req));
 }
 
 /*
@@ -1530,7 +1530,7 @@ static int scsi_lld_busy(struct request_queue *q)
  */
 static void scsi_kill_request(struct request *req, struct request_queue *q)
 {
-	struct scsi_cmnd *cmd = req->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
 	struct scsi_device *sdev;
 	struct scsi_target *starget;
 	struct Scsi_Host *shost;
@@ -1561,7 +1561,7 @@ static void scsi_kill_request(struct request *req, struct request_queue *q)
 
 static void scsi_softirq_done(struct request *rq)
 {
-	struct scsi_cmnd *cmd = rq->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
 	unsigned long wait_for = (cmd->allowed + 1) * rq->timeout;
 	int disposition;
 
@@ -1749,8 +1749,8 @@ static void scsi_request_fn(struct request_queue *q)
 			blk_start_request(req);
 
 		spin_unlock_irq(q->queue_lock);
-		cmd = req->special;
-		if (unlikely(cmd == NULL)) {
+		cmd = blk_mq_rq_to_pdu(req);
+		if (cmd != req->special) {
 			printk(KERN_CRIT "impossible request in %s.\n"
 					 "please mail a stack trace to "
 					 "linux-scsi@vger.kernel.org\n",
diff --git a/include/scsi/scsi_tcq.h b/include/scsi/scsi_tcq.h
index 4416b1026189..5b416debf101 100644
--- a/include/scsi/scsi_tcq.h
+++ b/include/scsi/scsi_tcq.h
@@ -39,7 +39,7 @@ static inline struct scsi_cmnd *scsi_host_find_tag(struct Scsi_Host *shost,
 
 	if (!req)
 		return NULL;
-	return req->special;
+	return blk_mq_rq_to_pdu(req);
 }
 
 #endif /* CONFIG_BLOCK */
-- 
2.12.2

WARNING: multiple messages have this Message-ID (diff)
From: Bart Van Assche <bart.vanassche@sandisk.com>
To: "Martin K . Petersen" <martin.petersen@oracle.com>,
	James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org,
	Bart Van Assche <bart.vanassche@sandisk.com>,
	Christoph Hellwig <hch@lst.de>, Hannes Reinecke <hare@suse.com>,
	Johannes Thumshirn <jthumshirn@suse.de>
Subject: [PATCH 07/31] scsi: Use blk_mq_rq_to_pdu() to convert a request to a SCSI command pointer
Date: Tue, 23 May 2017 17:33:56 -0700	[thread overview]
Message-ID: <20170524003420.5381-8-bart.vanassche@sandisk.com> (raw)
In-Reply-To: <20170524003420.5381-1-bart.vanassche@sandisk.com>

Since commit e9c787e65c0c ("scsi: allocate scsi_cmnd structures as
part of struct request") struct request and struct scsi_cmnd are
adjacent. This means that there is now an alternative to reading
req->special to convert a pointer to a prepared request into a
SCSI command pointer, namely by using blk_mq_rq_to_pdu(). Make
this change where appropriate. Although this patch does not
change any functionality, it slightly improves performance and
slightly improves readability.

Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Johannes Thumshirn <jthumshirn@suse.de>
---
 drivers/scsi/scsi_error.c |  2 +-
 drivers/scsi/scsi_lib.c   | 18 +++++++++---------
 include/scsi/scsi_tcq.h   |  2 +-
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 19cafa3efb17..7ba5f988426c 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -265,7 +265,7 @@ void scsi_eh_scmd_add(struct scsi_cmnd *scmd)
  */
 enum blk_eh_timer_return scsi_times_out(struct request *req)
 {
-	struct scsi_cmnd *scmd = req->special;
+	struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(req);
 	enum blk_eh_timer_return rtn = BLK_EH_NOT_HANDLED;
 	struct Scsi_Host *host = scmd->device->host;
 
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 5c6874cf4388..30a7900d331c 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -637,7 +637,7 @@ static void scsi_release_bidi_buffers(struct scsi_cmnd *cmd)
 static bool scsi_end_request(struct request *req, int error,
 		unsigned int bytes, unsigned int bidi_bytes)
 {
-	struct scsi_cmnd *cmd = req->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
 	struct scsi_device *sdev = cmd->device;
 	struct request_queue *q = sdev->request_queue;
 
@@ -1156,7 +1156,7 @@ void scsi_init_command(struct scsi_device *dev, struct scsi_cmnd *cmd)
 
 static int scsi_setup_scsi_cmnd(struct scsi_device *sdev, struct request *req)
 {
-	struct scsi_cmnd *cmd = req->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
 
 	/*
 	 * Passthrough requests may transfer data, in which case they must
@@ -1187,7 +1187,7 @@ static int scsi_setup_scsi_cmnd(struct scsi_device *sdev, struct request *req)
  */
 static int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req)
 {
-	struct scsi_cmnd *cmd = req->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
 
 	if (unlikely(sdev->handler && sdev->handler->prep_fn)) {
 		int ret = sdev->handler->prep_fn(sdev, req);
@@ -1202,7 +1202,7 @@ static int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req)
 
 static int scsi_setup_cmnd(struct scsi_device *sdev, struct request *req)
 {
-	struct scsi_cmnd *cmd = req->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
 
 	if (!blk_rq_bytes(req))
 		cmd->sc_data_direction = DMA_NONE;
@@ -1339,7 +1339,7 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req)
 
 static void scsi_unprep_fn(struct request_queue *q, struct request *req)
 {
-	scsi_uninit_cmd(req->special);
+	scsi_uninit_cmd(blk_mq_rq_to_pdu(req));
 }
 
 /*
@@ -1530,7 +1530,7 @@ static int scsi_lld_busy(struct request_queue *q)
  */
 static void scsi_kill_request(struct request *req, struct request_queue *q)
 {
-	struct scsi_cmnd *cmd = req->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req);
 	struct scsi_device *sdev;
 	struct scsi_target *starget;
 	struct Scsi_Host *shost;
@@ -1561,7 +1561,7 @@ static void scsi_kill_request(struct request *req, struct request_queue *q)
 
 static void scsi_softirq_done(struct request *rq)
 {
-	struct scsi_cmnd *cmd = rq->special;
+	struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
 	unsigned long wait_for = (cmd->allowed + 1) * rq->timeout;
 	int disposition;
 
@@ -1749,8 +1749,8 @@ static void scsi_request_fn(struct request_queue *q)
 			blk_start_request(req);
 
 		spin_unlock_irq(q->queue_lock);
-		cmd = req->special;
-		if (unlikely(cmd == NULL)) {
+		cmd = blk_mq_rq_to_pdu(req);
+		if (cmd != req->special) {
 			printk(KERN_CRIT "impossible request in %s.\n"
 					 "please mail a stack trace to "
 					 "linux-scsi@vger.kernel.org\n",
diff --git a/include/scsi/scsi_tcq.h b/include/scsi/scsi_tcq.h
index 4416b1026189..5b416debf101 100644
--- a/include/scsi/scsi_tcq.h
+++ b/include/scsi/scsi_tcq.h
@@ -39,7 +39,7 @@ static inline struct scsi_cmnd *scsi_host_find_tag(struct Scsi_Host *shost,
 
 	if (!req)
 		return NULL;
-	return req->special;
+	return blk_mq_rq_to_pdu(req);
 }
 
 #endif /* CONFIG_BLOCK */
-- 
2.12.2

  parent reply	other threads:[~2017-05-24  0:34 UTC|newest]

Thread overview: 121+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-24  0:33 [PATCH 00/31] SCSI patches for kernel v4.13 Bart Van Assche
2017-05-24  0:33 ` Bart Van Assche
2017-05-24  0:33 ` [PATCH 01/31] Split scsi_internal_device_block() Bart Van Assche
2017-05-24  0:33   ` Bart Van Assche
2017-05-24  5:48   ` Hannes Reinecke
2017-05-24  7:36   ` Johannes Thumshirn
2017-05-24  0:33 ` [PATCH 02/31] Create two versions of scsi_internal_device_unblock() Bart Van Assche
2017-05-24  0:33   ` Bart Van Assche
2017-05-24  5:48   ` Hannes Reinecke
2017-05-24  7:38   ` Johannes Thumshirn
2017-05-24  0:33 ` [PATCH 03/31] Protect SCSI device state changes with a mutex Bart Van Assche
2017-05-24  0:33   ` Bart Van Assche
2017-05-24  5:51   ` Hannes Reinecke
2017-05-24 15:10     ` Bart Van Assche
2017-05-24 15:10       ` Bart Van Assche
2017-05-24  0:33 ` [PATCH 04/31] Introduce scsi_start_queue() Bart Van Assche
2017-05-24  0:33   ` Bart Van Assche
2017-05-24  5:51   ` Hannes Reinecke
2017-05-24  0:33 ` [PATCH 05/31] Make __scsi_remove_device go straight from BLOCKED to DEL Bart Van Assche
2017-05-24  0:33   ` Bart Van Assche
2017-05-24  5:52   ` Hannes Reinecke
2017-05-24  0:33 ` [PATCH 06/31] scmd_eh_abort_handler(): Add a comment Bart Van Assche
2017-05-24  0:33   ` Bart Van Assche
2017-05-24  5:53   ` Hannes Reinecke
2017-05-24  0:33 ` Bart Van Assche [this message]
2017-05-24  0:33   ` [PATCH 07/31] scsi: Use blk_mq_rq_to_pdu() to convert a request to a SCSI command pointer Bart Van Assche
2017-05-24  5:54   ` Hannes Reinecke
2017-05-24  7:50   ` Johannes Thumshirn
2017-05-24  0:33 ` [PATCH 08/31] sd, sr: Convert two assignments into warning statements Bart Van Assche
2017-05-24  0:33   ` Bart Van Assche
2017-05-24  5:55   ` Hannes Reinecke
2017-05-24  7:52   ` Johannes Thumshirn
2017-05-24  0:33 ` [PATCH 09/31] block: Avoid that blk_exit_rl() triggers a use-after-free Bart Van Assche
2017-05-24  0:33   ` Bart Van Assche
2017-05-24  5:55   ` Hannes Reinecke
2017-05-24 15:09   ` Tejun Heo
2017-05-24  0:33 ` [PATCH 10/31] Avoid that scsi_exit_rq() " Bart Van Assche
2017-05-24  0:33   ` Bart Van Assche
2017-05-24  5:58   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 11/31] block: Introduce queue flag QUEUE_FLAG_SCSI_SUP Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:01   ` Hannes Reinecke
2017-05-24 15:05     ` Bart Van Assche
2017-05-24 15:05       ` Bart Van Assche
2017-05-24  0:34 ` [PATCH 12/31] bsg: Check queue type before attaching to a queue Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:01   ` Hannes Reinecke
2017-05-25  2:01   ` Martin K. Petersen
2017-05-25  2:01     ` Martin K. Petersen
2017-05-24  0:34 ` [PATCH 13/31] pktcdvd: " Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:02   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 14/31] cdrom: Check private request size " Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:02   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 15/31] nfsd: Check private request size before submitting a SCSI request Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:02   ` Hannes Reinecke
2017-05-24  6:02     ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 16/31] scsi: Make scsi_ioctl_reset() pass the request queue pointer to blk_rq_init() Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:03   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 17/31] block: Introduce request_queue.initialize_rq_fn() Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:04   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 18/31] block: Make scsi_req_init() calls implicit Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:05   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 19/31] scsi: Change argument type of scsi_req_init() Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:06   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 20/31] scsi: Only add commands to the device command list if required by the LLD Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:07   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 21/31] scsi: Move most of scsi_init_command() into scsi_initialize_rq() Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:09   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 22/31] scsi: Inline scsi_init_command() Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:09   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 23/31] scsi: Move sense buffer pointer initialization into scsi_initialize_rq() Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:10   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 24/31] scsi: Make scsi_initialize_rq() zero the entire struct scsi_cmnd Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:10   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 25/31] scsi-mq: Make behavior scsi_mq_prep_fn() closer to that of scsi_prep_fn() Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:11   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 26/31] scsi: Move the code for clearing private command data into scsi_dispatch_cmd() Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:12   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 27/31] scsi: Consolidate more initialization code Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:13   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 28/31] scsi_setup_fs_cmnd(): Call scsi_req_init() instead of open-coding it Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:13   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 29/31] scsi: snic: Remove code that zeroes driver-private command data Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:14   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 30/31] scsi: virtio: " Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:14   ` Hannes Reinecke
2017-05-24  0:34 ` [PATCH 31/31] xen/scsifront: " Bart Van Assche
2017-05-24  0:34   ` Bart Van Assche
2017-05-24  6:14   ` Hannes Reinecke
2017-05-24  6:14   ` Hannes Reinecke
2017-05-24  7:02   ` Juergen Gross
2017-05-24  7:02   ` Juergen Gross
2017-05-24  0:34 ` Bart Van Assche
2017-05-24  2:31 ` [PATCH 00/31] SCSI patches for kernel v4.13 Martin K. Petersen
2017-05-24  2:31   ` Martin K. Petersen
2017-05-24  3:55 ` Jens Axboe
2017-05-24  4:43   ` Bart Van Assche
2017-05-24  4:43     ` Bart Van Assche
2017-05-25  2:04 ` Martin K. Petersen
2017-05-25  2:04   ` Martin K. Petersen
2017-06-01 14:08   ` Bart Van Assche
2017-06-01 14:08     ` Bart Van Assche
2017-06-01 14:09     ` Christoph Hellwig

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=20170524003420.5381-8-bart.vanassche@sandisk.com \
    --to=bart.vanassche@sandisk.com \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=hare@suse.com \
    --cc=hch@lst.de \
    --cc=jthumshirn@suse.de \
    --cc=linux-block@vger.kernel.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 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.