[SCSI] lpfc 8.3.45: Incorporate changes to use reason in change_queue_depth function.
Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
1ba981fd3a
commit
6ff8556d5f
|
@ -73,8 +73,6 @@ struct lpfc_sli2_slim;
|
||||||
*/
|
*/
|
||||||
/* 1 Second */
|
/* 1 Second */
|
||||||
#define QUEUE_RAMP_DOWN_INTERVAL (msecs_to_jiffies(1000 * 1))
|
#define QUEUE_RAMP_DOWN_INTERVAL (msecs_to_jiffies(1000 * 1))
|
||||||
/* 5 minutes */
|
|
||||||
#define QUEUE_RAMP_UP_INTERVAL (msecs_to_jiffies(1000 * 300))
|
|
||||||
|
|
||||||
/* Number of exchanges reserved for discovery to complete */
|
/* Number of exchanges reserved for discovery to complete */
|
||||||
#define LPFC_DISC_IOCB_BUFF_COUNT 20
|
#define LPFC_DISC_IOCB_BUFF_COUNT 20
|
||||||
|
@ -885,7 +883,6 @@ struct lpfc_hba {
|
||||||
atomic_t num_cmd_success;
|
atomic_t num_cmd_success;
|
||||||
unsigned long last_rsrc_error_time;
|
unsigned long last_rsrc_error_time;
|
||||||
unsigned long last_ramp_down_time;
|
unsigned long last_ramp_down_time;
|
||||||
unsigned long last_ramp_up_time;
|
|
||||||
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||||
struct dentry *hba_debugfs_root;
|
struct dentry *hba_debugfs_root;
|
||||||
atomic_t debugfs_vport_count;
|
atomic_t debugfs_vport_count;
|
||||||
|
|
|
@ -405,7 +405,6 @@ void lpfc_fabric_block_timeout(unsigned long);
|
||||||
void lpfc_unblock_fabric_iocbs(struct lpfc_hba *);
|
void lpfc_unblock_fabric_iocbs(struct lpfc_hba *);
|
||||||
void lpfc_rampdown_queue_depth(struct lpfc_hba *);
|
void lpfc_rampdown_queue_depth(struct lpfc_hba *);
|
||||||
void lpfc_ramp_down_queue_handler(struct lpfc_hba *);
|
void lpfc_ramp_down_queue_handler(struct lpfc_hba *);
|
||||||
void lpfc_ramp_up_queue_handler(struct lpfc_hba *);
|
|
||||||
void lpfc_scsi_dev_block(struct lpfc_hba *);
|
void lpfc_scsi_dev_block(struct lpfc_hba *);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -674,8 +674,6 @@ lpfc_work_done(struct lpfc_hba *phba)
|
||||||
lpfc_fdmi_timeout_handler(vport);
|
lpfc_fdmi_timeout_handler(vport);
|
||||||
if (work_port_events & WORKER_RAMP_DOWN_QUEUE)
|
if (work_port_events & WORKER_RAMP_DOWN_QUEUE)
|
||||||
lpfc_ramp_down_queue_handler(phba);
|
lpfc_ramp_down_queue_handler(phba);
|
||||||
if (work_port_events & WORKER_RAMP_UP_QUEUE)
|
|
||||||
lpfc_ramp_up_queue_handler(phba);
|
|
||||||
if (work_port_events & WORKER_DELAYED_DISC_TMO)
|
if (work_port_events & WORKER_DELAYED_DISC_TMO)
|
||||||
lpfc_delayed_disc_timeout_handler(vport);
|
lpfc_delayed_disc_timeout_handler(vport);
|
||||||
}
|
}
|
||||||
|
|
|
@ -315,7 +315,25 @@ lpfc_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason)
|
||||||
unsigned long new_queue_depth, old_queue_depth;
|
unsigned long new_queue_depth, old_queue_depth;
|
||||||
|
|
||||||
old_queue_depth = sdev->queue_depth;
|
old_queue_depth = sdev->queue_depth;
|
||||||
scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), qdepth);
|
|
||||||
|
switch (reason) {
|
||||||
|
case SCSI_QDEPTH_DEFAULT:
|
||||||
|
/* change request from sysfs, fall through */
|
||||||
|
case SCSI_QDEPTH_RAMP_UP:
|
||||||
|
scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), qdepth);
|
||||||
|
break;
|
||||||
|
case SCSI_QDEPTH_QFULL:
|
||||||
|
if (scsi_track_queue_full(sdev, qdepth) == 0)
|
||||||
|
return sdev->queue_depth;
|
||||||
|
|
||||||
|
lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
|
||||||
|
"0711 detected queue full - lun queue "
|
||||||
|
"depth adjusted to %d.\n", sdev->queue_depth);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
new_queue_depth = sdev->queue_depth;
|
new_queue_depth = sdev->queue_depth;
|
||||||
rdata = lpfc_rport_data_from_scsi_device(sdev);
|
rdata = lpfc_rport_data_from_scsi_device(sdev);
|
||||||
if (rdata)
|
if (rdata)
|
||||||
|
@ -387,50 +405,6 @@ lpfc_rampdown_queue_depth(struct lpfc_hba *phba)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* lpfc_rampup_queue_depth - Post RAMP_UP_QUEUE event for worker thread
|
|
||||||
* @phba: The Hba for which this call is being executed.
|
|
||||||
*
|
|
||||||
* This routine post WORKER_RAMP_UP_QUEUE event for @phba vport. This routine
|
|
||||||
* post at most 1 event every 5 minute after last_ramp_up_time or
|
|
||||||
* last_rsrc_error_time. This routine wakes up worker thread of @phba
|
|
||||||
* to process WORKER_RAM_DOWN_EVENT event.
|
|
||||||
*
|
|
||||||
* This routine should be called with no lock held.
|
|
||||||
**/
|
|
||||||
static inline void
|
|
||||||
lpfc_rampup_queue_depth(struct lpfc_vport *vport,
|
|
||||||
uint32_t queue_depth)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
struct lpfc_hba *phba = vport->phba;
|
|
||||||
uint32_t evt_posted;
|
|
||||||
atomic_inc(&phba->num_cmd_success);
|
|
||||||
|
|
||||||
if (vport->cfg_lun_queue_depth <= queue_depth)
|
|
||||||
return;
|
|
||||||
spin_lock_irqsave(&phba->hbalock, flags);
|
|
||||||
if (time_before(jiffies,
|
|
||||||
phba->last_ramp_up_time + QUEUE_RAMP_UP_INTERVAL) ||
|
|
||||||
time_before(jiffies,
|
|
||||||
phba->last_rsrc_error_time + QUEUE_RAMP_UP_INTERVAL)) {
|
|
||||||
spin_unlock_irqrestore(&phba->hbalock, flags);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
phba->last_ramp_up_time = jiffies;
|
|
||||||
spin_unlock_irqrestore(&phba->hbalock, flags);
|
|
||||||
|
|
||||||
spin_lock_irqsave(&phba->pport->work_port_lock, flags);
|
|
||||||
evt_posted = phba->pport->work_port_events & WORKER_RAMP_UP_QUEUE;
|
|
||||||
if (!evt_posted)
|
|
||||||
phba->pport->work_port_events |= WORKER_RAMP_UP_QUEUE;
|
|
||||||
spin_unlock_irqrestore(&phba->pport->work_port_lock, flags);
|
|
||||||
|
|
||||||
if (!evt_posted)
|
|
||||||
lpfc_worker_wake_up(phba);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* lpfc_ramp_down_queue_handler - WORKER_RAMP_DOWN_QUEUE event handler
|
* lpfc_ramp_down_queue_handler - WORKER_RAMP_DOWN_QUEUE event handler
|
||||||
* @phba: The Hba for which this call is being executed.
|
* @phba: The Hba for which this call is being executed.
|
||||||
|
@ -482,41 +456,6 @@ lpfc_ramp_down_queue_handler(struct lpfc_hba *phba)
|
||||||
atomic_set(&phba->num_cmd_success, 0);
|
atomic_set(&phba->num_cmd_success, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* lpfc_ramp_up_queue_handler - WORKER_RAMP_UP_QUEUE event handler
|
|
||||||
* @phba: The Hba for which this call is being executed.
|
|
||||||
*
|
|
||||||
* This routine is called to process WORKER_RAMP_UP_QUEUE event for worker
|
|
||||||
* thread.This routine increases queue depth for all scsi device on each vport
|
|
||||||
* associated with @phba by 1. This routine also sets @phba num_rsrc_err and
|
|
||||||
* num_cmd_success to zero.
|
|
||||||
**/
|
|
||||||
void
|
|
||||||
lpfc_ramp_up_queue_handler(struct lpfc_hba *phba)
|
|
||||||
{
|
|
||||||
struct lpfc_vport **vports;
|
|
||||||
struct Scsi_Host *shost;
|
|
||||||
struct scsi_device *sdev;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
vports = lpfc_create_vport_work_array(phba);
|
|
||||||
if (vports != NULL)
|
|
||||||
for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
|
|
||||||
shost = lpfc_shost_from_vport(vports[i]);
|
|
||||||
shost_for_each_device(sdev, shost) {
|
|
||||||
if (vports[i]->cfg_lun_queue_depth <=
|
|
||||||
sdev->queue_depth)
|
|
||||||
continue;
|
|
||||||
lpfc_change_queue_depth(sdev,
|
|
||||||
sdev->queue_depth+1,
|
|
||||||
SCSI_QDEPTH_RAMP_UP);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lpfc_destroy_vport_work_array(phba, vports);
|
|
||||||
atomic_set(&phba->num_rsrc_err, 0);
|
|
||||||
atomic_set(&phba->num_cmd_success, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* lpfc_scsi_dev_block - set all scsi hosts to block state
|
* lpfc_scsi_dev_block - set all scsi hosts to block state
|
||||||
* @phba: Pointer to HBA context object.
|
* @phba: Pointer to HBA context object.
|
||||||
|
@ -4040,7 +3979,6 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
|
||||||
struct lpfc_nodelist *pnode = rdata->pnode;
|
struct lpfc_nodelist *pnode = rdata->pnode;
|
||||||
struct scsi_cmnd *cmd;
|
struct scsi_cmnd *cmd;
|
||||||
int result;
|
int result;
|
||||||
struct scsi_device *tmp_sdev;
|
|
||||||
int depth;
|
int depth;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct lpfc_fast_path_event *fast_path_evt;
|
struct lpfc_fast_path_event *fast_path_evt;
|
||||||
|
@ -4285,32 +4223,6 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!result)
|
|
||||||
lpfc_rampup_queue_depth(vport, queue_depth);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check for queue full. If the lun is reporting queue full, then
|
|
||||||
* back off the lun queue depth to prevent target overloads.
|
|
||||||
*/
|
|
||||||
if (result == SAM_STAT_TASK_SET_FULL && pnode &&
|
|
||||||
NLP_CHK_NODE_ACT(pnode)) {
|
|
||||||
shost_for_each_device(tmp_sdev, shost) {
|
|
||||||
if (tmp_sdev->id != scsi_id)
|
|
||||||
continue;
|
|
||||||
depth = scsi_track_queue_full(tmp_sdev,
|
|
||||||
tmp_sdev->queue_depth-1);
|
|
||||||
if (depth <= 0)
|
|
||||||
continue;
|
|
||||||
lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
|
|
||||||
"0711 detected queue full - lun queue "
|
|
||||||
"depth adjusted to %d.\n", depth);
|
|
||||||
lpfc_send_sdev_queuedepth_change_event(phba, vport,
|
|
||||||
pnode,
|
|
||||||
tmp_sdev->lun,
|
|
||||||
depth+1, depth);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock_irqsave(&phba->hbalock, flags);
|
spin_lock_irqsave(&phba->hbalock, flags);
|
||||||
lpfc_cmd->pCmd = NULL;
|
lpfc_cmd->pCmd = NULL;
|
||||||
spin_unlock_irqrestore(&phba->hbalock, flags);
|
spin_unlock_irqrestore(&phba->hbalock, flags);
|
||||||
|
|
Loading…
Reference in New Issue