diff options
author | Vasu Dev <vasu.dev@intel.com> | 2009-10-22 18:46:33 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-04 13:00:44 -0500 |
commit | 4a84067dbfce436b81779e585bf712b02ceee552 (patch) | |
tree | f787d413a11c6564ad4440d0a245f56d0e6b73bf /drivers/scsi/scsi.c | |
parent | 14caf44c69184ed72d46a2f883311daf27a4192f (diff) |
[SCSI] add queue_depth ramp up code
Current FC HBA queue_depth ramp up code depends on last queue
full time. The sdev already has last_queue_full_time field to
track last queue full time but stored value is truncated by
last four bits.
So this patch updates last_queue_full_time without truncating
last 4 bits to store full value and then updates its only
current usages in scsi_track_queue_full to ignore last four bits
to keep current usages same while also use this field
in added ramp up code.
Adds scsi_handle_queue_ramp_up to ramp up queue_depth on
successful completion of IO. The scsi_handle_queue_ramp_up will
do ramp up on all luns of a target, just same as ramp down done
on all luns on a target.
The ramp up is skipped in case the change_queue_depth is not
supported by LLD or already reached to added max_queue_depth.
Updates added max_queue_depth on every new update to default
queue_depth value.
The ramp up is also skipped if lapsed time since either last
queue ramp up or down is less than LLD specified
queue_ramp_up_period.
Adds queue_ramp_up_period to sysfs but only if change_queue_depth
is supported since ramp up and queue_ramp_up_period is needed only
in case change_queue_depth is supported first.
Initializes queue_ramp_up_period to 120HZ jiffies as initial
default value, it is same as used in existing lpfc and qla2xxx.
-v2
Combined all ramp code into this single patch.
-v3
Moves max_queue_depth initialization after slave_configure is
called from after slave_alloc calling done. Also adjusted
max_queue_depth check to skip ramp up if current queue_depth
is >= max_queue_depth.
-v4
Changes sdev->queue_ramp_up_period unit to ms when using sysfs i/f
to store or show its value.
Signed-off-by: Vasu Dev <vasu.dev@intel.com>
Tested-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Tested-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/scsi.c')
-rw-r--r-- | drivers/scsi/scsi.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index dd098cad337b..a60da5555577 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c | |||
@@ -940,10 +940,16 @@ EXPORT_SYMBOL(scsi_adjust_queue_depth); | |||
940 | */ | 940 | */ |
941 | int scsi_track_queue_full(struct scsi_device *sdev, int depth) | 941 | int scsi_track_queue_full(struct scsi_device *sdev, int depth) |
942 | { | 942 | { |
943 | if ((jiffies >> 4) == sdev->last_queue_full_time) | 943 | |
944 | /* | ||
945 | * Don't let QUEUE_FULLs on the same | ||
946 | * jiffies count, they could all be from | ||
947 | * same event. | ||
948 | */ | ||
949 | if ((jiffies >> 4) == (sdev->last_queue_full_time >> 4)) | ||
944 | return 0; | 950 | return 0; |
945 | 951 | ||
946 | sdev->last_queue_full_time = (jiffies >> 4); | 952 | sdev->last_queue_full_time = jiffies; |
947 | if (sdev->last_queue_full_depth != depth) { | 953 | if (sdev->last_queue_full_depth != depth) { |
948 | sdev->last_queue_full_count = 1; | 954 | sdev->last_queue_full_count = 1; |
949 | sdev->last_queue_full_depth = depth; | 955 | sdev->last_queue_full_depth = depth; |