···116116 atomic_t cmd_pending;117117 uint32_t cmd_qdepth;118118 unsigned long last_change_time;119119- struct lpfc_node_rrqs active_rrqs;119119+ unsigned long *active_rrqs_xri_bitmap;120120 struct lpfc_scsicmd_bkt *lat_data; /* Latency data */121121};122122struct lpfc_node_rrq {
+55-25
drivers/scsi/lpfc/lpfc_els.c
···15161516 uint32_t rc, keepDID = 0;15171517 int put_node;15181518 int put_rport;15191519- struct lpfc_node_rrqs rrq;15191519+ unsigned long *active_rrqs_xri_bitmap = NULL;1520152015211521 /* Fabric nodes can have the same WWPN so we don't bother searching15221522 * by WWPN. Just return the ndlp that was given to us.···1534153415351535 if (new_ndlp == ndlp && NLP_CHK_NODE_ACT(new_ndlp))15361536 return ndlp;15371537- memset(&rrq.xri_bitmap, 0, sizeof(new_ndlp->active_rrqs.xri_bitmap));15371537+ if (phba->sli_rev == LPFC_SLI_REV4) {15381538+ active_rrqs_xri_bitmap = mempool_alloc(phba->active_rrq_pool,15391539+ GFP_KERNEL);15401540+ if (active_rrqs_xri_bitmap)15411541+ memset(active_rrqs_xri_bitmap, 0,15421542+ phba->cfg_rrq_xri_bitmap_sz);15431543+ }1538154415391545 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,15401546 "3178 PLOGI confirm: ndlp %p x%x: new_ndlp %p\n",···15491543 if (!new_ndlp) {15501544 rc = memcmp(&ndlp->nlp_portname, name,15511545 sizeof(struct lpfc_name));15521552- if (!rc)15461546+ if (!rc) {15471547+ if (active_rrqs_xri_bitmap)15481548+ mempool_free(active_rrqs_xri_bitmap,15491549+ phba->active_rrq_pool);15531550 return ndlp;15511551+ }15541552 new_ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_ATOMIC);15551555- if (!new_ndlp)15531553+ if (!new_ndlp) {15541554+ if (active_rrqs_xri_bitmap)15551555+ mempool_free(active_rrqs_xri_bitmap,15561556+ phba->active_rrq_pool);15561557 return ndlp;15581558+ }15571559 lpfc_nlp_init(vport, new_ndlp, ndlp->nlp_DID);15581560 } else if (!NLP_CHK_NODE_ACT(new_ndlp)) {15591561 rc = memcmp(&ndlp->nlp_portname, name,15601562 sizeof(struct lpfc_name));15611561- if (!rc)15631563+ if (!rc) {15641564+ if (active_rrqs_xri_bitmap)15651565+ mempool_free(active_rrqs_xri_bitmap,15661566+ phba->active_rrq_pool);15621567 return ndlp;15681568+ }15631569 new_ndlp = lpfc_enable_node(vport, new_ndlp,15641570 NLP_STE_UNUSED_NODE);15651565- if (!new_ndlp)15711571+ if (!new_ndlp) {15721572+ if (active_rrqs_xri_bitmap)15731573+ mempool_free(active_rrqs_xri_bitmap,15741574+ phba->active_rrq_pool);15661575 return ndlp;15761576+ }15671577 keepDID = new_ndlp->nlp_DID;15681568- if (phba->sli_rev == LPFC_SLI_REV4)15691569- memcpy(&rrq.xri_bitmap,15701570- &new_ndlp->active_rrqs.xri_bitmap,15711571- sizeof(new_ndlp->active_rrqs.xri_bitmap));15781578+ if ((phba->sli_rev == LPFC_SLI_REV4) && active_rrqs_xri_bitmap)15791579+ memcpy(active_rrqs_xri_bitmap,15801580+ new_ndlp->active_rrqs_xri_bitmap,15811581+ phba->cfg_rrq_xri_bitmap_sz);15721582 } else {15731583 keepDID = new_ndlp->nlp_DID;15741574- if (phba->sli_rev == LPFC_SLI_REV4)15751575- memcpy(&rrq.xri_bitmap,15761576- &new_ndlp->active_rrqs.xri_bitmap,15771577- sizeof(new_ndlp->active_rrqs.xri_bitmap));15841584+ if (phba->sli_rev == LPFC_SLI_REV4 &&15851585+ active_rrqs_xri_bitmap)15861586+ memcpy(active_rrqs_xri_bitmap,15871587+ new_ndlp->active_rrqs_xri_bitmap,15881588+ phba->cfg_rrq_xri_bitmap_sz);15781589 }1579159015801591 lpfc_unreg_rpi(vport, new_ndlp);15811592 new_ndlp->nlp_DID = ndlp->nlp_DID;15821593 new_ndlp->nlp_prev_state = ndlp->nlp_prev_state;15831594 if (phba->sli_rev == LPFC_SLI_REV4)15841584- memcpy(new_ndlp->active_rrqs.xri_bitmap,15851585- &ndlp->active_rrqs.xri_bitmap,15861586- sizeof(ndlp->active_rrqs.xri_bitmap));15951595+ memcpy(new_ndlp->active_rrqs_xri_bitmap,15961596+ ndlp->active_rrqs_xri_bitmap,15971597+ phba->cfg_rrq_xri_bitmap_sz);1587159815881599 if (ndlp->nlp_flag & NLP_NPR_2B_DISC)15891600 new_ndlp->nlp_flag |= NLP_NPR_2B_DISC;···1642161916431620 /* Two ndlps cannot have the same did on the nodelist */16441621 ndlp->nlp_DID = keepDID;16451645- if (phba->sli_rev == LPFC_SLI_REV4)16461646- memcpy(&ndlp->active_rrqs.xri_bitmap,16471647- &rrq.xri_bitmap,16481648- sizeof(ndlp->active_rrqs.xri_bitmap));16221622+ if (phba->sli_rev == LPFC_SLI_REV4 &&16231623+ active_rrqs_xri_bitmap)16241624+ memcpy(ndlp->active_rrqs_xri_bitmap,16251625+ active_rrqs_xri_bitmap,16261626+ phba->cfg_rrq_xri_bitmap_sz);16491627 lpfc_drop_node(vport, ndlp);16501628 }16511629 else {···1658163416591635 /* Two ndlps cannot have the same did */16601636 ndlp->nlp_DID = keepDID;16611661- if (phba->sli_rev == LPFC_SLI_REV4)16621662- memcpy(&ndlp->active_rrqs.xri_bitmap,16631663- &rrq.xri_bitmap,16641664- sizeof(ndlp->active_rrqs.xri_bitmap));16371637+ if (phba->sli_rev == LPFC_SLI_REV4 &&16381638+ active_rrqs_xri_bitmap)16391639+ memcpy(ndlp->active_rrqs_xri_bitmap,16401640+ active_rrqs_xri_bitmap,16411641+ phba->cfg_rrq_xri_bitmap_sz);1665164216661643 /* Since we are swapping the ndlp passed in with the new one16671644 * and the did has already been swapped, copy over state.···16931668 put_device(&rport->dev);16941669 }16951670 }16711671+ if (phba->sli_rev == LPFC_SLI_REV4 &&16721672+ active_rrqs_xri_bitmap)16731673+ mempool_free(active_rrqs_xri_bitmap,16741674+ phba->active_rrq_pool);16961675 return new_ndlp;16971676}16981677···28012772 /* This will cause the callback-function lpfc_cmpl_els_cmd to28022773 * trigger the release of node.28032774 */27752775+28042776 lpfc_nlp_put(ndlp);28052777 return 0;28062778}
+18-3
drivers/scsi/lpfc/lpfc_hbadisc.c
···41864186 struct lpfc_hba *phba = vport->phba;41874187 uint32_t did;41884188 unsigned long flags;41894189+ unsigned long *active_rrqs_xri_bitmap = NULL;4189419041904191 if (!ndlp)41914192 return NULL;···4215421442164215 /* Keep the original DID */42174216 did = ndlp->nlp_DID;42174217+ if (phba->sli_rev == LPFC_SLI_REV4)42184218+ active_rrqs_xri_bitmap = ndlp->active_rrqs_xri_bitmap;4218421942194220 /* re-initialize ndlp except of ndlp linked list pointer */42204221 memset((((char *)ndlp) + sizeof (struct list_head)), 0,42214222 sizeof (struct lpfc_nodelist) - sizeof (struct list_head));42224223 lpfc_initialize_node(vport, ndlp, did);42244224+42254225+ if (phba->sli_rev == LPFC_SLI_REV4)42264226+ ndlp->active_rrqs_xri_bitmap = active_rrqs_xri_bitmap;4223422742244228 spin_unlock_irqrestore(&phba->ndlp_lock, flags);42254229 if (vport->phba->sli_rev == LPFC_SLI_REV4)···48114805 ((uint32_t) ndlp->nlp_rpi & 0xff));48124806 lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE,48134807 "0929 FIND node DID "48144814- "Data: x%p x%x x%x x%x\n",48084808+ "Data: x%p x%x x%x x%x %p\n",48154809 ndlp, ndlp->nlp_DID,48164816- ndlp->nlp_flag, data1);48104810+ ndlp->nlp_flag, data1,48114811+ ndlp->active_rrqs_xri_bitmap);48174812 return ndlp;48184813 }48194814 }···5631562456325625 lpfc_initialize_node(vport, ndlp, did);56335626 INIT_LIST_HEAD(&ndlp->nlp_listp);56345634- if (vport->phba->sli_rev == LPFC_SLI_REV4)56275627+ if (vport->phba->sli_rev == LPFC_SLI_REV4) {56355628 ndlp->nlp_rpi = lpfc_sli4_alloc_rpi(vport->phba);56295629+ ndlp->active_rrqs_xri_bitmap =56305630+ mempool_alloc(vport->phba->active_rrq_pool,56315631+ GFP_KERNEL);56325632+ }56335633+563656345637563556385636 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_NODE,···56825670 /* free ndlp memory for final ndlp release */56835671 if (NLP_CHK_FREE_REQ(ndlp)) {56845672 kfree(ndlp->lat_data);56735673+ if (phba->sli_rev == LPFC_SLI_REV4)56745674+ mempool_free(ndlp->active_rrqs_xri_bitmap,56755675+ ndlp->phba->active_rrq_pool);56855676 mempool_free(ndlp, ndlp->phba->nlp_mem_pool);56865677 }56875678}
+3
drivers/scsi/lpfc/lpfc_init.c
···50615061 rc = lpfc_sli4_read_config(phba);50625062 if (unlikely(rc))50635063 goto out_free_bsmbx;50645064+ rc = lpfc_mem_alloc_active_rrq_pool_s4(phba);50655065+ if (unlikely(rc))50665066+ goto out_free_bsmbx;5064506750655068 /* IF Type 0 ports get initialized now. */50665069 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) ==
+22
drivers/scsi/lpfc/lpfc_mem.c
···3838#include "lpfc_scsi.h"3939#include "lpfc.h"4040#include "lpfc_crtn.h"4141+#include "lpfc_logmsg.h"41424243#define LPFC_MBUF_POOL_SIZE 64 /* max elements in MBUF safety pool */4344#define LPFC_MEM_POOL_SIZE 64 /* max elem in non-DMA safety pool */44454646+int4747+lpfc_mem_alloc_active_rrq_pool_s4(struct lpfc_hba *phba) {4848+ size_t bytes;4949+ int max_xri = phba->sli4_hba.max_cfg_param.max_xri;5050+5151+ if (max_xri <= 0)5252+ return -ENOMEM;5353+ bytes = ((BITS_PER_LONG - 1 + max_xri) / BITS_PER_LONG) *5454+ sizeof(unsigned long);5555+ phba->cfg_rrq_xri_bitmap_sz = bytes;5656+ phba->active_rrq_pool = mempool_create_kmalloc_pool(LPFC_MEM_POOL_SIZE,5757+ bytes);5858+ if (!phba->active_rrq_pool)5959+ return -ENOMEM;6060+ else6161+ return 0;6262+}45634664/**4765 * lpfc_mem_alloc - create and allocate all PCI and memory pools···227209 /* Free NLP memory pool */228210 mempool_destroy(phba->nlp_mem_pool);229211 phba->nlp_mem_pool = NULL;212212+ if (phba->sli_rev == LPFC_SLI_REV4 && phba->active_rrq_pool) {213213+ mempool_destroy(phba->active_rrq_pool);214214+ phba->active_rrq_pool = NULL;215215+ }230216231217 /* Free mbox memory pool */232218 mempool_destroy(phba->mbox_mem_pool);
+8-3
drivers/scsi/lpfc/lpfc_sli.c
···635635 if (!ndlp)636636 goto out;637637638638- if (test_and_clear_bit(xritag, ndlp->active_rrqs.xri_bitmap)) {638638+ if (test_and_clear_bit(xritag, ndlp->active_rrqs_xri_bitmap)) {639639 rrq->send_rrq = 0;640640 rrq->xritag = 0;641641 rrq->rrq_stop_time = 0;···813813{814814 if (!ndlp)815815 return 0;816816- if (test_bit(xritag, ndlp->active_rrqs.xri_bitmap))816816+ if (!ndlp->active_rrqs_xri_bitmap)817817+ return 0;818818+ if (test_bit(xritag, ndlp->active_rrqs_xri_bitmap))817819 return 1;818820 else819821 return 0;···865863 if (ndlp->vport && (ndlp->vport->load_flag & FC_UNLOADING))866864 goto out;867865868868- if (test_and_set_bit(xritag, ndlp->active_rrqs.xri_bitmap))866866+ if (!ndlp->active_rrqs_xri_bitmap)867867+ goto out;868868+869869+ if (test_and_set_bit(xritag, ndlp->active_rrqs_xri_bitmap))869870 goto out;870871871872 spin_unlock_irqrestore(&phba->hbalock, iflags);