[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>
This commit is contained in:
committed by
James Bottomley
parent
14caf44c69
commit
4a84067dbf
@@ -331,6 +331,42 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
|
||||
}
|
||||
}
|
||||
|
||||
static void scsi_handle_queue_ramp_up(struct scsi_device *sdev)
|
||||
{
|
||||
struct scsi_host_template *sht = sdev->host->hostt;
|
||||
struct scsi_device *tmp_sdev;
|
||||
|
||||
if (!sht->change_queue_depth ||
|
||||
sdev->queue_depth >= sdev->max_queue_depth)
|
||||
return;
|
||||
|
||||
if (time_before(jiffies,
|
||||
sdev->last_queue_ramp_up + sdev->queue_ramp_up_period))
|
||||
return;
|
||||
|
||||
if (time_before(jiffies,
|
||||
sdev->last_queue_full_time + sdev->queue_ramp_up_period))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Walk all devices of a target and do
|
||||
* ramp up on them.
|
||||
*/
|
||||
shost_for_each_device(tmp_sdev, sdev->host) {
|
||||
if (tmp_sdev->channel != sdev->channel ||
|
||||
tmp_sdev->id != sdev->id ||
|
||||
tmp_sdev->queue_depth == sdev->max_queue_depth)
|
||||
continue;
|
||||
/*
|
||||
* call back into LLD to increase queue_depth by one
|
||||
* with ramp up reason code.
|
||||
*/
|
||||
sht->change_queue_depth(tmp_sdev, tmp_sdev->queue_depth + 1,
|
||||
SCSI_QDEPTH_RAMP_UP);
|
||||
sdev->last_queue_ramp_up = jiffies;
|
||||
}
|
||||
}
|
||||
|
||||
static void scsi_handle_queue_full(struct scsi_device *sdev)
|
||||
{
|
||||
struct scsi_host_template *sht = sdev->host->hostt;
|
||||
@@ -393,6 +429,7 @@ static int scsi_eh_completed_normally(struct scsi_cmnd *scmd)
|
||||
*/
|
||||
switch (status_byte(scmd->result)) {
|
||||
case GOOD:
|
||||
scsi_handle_queue_ramp_up(scmd->device);
|
||||
case COMMAND_TERMINATED:
|
||||
return SUCCESS;
|
||||
case CHECK_CONDITION:
|
||||
@@ -1425,6 +1462,7 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
|
||||
*/
|
||||
return ADD_TO_MLQUEUE;
|
||||
case GOOD:
|
||||
scsi_handle_queue_ramp_up(scmd->device);
|
||||
case COMMAND_TERMINATED:
|
||||
return SUCCESS;
|
||||
case TASK_ABORTED:
|
||||
|
Reference in New Issue
Block a user