On 09/04/2009 04:43 PM, Vasu Dev wrote:
I agree all FC HBA should handle both ramp down and up as per added new change_queue_depth interface by this series. I did this for libfc/fcoe and Chrirstof did this for zfcp driver but lpfc& qla2xxx got only ramp down changes from Mike, now that Mike is busy with other stuff I don't know how to complete them in this series since I don't understand lpfc and qla2xxx enough and neither I have way to test changes to these drivers.
The qla2xxxx conversion seems a lot easier than lpfc (at least a lot closer to what is being done in the common code Vasu added). I am attaching a patch made over this patchset that converts it to use the common ramp up code. I have only compile tested it.
Andrew, could you have your guys give it a spin? Did you guys test out the rampdown/qfull handling?
From d8a94c82ce28837ce8a05349fc073b895813601d Mon Sep 17 00:00:00 2001 From: Mike Christie <michaelc@xxxxxxxxxxx> Date: Fri, 11 Sep 2009 11:43:40 -0500 Subject: [PATCH 1/1] qla2xxx: hook qla2xxx into common ramp up code This hooks qla2xxx into the common ramp up code. This q depth behavior should be the same as before. The only change should be that you use the common scsi device sysfs interface to set the ramp up period instead of using the qla2xxx mod param. This patch was made over the rampdown/qfull handling patch. It is only compile tested. Signed-off-by: Mike Christie <michaelc@xxxxxxxxxxx> --- drivers/scsi/qla2xxx/qla_def.h | 3 -- drivers/scsi/qla2xxx/qla_gbl.h | 2 - drivers/scsi/qla2xxx/qla_isr.c | 59 ---------------------------------------- drivers/scsi/qla2xxx/qla_os.c | 39 +++++++++++++++++++------- 4 files changed, 29 insertions(+), 74 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index d8ce310..8ead66e 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -1570,9 +1570,6 @@ typedef struct fc_port { struct fc_rport *rport, *drport; u32 supported_classes; - unsigned long last_queue_full; - unsigned long last_ramp_up; - uint16_t vp_idx; } fc_port_t; diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 14e0562..0ca5c54 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h @@ -72,8 +72,6 @@ extern int ql2xloginretrycount; extern int ql2xfdmienable; extern int ql2xallocfwdump; extern int ql2xextended_error_logging; -extern int ql2xqfullrampup; -extern int ql2xqfulltracking; extern int ql2xiidmaenable; extern int ql2xmaxqueues; extern int ql2xmultique_tag; diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 8eceac8..d64bace 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -805,64 +805,6 @@ skip_rio: qla2x00_alert_all_vps(rsp, mb); } -static void -qla2x00_adjust_sdev_qdepth_up(struct scsi_device *sdev, void *data) -{ - fc_port_t *fcport = data; - struct scsi_qla_host *vha = fcport->vha; - struct qla_hw_data *ha = vha->hw; - struct req_que *req = NULL; - - if (!ql2xqfulltracking) - return; - - req = vha->req; - if (!req) - return; - if (req->max_q_depth <= sdev->queue_depth) - return; - - if (sdev->ordered_tags) - scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, - sdev->queue_depth + 1); - else - scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, - sdev->queue_depth + 1); - - fcport->last_ramp_up = jiffies; - - DEBUG2(qla_printk(KERN_INFO, ha, - "scsi(%ld:%d:%d:%d): Queue depth adjusted-up to %d.\n", - fcport->vha->host_no, sdev->channel, sdev->id, sdev->lun, - sdev->queue_depth)); -} - -static inline void -qla2x00_ramp_up_queue_depth(scsi_qla_host_t *vha, struct req_que *req, - srb_t *sp) -{ - fc_port_t *fcport; - struct scsi_device *sdev; - - if (!ql2xqfulltracking) - return; - - sdev = sp->cmd->device; - if (sdev->queue_depth >= req->max_q_depth) - return; - - fcport = sp->fcport; - if (time_before(jiffies, - fcport->last_ramp_up + ql2xqfullrampup * HZ)) - return; - if (time_before(jiffies, - fcport->last_queue_full + ql2xqfullrampup * HZ)) - return; - - starget_for_each_device(sdev->sdev_target, fcport, - qla2x00_adjust_sdev_qdepth_up); -} - /** * qla2x00_process_completed_request() - Process a Fast Post response. * @ha: SCSI driver HA context @@ -894,7 +836,6 @@ qla2x00_process_completed_request(struct scsi_qla_host *vha, /* Save ISP completion status */ sp->cmd->result = DID_OK << 16; - qla2x00_ramp_up_queue_depth(vha, req, sp); qla2x00_sp_compl(ha, sp); } else { DEBUG2(printk("scsi(%ld) Req:%d: Invalid ISP SCSI completion" diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index b24c7cc..72c2821 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -78,7 +78,7 @@ module_param(ql2xmaxqdepth, int, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(ql2xmaxqdepth, "Maximum queue depth to report for target devices."); -int ql2xqfulltracking = 1; +static int ql2xqfulltracking = 1; module_param(ql2xqfulltracking, int, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(ql2xqfulltracking, "Controls whether the driver tracks queue full status " @@ -86,13 +86,6 @@ MODULE_PARM_DESC(ql2xqfulltracking, "depth. Default is 1, perform tracking. Set to 0 to " "disable dynamic tracking and adjustment of queue depth."); -int ql2xqfullrampup = 120; -module_param(ql2xqfullrampup, int, S_IRUGO|S_IWUSR); -MODULE_PARM_DESC(ql2xqfullrampup, - "Number of seconds to wait to begin to ramp-up the queue " - "depth for a device after a queue-full condition has been " - "detected. Default is 120 seconds."); - int ql2xiidmaenable=1; module_param(ql2xiidmaenable, int, S_IRUGO|S_IRUSR); MODULE_PARM_DESC(ql2xiidmaenable, @@ -1238,8 +1231,6 @@ static void qla2x00_handle_queue_full(struct scsi_device *sdev, int qdepth) { fc_port_t *fcport = (struct fc_port *) sdev->hostdata; - fcport->last_queue_full = jiffies; - if (!scsi_track_queue_full(sdev, qdepth)) return; @@ -1249,6 +1240,30 @@ static void qla2x00_handle_queue_full(struct scsi_device *sdev, int qdepth) sdev->queue_depth)); } +static void qla2x00_adjust_sdev_qdepth_up(struct scsi_device *sdev, int qdepth) +{ + fc_port_t *fcport = sdev->hostdata; + struct scsi_qla_host *vha = fcport->vha; + struct qla_hw_data *ha = vha->hw; + struct req_que *req = NULL; + + req = vha->req; + if (!req) + return; + if (req->max_q_depth <= sdev->queue_depth || req->max_q_depth < qdepth) + return; + + if (sdev->ordered_tags) + scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, qdepth); + else + scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, qdepth); + + DEBUG2(qla_printk(KERN_INFO, ha, + "scsi(%ld:%d:%d:%d): Queue depth adjusted-up to %d.\n", + fcport->vha->host_no, sdev->channel, sdev->id, sdev->lun, + sdev->queue_depth)); +} + static int qla2x00_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) { @@ -1260,6 +1275,10 @@ qla2x00_change_queue_depth(struct scsi_device *sdev, int qdepth, int reason) if (!ql2xqfulltracking) qla2x00_handle_queue_full(sdev, qdepth); break; + case SCSI_QDEPTH_RAMP_UP: + if (!ql2xqfulltracking) + qla2x00_adjust_sdev_qdepth_up(sdev, qdepth); + break; default: return EOPNOTSUPP; } -- 1.6.2.2