[PATCH] 4/7 cleanup/consolidate code in scsi_request_fn

Patrick Mansfield
2003-03-25T02:06:05Z

Cleanup and consolidate scsi_device and scsi_host checks in
scsi_request_fn.

diff -purN -X /home/patman/dontdiff lun-single-25/drivers/scsi/scsi_lib.c req_fn-cleanup-25/drivers/scsi/scsi_lib.c
--- lun-single-25/drivers/scsi/scsi_lib.c Mon Mar 24 12:14:55 2003
+++ req_fn-cleanup-25/drivers/scsi/scsi_lib.c Mon Mar 24 12:15:01 2003
@@ -1043,6 +1043,79 @@ static int scsi_prep_fn(struct request_q
}

/*
+ * scsi_check_sdev: if we can send requests to sdev, return 0 else return 1.
+ *
+ * Called with the queue_lock held.
+ */
+static inline int scsi_check_sdev(struct request_queue *q,
+ struct scsi_device *sdev)
+{
+ if (sdev->device_busy >= sdev->queue_depth)
+ return 1;
+ if (sdev->device_busy == 0 && sdev->device_blocked) {
+ /*
+ * unblock after device_blocked iterates to zero
+ */
+ if (--sdev->device_blocked == 0) {
+ SCSI_LOG_MLQUEUE(3,
+ printk("scsi%d (%d:%d) unblocking device at"
+ " zero depth\n", sdev->host->host_no,
+ sdev->id, sdev->lun));
+ } else {
+ blk_plug_device(q);
+ return 1;
+ }
+ }
+ if (sdev->device_blocked)
+ return 1;
+
+ return 0;
+}
+
+/*
+ * scsi_check_shost: if we can send requests to shost, return 0 else return 1.
+ *
+ * Called with the queue_lock held.
+ */
+static inline int scsi_check_shost(struct request_queue *q,
+ struct Scsi_Host *shost,
+ struct scsi_device *sdev)
+{
+ if (shost->in_recovery)
+ return 1;
+ if (shost->host_busy == 0 && shost->host_blocked) {
+ /*
+ * unblock after host_blocked iterates to zero
+ */
+ if (--shost->host_blocked == 0) {
+ SCSI_LOG_MLQUEUE(3,
+ printk("scsi%d unblocking host at zero depth\n",
+ shost->host_no));
+ } else {
+ blk_plug_device(q);
+ return 1;
+ }
+ }
+ if (!list_empty(&sdev->starved_entry))
+ return 1;
+ if ((shost->can_queue > 0 && shost->host_busy >= shost->can_queue) ||
+ shost->host_blocked || shost->host_self_blocked) {
+ SCSI_LOG_MLQUEUE(3,
+ printk("add starved dev <%d,%d,%d,%d>; host "
+ "limit %d, busy %d, blocked %d selfblocked %d\n",
+ sdev->host->host_no, sdev->channel,
+ sdev->id, sdev->lun,
+ shost->can_queue, shost->host_busy,
+ shost->host_blocked, shost->host_self_blocked));
+ list_add_tail(&sdev->starved_entry,
+ &shost->starved_list);
+ return 1;
+ }
+
+ return 0;
+}
+
+/*
* Function: scsi_request_fn()
*
* Purpose: Main strategy routine for SCSI.
@@ -1067,13 +1140,8 @@ static void scsi_request_fn(request_queu
* the host is no longer able to accept any more requests.
*/
for (;;) {
- /*
- * Check this again - each time we loop through we will have
- * released the lock and grabbed it again, so each time
- * we need to check to see if the queue is plugged or not.
- */
- if (shost->in_recovery || blk_queue_plugged(q))
- return;
+ if (blk_queue_plugged(q))
+ break;

/*
* get next queueable request. We do this early to make sure
@@ -1083,48 +1151,11 @@ static void scsi_request_fn(request_queu
*/
req = elv_next_request(q);

- if (sdev->device_busy >= sdev->queue_depth)
- break;
-
- if (shost->host_busy == 0 && shost->host_blocked) {
- /* unblock after host_blocked iterates to zero */
- if (--shost->host_blocked == 0) {
- SCSI_LOG_MLQUEUE(3,
- printk("scsi%d unblocking host at zero depth\n",
- shost->host_no));
- } else {
- blk_plug_device(q);
- break;
- }
- }
-
- if (sdev->device_busy == 0 && sdev->device_blocked) {
- /* unblock after device_blocked iterates to zero */
- if (--sdev->device_blocked == 0) {
- SCSI_LOG_MLQUEUE(3,
- printk("scsi%d (%d:%d) unblocking device at zero depth\n",
- shost->host_no, sdev->id, sdev->lun));
- } else {
- blk_plug_device(q);
- break;
- }
- }
-
- /*
- * If the device cannot accept another request, then quit.
- */
- if (sdev->device_blocked)
- break;
-
- if (!list_empty(&sdev->starved_entry))
+ if (scsi_check_sdev(q, sdev))
break;

- if ((shost->can_queue > 0 && shost->host_busy >= shost->can_queue) ||
- shost->host_blocked || shost->host_self_blocked) {
- list_add_tail(&sdev->starved_entry,
- &shost->starved_list);
+ if (scsi_check_shost(q, shost, sdev))
break;
- }

if (sdev->single_lun && scsi_single_lun_check(sdev))
break;
@@ -1140,7 +1171,7 @@ static void scsi_request_fn(request_queu
/* If the device is busy, a returning I/O
* will restart the queue. Otherwise, we have
* to plug the queue */
- if(sdev->device_busy == 0)
+ if (sdev->device_busy == 0)
blk_plug_device(q);
break;
}