[SCSI] qla2xxx: Cache swl during fabric discovery.
authorAndrew Vasquez <andrew.vasquez@qlogic.com>
Thu, 9 Feb 2012 19:15:56 +0000 (11:15 -0800)
committerJames Bottomley <JBottomley@Parallels.com>
Sun, 19 Feb 2012 14:26:45 +0000 (08:26 -0600)
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>
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_os.c

index 9d353ca..649748f 100644 (file)
@@ -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];
 
index b28eb40..24b2d11 100644 (file)
@@ -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);
index ffa3488..94ff3a5 100644 (file)
@@ -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;