lpfc: Fix locking for postbufq when freeing
Fix locking for postbufq when freeing Signed-off-by: James Smart <james.smart@emulex.com> Reviewed-By: Dick Kennedy <dick.kennedy@emulex.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
committed by
Christoph Hellwig
parent
bcece5f557
commit
07eab624e5
@@ -836,19 +836,28 @@ lpfc_hba_free_post_buf(struct lpfc_hba *phba)
|
|||||||
struct lpfc_sli *psli = &phba->sli;
|
struct lpfc_sli *psli = &phba->sli;
|
||||||
struct lpfc_sli_ring *pring;
|
struct lpfc_sli_ring *pring;
|
||||||
struct lpfc_dmabuf *mp, *next_mp;
|
struct lpfc_dmabuf *mp, *next_mp;
|
||||||
|
LIST_HEAD(buflist);
|
||||||
|
int count;
|
||||||
|
|
||||||
if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)
|
if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED)
|
||||||
lpfc_sli_hbqbuf_free_all(phba);
|
lpfc_sli_hbqbuf_free_all(phba);
|
||||||
else {
|
else {
|
||||||
/* Cleanup preposted buffers on the ELS ring */
|
/* Cleanup preposted buffers on the ELS ring */
|
||||||
spin_lock_irq(&phba->hbalock);
|
|
||||||
pring = &psli->ring[LPFC_ELS_RING];
|
pring = &psli->ring[LPFC_ELS_RING];
|
||||||
list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) {
|
spin_lock_irq(&phba->hbalock);
|
||||||
|
list_splice_init(&pring->postbufq, &buflist);
|
||||||
|
spin_unlock_irq(&phba->hbalock);
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
list_for_each_entry_safe(mp, next_mp, &buflist, list) {
|
||||||
list_del(&mp->list);
|
list_del(&mp->list);
|
||||||
pring->postbufq_cnt--;
|
count++;
|
||||||
lpfc_mbuf_free(phba, mp->virt, mp->phys);
|
lpfc_mbuf_free(phba, mp->virt, mp->phys);
|
||||||
kfree(mp);
|
kfree(mp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spin_lock_irq(&phba->hbalock);
|
||||||
|
pring->postbufq_cnt -= count;
|
||||||
spin_unlock_irq(&phba->hbalock);
|
spin_unlock_irq(&phba->hbalock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user