[SCSI] lpfc 8.3.11: FCF failover improvements
FCF failover improvements - Add random FCF failover when there are multiple FCFs available. - Prevent FCF log messages from being displayed for FC adapters. - Separate the New FCF and Modified FCF log messages. Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com> Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
65c054f235
commit
999d813f22
|
@ -893,11 +893,14 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||||
|
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
/* Mark the FCF discovery process done */
|
/* Mark the FCF discovery process done */
|
||||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_FIP | LOG_ELS,
|
if (phba->hba_flag & HBA_FIP_SUPPORT)
|
||||||
"2769 FLOGI successful on FCF record: "
|
lpfc_printf_vlog(vport, KERN_INFO, LOG_FIP |
|
||||||
"current_fcf_index:x%x, terminate FCF "
|
LOG_ELS,
|
||||||
"round robin failover process\n",
|
"2769 FLOGI successful on FCF "
|
||||||
phba->fcf.current_rec.fcf_indx);
|
"record: current_fcf_index:"
|
||||||
|
"x%x, terminate FCF round "
|
||||||
|
"robin failover process\n",
|
||||||
|
phba->fcf.current_rec.fcf_indx);
|
||||||
spin_lock_irq(&phba->hbalock);
|
spin_lock_irq(&phba->hbalock);
|
||||||
phba->fcf.fcf_flag &= ~FCF_DISCOVERY;
|
phba->fcf.fcf_flag &= ~FCF_DISCOVERY;
|
||||||
spin_unlock_irq(&phba->hbalock);
|
spin_unlock_irq(&phba->hbalock);
|
||||||
|
|
|
@ -1531,7 +1531,37 @@ lpfc_check_pending_fcoe_event(struct lpfc_hba *phba, uint8_t unreg_fcf)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* lpfc_sli4_fcf_rec_mbox_parse - parse non-embedded fcf record mailbox command
|
* lpfc_sli4_new_fcf_random_select - Randomly select an eligible new fcf record
|
||||||
|
* @phba: pointer to lpfc hba data structure.
|
||||||
|
* @fcf_cnt: number of eligible fcf record seen so far.
|
||||||
|
*
|
||||||
|
* This function makes an running random selection decision on FCF record to
|
||||||
|
* use through a sequence of @fcf_cnt eligible FCF records with equal
|
||||||
|
* probability. To perform integer manunipulation of random numbers with
|
||||||
|
* size unit32_t, the lower 16 bits of the 32-bit random number returned
|
||||||
|
* from random32() are taken as the random random number generated.
|
||||||
|
*
|
||||||
|
* Returns true when outcome is for the newly read FCF record should be
|
||||||
|
* chosen; otherwise, return false when outcome is for keeping the previously
|
||||||
|
* chosen FCF record.
|
||||||
|
**/
|
||||||
|
static bool
|
||||||
|
lpfc_sli4_new_fcf_random_select(struct lpfc_hba *phba, uint32_t fcf_cnt)
|
||||||
|
{
|
||||||
|
uint32_t rand_num;
|
||||||
|
|
||||||
|
/* Get 16-bit uniform random number */
|
||||||
|
rand_num = (0xFFFF & random32());
|
||||||
|
|
||||||
|
/* Decision with probability 1/fcf_cnt */
|
||||||
|
if ((fcf_cnt * rand_num) < 0xFFFF)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* lpfc_mbx_cmpl_read_fcf_record - Completion handler for read_fcf mbox.
|
||||||
* @phba: pointer to lpfc hba data structure.
|
* @phba: pointer to lpfc hba data structure.
|
||||||
* @mboxq: pointer to mailbox object.
|
* @mboxq: pointer to mailbox object.
|
||||||
* @next_fcf_index: pointer to holder of next fcf index.
|
* @next_fcf_index: pointer to holder of next fcf index.
|
||||||
|
@ -1679,6 +1709,8 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||||
uint16_t fcf_index, next_fcf_index;
|
uint16_t fcf_index, next_fcf_index;
|
||||||
struct lpfc_fcf_rec *fcf_rec = NULL;
|
struct lpfc_fcf_rec *fcf_rec = NULL;
|
||||||
uint16_t vlan_id;
|
uint16_t vlan_id;
|
||||||
|
uint32_t seed;
|
||||||
|
bool select_new_fcf;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* If there is pending FCoE event restart FCF table scan */
|
/* If there is pending FCoE event restart FCF table scan */
|
||||||
|
@ -1809,9 +1841,21 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||||
* than the driver FCF record, use the new record.
|
* than the driver FCF record, use the new record.
|
||||||
*/
|
*/
|
||||||
if (new_fcf_record->fip_priority < fcf_rec->priority) {
|
if (new_fcf_record->fip_priority < fcf_rec->priority) {
|
||||||
/* Choose this FCF record */
|
/* Choose the new FCF record with lower priority */
|
||||||
__lpfc_update_fcf_record(phba, fcf_rec, new_fcf_record,
|
__lpfc_update_fcf_record(phba, fcf_rec, new_fcf_record,
|
||||||
addr_mode, vlan_id, 0);
|
addr_mode, vlan_id, 0);
|
||||||
|
/* Reset running random FCF selection count */
|
||||||
|
phba->fcf.eligible_fcf_cnt = 1;
|
||||||
|
} else if (new_fcf_record->fip_priority == fcf_rec->priority) {
|
||||||
|
/* Update running random FCF selection count */
|
||||||
|
phba->fcf.eligible_fcf_cnt++;
|
||||||
|
select_new_fcf = lpfc_sli4_new_fcf_random_select(phba,
|
||||||
|
phba->fcf.eligible_fcf_cnt);
|
||||||
|
if (select_new_fcf)
|
||||||
|
/* Choose the new FCF by random selection */
|
||||||
|
__lpfc_update_fcf_record(phba, fcf_rec,
|
||||||
|
new_fcf_record,
|
||||||
|
addr_mode, vlan_id, 0);
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&phba->hbalock);
|
spin_unlock_irq(&phba->hbalock);
|
||||||
goto read_next_fcf;
|
goto read_next_fcf;
|
||||||
|
@ -1825,6 +1869,11 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
||||||
addr_mode, vlan_id, (boot_flag ?
|
addr_mode, vlan_id, (boot_flag ?
|
||||||
BOOT_ENABLE : 0));
|
BOOT_ENABLE : 0));
|
||||||
phba->fcf.fcf_flag |= FCF_AVAILABLE;
|
phba->fcf.fcf_flag |= FCF_AVAILABLE;
|
||||||
|
/* Setup initial running random FCF selection count */
|
||||||
|
phba->fcf.eligible_fcf_cnt = 1;
|
||||||
|
/* Seeding the random number generator for random selection */
|
||||||
|
seed = (uint32_t)(0xFFFFFFFF & jiffies);
|
||||||
|
srandom32(seed);
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&phba->hbalock);
|
spin_unlock_irq(&phba->hbalock);
|
||||||
goto read_next_fcf;
|
goto read_next_fcf;
|
||||||
|
|
|
@ -3304,11 +3304,20 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba,
|
||||||
switch (event_type) {
|
switch (event_type) {
|
||||||
case LPFC_FCOE_EVENT_TYPE_NEW_FCF:
|
case LPFC_FCOE_EVENT_TYPE_NEW_FCF:
|
||||||
case LPFC_FCOE_EVENT_TYPE_FCF_PARAM_MOD:
|
case LPFC_FCOE_EVENT_TYPE_FCF_PARAM_MOD:
|
||||||
lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY,
|
if (event_type == LPFC_FCOE_EVENT_TYPE_NEW_FCF)
|
||||||
"2546 New FCF found/FCF parameter modified event: "
|
lpfc_printf_log(phba, KERN_ERR, LOG_FIP |
|
||||||
"evt_tag:x%x, fcf_index:x%x\n",
|
LOG_DISCOVERY,
|
||||||
acqe_fcoe->event_tag, acqe_fcoe->index);
|
"2546 New FCF found event: "
|
||||||
|
"evt_tag:x%x, fcf_index:x%x\n",
|
||||||
|
acqe_fcoe->event_tag,
|
||||||
|
acqe_fcoe->index);
|
||||||
|
else
|
||||||
|
lpfc_printf_log(phba, KERN_WARNING, LOG_FIP |
|
||||||
|
LOG_DISCOVERY,
|
||||||
|
"2788 FCF parameter modified event: "
|
||||||
|
"evt_tag:x%x, fcf_index:x%x\n",
|
||||||
|
acqe_fcoe->event_tag,
|
||||||
|
acqe_fcoe->index);
|
||||||
spin_lock_irq(&phba->hbalock);
|
spin_lock_irq(&phba->hbalock);
|
||||||
if ((phba->fcf.fcf_flag & FCF_SCAN_DONE) ||
|
if ((phba->fcf.fcf_flag & FCF_SCAN_DONE) ||
|
||||||
(phba->hba_flag & FCF_DISC_INPROGRESS)) {
|
(phba->hba_flag & FCF_DISC_INPROGRESS)) {
|
||||||
|
|
|
@ -12040,9 +12040,11 @@ lpfc_sli4_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index)
|
||||||
phba->hba_flag |= FCF_DISC_INPROGRESS;
|
phba->hba_flag |= FCF_DISC_INPROGRESS;
|
||||||
spin_unlock_irq(&phba->hbalock);
|
spin_unlock_irq(&phba->hbalock);
|
||||||
/* Reset FCF round robin index bmask for new scan */
|
/* Reset FCF round robin index bmask for new scan */
|
||||||
if (fcf_index == LPFC_FCOE_FCF_GET_FIRST)
|
if (fcf_index == LPFC_FCOE_FCF_GET_FIRST) {
|
||||||
memset(phba->fcf.fcf_rr_bmask, 0,
|
memset(phba->fcf.fcf_rr_bmask, 0,
|
||||||
sizeof(*phba->fcf.fcf_rr_bmask));
|
sizeof(*phba->fcf.fcf_rr_bmask));
|
||||||
|
phba->fcf.eligible_fcf_cnt = 0;
|
||||||
|
}
|
||||||
error = 0;
|
error = 0;
|
||||||
}
|
}
|
||||||
fail_fcf_scan:
|
fail_fcf_scan:
|
||||||
|
|
|
@ -162,6 +162,7 @@ struct lpfc_fcf {
|
||||||
#define FCF_REDISC_FOV 0x200 /* Post FCF rediscovery fast failover */
|
#define FCF_REDISC_FOV 0x200 /* Post FCF rediscovery fast failover */
|
||||||
uint32_t addr_mode;
|
uint32_t addr_mode;
|
||||||
uint16_t fcf_rr_init_indx;
|
uint16_t fcf_rr_init_indx;
|
||||||
|
uint32_t eligible_fcf_cnt;
|
||||||
struct lpfc_fcf_rec current_rec;
|
struct lpfc_fcf_rec current_rec;
|
||||||
struct lpfc_fcf_rec failover_rec;
|
struct lpfc_fcf_rec failover_rec;
|
||||||
struct timer_list redisc_wait;
|
struct timer_list redisc_wait;
|
||||||
|
|
Loading…
Reference in New Issue