diff options
author | Jamie Wellnitz <Jamie.Wellnitz@emulex.com> | 2006-02-28 22:33:08 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-03-06 10:46:57 -0500 |
commit | cf5bf97e1d28651fd689be9c974b2318ac262f2d (patch) | |
tree | df7a3b25a5fccc189bf1cb00de8f2f04eaef0e71 /drivers/scsi/lpfc/lpfc_sli.c | |
parent | 56178645c2686a7ef630e1b23b81d40dcfb553e6 (diff) |
[PATCH] lpfc 8.1.3: Fix performance when using multiple SLI rings
Fix performance when using multiple SLI rings
Currently the driver allocates all of its SLI command and response ring
entries to one primary ring. Other rings get little, or no, resources.
Allow more resources to be given to ring 1
Signed-off-by: Jamie Wellnitz <Jamie.Wellnitz@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_sli.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index d6ffe26ae123..d08fd89dd44f 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -766,7 +766,9 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
766 | } | 766 | } |
767 | /* unSolicited Responses */ | 767 | /* unSolicited Responses */ |
768 | if (pring->prt[0].profile) { | 768 | if (pring->prt[0].profile) { |
769 | (pring->prt[0].lpfc_sli_rcv_unsol_event) (phba, pring, saveq); | 769 | if (pring->prt[0].lpfc_sli_rcv_unsol_event) |
770 | (pring->prt[0].lpfc_sli_rcv_unsol_event) (phba, pring, | ||
771 | saveq); | ||
770 | match = 1; | 772 | match = 1; |
771 | } else { | 773 | } else { |
772 | /* We must search, based on rctl / type | 774 | /* We must search, based on rctl / type |
@@ -777,8 +779,9 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
777 | Rctl) | 779 | Rctl) |
778 | && (pring->prt[i]. | 780 | && (pring->prt[i]. |
779 | type == Type)) { | 781 | type == Type)) { |
780 | (pring->prt[i].lpfc_sli_rcv_unsol_event) | 782 | if (pring->prt[i].lpfc_sli_rcv_unsol_event) |
781 | (phba, pring, saveq); | 783 | (pring->prt[i].lpfc_sli_rcv_unsol_event) |
784 | (phba, pring, saveq); | ||
782 | match = 1; | 785 | match = 1; |
783 | break; | 786 | break; |
784 | } | 787 | } |
@@ -2377,6 +2380,37 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2377 | return IOCB_BUSY; | 2380 | return IOCB_BUSY; |
2378 | } | 2381 | } |
2379 | 2382 | ||
2383 | static int | ||
2384 | lpfc_extra_ring_setup( struct lpfc_hba *phba) | ||
2385 | { | ||
2386 | struct lpfc_sli *psli; | ||
2387 | struct lpfc_sli_ring *pring; | ||
2388 | |||
2389 | psli = &phba->sli; | ||
2390 | |||
2391 | /* Adjust cmd/rsp ring iocb entries more evenly */ | ||
2392 | pring = &psli->ring[psli->fcp_ring]; | ||
2393 | pring->numCiocb -= SLI2_IOCB_CMD_R1XTRA_ENTRIES; | ||
2394 | pring->numRiocb -= SLI2_IOCB_RSP_R1XTRA_ENTRIES; | ||
2395 | pring->numCiocb -= SLI2_IOCB_CMD_R3XTRA_ENTRIES; | ||
2396 | pring->numRiocb -= SLI2_IOCB_RSP_R3XTRA_ENTRIES; | ||
2397 | |||
2398 | pring = &psli->ring[1]; | ||
2399 | pring->numCiocb += SLI2_IOCB_CMD_R1XTRA_ENTRIES; | ||
2400 | pring->numRiocb += SLI2_IOCB_RSP_R1XTRA_ENTRIES; | ||
2401 | pring->numCiocb += SLI2_IOCB_CMD_R3XTRA_ENTRIES; | ||
2402 | pring->numRiocb += SLI2_IOCB_RSP_R3XTRA_ENTRIES; | ||
2403 | |||
2404 | /* Setup default profile for this ring */ | ||
2405 | pring->iotag_max = 4096; | ||
2406 | pring->num_mask = 1; | ||
2407 | pring->prt[0].profile = 0; /* Mask 0 */ | ||
2408 | pring->prt[0].rctl = FC_UNSOL_DATA; | ||
2409 | pring->prt[0].type = 5; | ||
2410 | pring->prt[0].lpfc_sli_rcv_unsol_event = NULL; | ||
2411 | return 0; | ||
2412 | } | ||
2413 | |||
2380 | int | 2414 | int |
2381 | lpfc_sli_setup(struct lpfc_hba *phba) | 2415 | lpfc_sli_setup(struct lpfc_hba *phba) |
2382 | { | 2416 | { |
@@ -2460,6 +2494,8 @@ lpfc_sli_setup(struct lpfc_hba *phba) | |||
2460 | "SLI2 SLIM Data: x%x x%x\n", | 2494 | "SLI2 SLIM Data: x%x x%x\n", |
2461 | phba->brd_no, totiocb, MAX_SLI2_IOCB); | 2495 | phba->brd_no, totiocb, MAX_SLI2_IOCB); |
2462 | } | 2496 | } |
2497 | if (phba->cfg_multi_ring_support == 2) | ||
2498 | lpfc_extra_ring_setup(phba); | ||
2463 | 2499 | ||
2464 | return 0; | 2500 | return 0; |
2465 | } | 2501 | } |