forked from Minki/linux
[SCSI] qla2xxx: Cache swl during fabric discovery.
Rather than continuously allocating and freeing swl within the discovery process, simply pre-allocate it the first time that it's needed, cache it through the rest of the lifecycle of the driver and free it at module unload. Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com> Signed-off-by: Chad Dupuis <chad.dupuis@qlogic.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
733a95bd39
commit
7a67735b07
@ -2674,6 +2674,8 @@ struct qla_hw_data {
|
||||
void *async_pd;
|
||||
dma_addr_t async_pd_dma;
|
||||
|
||||
void *swl;
|
||||
|
||||
/* These are used by mailbox operations. */
|
||||
volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT];
|
||||
|
||||
|
@ -3133,20 +3133,21 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
|
||||
rval = QLA_SUCCESS;
|
||||
|
||||
/* Try GID_PT to get device list, else GAN. */
|
||||
swl = kcalloc(MAX_FIBRE_DEVICES, sizeof(sw_info_t), GFP_KERNEL);
|
||||
if (!ha->swl)
|
||||
ha->swl = kcalloc(MAX_FIBRE_DEVICES, sizeof(sw_info_t),
|
||||
GFP_KERNEL);
|
||||
swl = ha->swl;
|
||||
if (!swl) {
|
||||
/*EMPTY*/
|
||||
ql_dbg(ql_dbg_disc, vha, 0x2054,
|
||||
"GID_PT allocations failed, fallback on GA_NXT.\n");
|
||||
} else {
|
||||
memset(swl, 0, MAX_FIBRE_DEVICES * sizeof(sw_info_t));
|
||||
if (qla2x00_gid_pt(vha, swl) != QLA_SUCCESS) {
|
||||
kfree(swl);
|
||||
swl = NULL;
|
||||
} else if (qla2x00_gpn_id(vha, swl) != QLA_SUCCESS) {
|
||||
kfree(swl);
|
||||
swl = NULL;
|
||||
} else if (qla2x00_gnn_id(vha, swl) != QLA_SUCCESS) {
|
||||
kfree(swl);
|
||||
swl = NULL;
|
||||
} else if (ql2xiidmaenable &&
|
||||
qla2x00_gfpn_id(vha, swl) == QLA_SUCCESS) {
|
||||
@ -3164,7 +3165,6 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
|
||||
if (new_fcport == NULL) {
|
||||
ql_log(ql_log_warn, vha, 0x205e,
|
||||
"Failed to allocate memory for fcport.\n");
|
||||
kfree(swl);
|
||||
return (QLA_MEMORY_ALLOC_FAILED);
|
||||
}
|
||||
new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED);
|
||||
@ -3341,14 +3341,12 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
|
||||
if (new_fcport == NULL) {
|
||||
ql_log(ql_log_warn, vha, 0x2066,
|
||||
"Memory allocation failed for fcport.\n");
|
||||
kfree(swl);
|
||||
return (QLA_MEMORY_ALLOC_FAILED);
|
||||
}
|
||||
new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED);
|
||||
new_fcport->d_id.b24 = nxt_d_id.b24;
|
||||
}
|
||||
|
||||
kfree(swl);
|
||||
kfree(new_fcport);
|
||||
|
||||
return (rval);
|
||||
|
@ -3280,6 +3280,7 @@ qla2x00_mem_free(struct qla_hw_data *ha)
|
||||
vfree(ha->optrom_buffer);
|
||||
kfree(ha->nvram);
|
||||
kfree(ha->npiv_info);
|
||||
kfree(ha->swl);
|
||||
|
||||
ha->srb_mempool = NULL;
|
||||
ha->ctx_mempool = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user