@@ -1026,15 +1026,18 @@ lpfc_handle_rrq_active(struct lpfc_hba *phba)
10261026
10271027 spin_lock_irqsave(&phba->hbalock, iflags);
10281028 phba->hba_flag &= ~HBA_RRQ_ACTIVE;
1029+ spin_unlock_irqrestore(&phba->hbalock, iflags);
1030+
10291031 next_time = jiffies + msecs_to_jiffies(1000 * (phba->fc_ratov + 1));
1032+ spin_lock_irqsave(&phba->rrq_list_lock, iflags);
10301033 list_for_each_entry_safe(rrq, nextrrq,
10311034 &phba->active_rrq_list, list) {
10321035 if (time_after(jiffies, rrq->rrq_stop_time))
10331036 list_move(&rrq->list, &send_rrq);
10341037 else if (time_before(rrq->rrq_stop_time, next_time))
10351038 next_time = rrq->rrq_stop_time;
10361039 }
1037- spin_unlock_irqrestore(&phba->hbalock , iflags);
1040+ spin_unlock_irqrestore(&phba->rrq_list_lock , iflags);
10381041 if ((!list_empty(&phba->active_rrq_list)) &&
10391042 (!test_bit(FC_UNLOADING, &phba->pport->load_flag)))
10401043 mod_timer(&phba->rrq_tmr, next_time);
@@ -1072,16 +1075,16 @@ lpfc_get_active_rrq(struct lpfc_vport *vport, uint16_t xri, uint32_t did)
10721075
10731076 if (phba->sli_rev != LPFC_SLI_REV4)
10741077 return NULL;
1075- spin_lock_irqsave(&phba->hbalock , iflags);
1078+ spin_lock_irqsave(&phba->rrq_list_lock , iflags);
10761079 list_for_each_entry_safe(rrq, nextrrq, &phba->active_rrq_list, list) {
10771080 if (rrq->vport == vport && rrq->xritag == xri &&
10781081 rrq->nlp_DID == did){
10791082 list_del(&rrq->list);
1080- spin_unlock_irqrestore(&phba->hbalock , iflags);
1083+ spin_unlock_irqrestore(&phba->rrq_list_lock , iflags);
10811084 return rrq;
10821085 }
10831086 }
1084- spin_unlock_irqrestore(&phba->hbalock , iflags);
1087+ spin_unlock_irqrestore(&phba->rrq_list_lock , iflags);
10851088 return NULL;
10861089}
10871090
@@ -1109,7 +1112,7 @@ lpfc_cleanup_vports_rrqs(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
11091112 lpfc_sli4_vport_delete_els_xri_aborted(vport);
11101113 lpfc_sli4_vport_delete_fcp_xri_aborted(vport);
11111114 }
1112- spin_lock_irqsave(&phba->hbalock , iflags);
1115+ spin_lock_irqsave(&phba->rrq_list_lock , iflags);
11131116 list_for_each_entry_safe(rrq, nextrrq, &phba->active_rrq_list, list) {
11141117 if (rrq->vport != vport)
11151118 continue;
@@ -1118,7 +1121,7 @@ lpfc_cleanup_vports_rrqs(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
11181121 list_move(&rrq->list, &rrq_list);
11191122
11201123 }
1121- spin_unlock_irqrestore(&phba->hbalock , iflags);
1124+ spin_unlock_irqrestore(&phba->rrq_list_lock , iflags);
11221125
11231126 list_for_each_entry_safe(rrq, nextrrq, &rrq_list, list) {
11241127 list_del(&rrq->list);
@@ -1213,11 +1216,16 @@ lpfc_set_rrq_active(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
12131216 rrq->nlp_DID = ndlp->nlp_DID;
12141217 rrq->vport = ndlp->vport;
12151218 rrq->rxid = rxid;
1216- spin_lock_irqsave(&phba->hbalock, iflags);
1219+
1220+ spin_lock_irqsave(&phba->rrq_list_lock, iflags);
12171221 empty = list_empty(&phba->active_rrq_list);
12181222 list_add_tail(&rrq->list, &phba->active_rrq_list);
1223+ spin_unlock_irqrestore(&phba->rrq_list_lock, iflags);
1224+
1225+ spin_lock_irqsave(&phba->hbalock, iflags);
12191226 phba->hba_flag |= HBA_RRQ_ACTIVE;
12201227 spin_unlock_irqrestore(&phba->hbalock, iflags);
1228+
12211229 if (empty)
12221230 lpfc_worker_wake_up(phba);
12231231 return 0;
0 commit comments