Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3c290d0b authored by Chad Dupuis's avatar Chad Dupuis Committed by James Bottomley
Browse files

[SCSI] qla2xxx: Ramp down queue depth for attached SCSI devices when driver resources are low.

parent 8d93f550
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@
 * |                              |                    | 0x113a         |
 * | Device Discovery             |       0x2087       | 0x2020-0x2022, |
 * |                              |                    | 0x2016         |
 * | Queue Command and IO tracing |       0x3030       | 0x3006-0x300b  |
 * | Queue Command and IO tracing |       0x3031       | 0x3006-0x300b  |
 * |                              |                    | 0x3027-0x3028  |
 * |                              |                    | 0x302d-0x302e  |
 * | DPC Thread                   |       0x401d       | 0x4002,0x4013  |
+9 −0
Original line number Diff line number Diff line
@@ -2536,6 +2536,7 @@ struct req_que {
	srb_t **outstanding_cmds;
	uint32_t current_outstanding_cmd;
	uint16_t num_outstanding_cmds;
#define	MAX_Q_DEPTH		32
	int max_q_depth;
};

@@ -3058,6 +3059,12 @@ struct qla_hw_data {
	struct work_struct idc_state_handler;
	struct work_struct nic_core_unrecoverable;

#define HOST_QUEUE_RAMPDOWN_INTERVAL           (60 * HZ)
#define HOST_QUEUE_RAMPUP_INTERVAL             (30 * HZ)
	unsigned long   host_last_rampdown_time;
	unsigned long   host_last_rampup_time;
	int             cfg_lun_q_depth;

	struct qlt_hw_data tgt;
};

@@ -3117,6 +3124,8 @@ typedef struct scsi_qla_host {
#define MPI_RESET_NEEDED	19	/* Initiate MPI FW reset */
#define ISP_QUIESCE_NEEDED	20	/* Driver need some quiescence */
#define SCR_PENDING		21	/* SCR in target mode */
#define HOST_RAMP_DOWN_QUEUE_DEPTH     22
#define HOST_RAMP_UP_QUEUE_DEPTH       23

	uint32_t	device_flags;
#define SWITCH_FOUND		BIT_0
+1 −0
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ extern int qlport_down_retry;
extern int ql2xplogiabsentdevice;
extern int ql2xloginretrycount;
extern int ql2xfdmienable;
extern int ql2xmaxqdepth;
extern int ql2xallocfwdump;
extern int ql2xextended_error_logging;
extern int ql2xiidmaenable;
+19 −0
Original line number Diff line number Diff line
@@ -213,3 +213,22 @@ qla2x00_gid_list_size(struct qla_hw_data *ha)
{
	return sizeof(struct gid_list_info) * ha->max_fibre_devices;
}

static inline void
qla2x00_do_host_ramp_up(scsi_qla_host_t *vha)
{
	if (vha->hw->cfg_lun_q_depth >= ql2xmaxqdepth)
		return;

	/* Wait at least HOST_QUEUE_RAMPDOWN_INTERVAL before ramping up */
	if (time_before(jiffies, (vha->hw->host_last_rampdown_time +
	    HOST_QUEUE_RAMPDOWN_INTERVAL)))
		return;

	/* Wait at least HOST_QUEUE_RAMPUP_INTERVAL between each ramp up */
	if (time_before(jiffies, (vha->hw->host_last_rampup_time +
	    HOST_QUEUE_RAMPUP_INTERVAL)))
		return;

	set_bit(HOST_RAMP_UP_QUEUE_DEPTH, &vha->dpc_flags);
}
+4 −0
Original line number Diff line number Diff line
@@ -1934,6 +1934,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)

	/* Fast path completion. */
	if (comp_status == CS_COMPLETE && scsi_status == 0) {
		qla2x00_do_host_ramp_up(vha);
		qla2x00_process_completed_request(vha, req, handle);

		return;
@@ -2193,6 +2194,9 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
		    cp->cmnd[8], cp->cmnd[9], scsi_bufflen(cp), rsp_info_len,
		    resid_len, fw_resid_len);

	if (!res)
		qla2x00_do_host_ramp_up(vha);

	if (rsp->status_srb == NULL)
		sp->done(ha, sp, res);
}
Loading