Commit 839900c6 authored by Bhanu Gollapudi's avatar Bhanu Gollapudi Committed by James Bottomley

[SCSI] bnx2fc: Avoid holding cq_lock when iounmap() is called

With kernel debugging enabled, holding cq_lock when calling
bnx2fc_free_session_resc() which calls iounmap() leads to a warning
stack trace [INFO: HARDIRQ-safe -> HARDIRQ-unsafe lock order detected].
iounmap() grabs a HARDIRQ-unsafe vmlist lock, so holding
spin_lock_bh(cq_lock) when calling iounmap() will trigger the LOCKDEP
warning.  Since cq_lock is required only to guard against deletion, hold
the lock just before freeing the cq.
Signed-off-by: default avatarBhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: default avatarNithin Nayak Sujir <nsujir@broadcom.com>
Signed-off-by: default avatarMichael Chan <mchan@broadcom.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 70c7c88a
...@@ -304,10 +304,8 @@ static void bnx2fc_upload_session(struct fcoe_port *port, ...@@ -304,10 +304,8 @@ static void bnx2fc_upload_session(struct fcoe_port *port,
" not sent to FW\n"); " not sent to FW\n");
/* Free session resources */ /* Free session resources */
spin_lock_bh(&tgt->cq_lock);
bnx2fc_free_session_resc(hba, tgt); bnx2fc_free_session_resc(hba, tgt);
bnx2fc_free_conn_id(hba, tgt->fcoe_conn_id); bnx2fc_free_conn_id(hba, tgt->fcoe_conn_id);
spin_unlock_bh(&tgt->cq_lock);
} }
static int bnx2fc_init_tgt(struct bnx2fc_rport *tgt, static int bnx2fc_init_tgt(struct bnx2fc_rport *tgt,
...@@ -830,11 +828,13 @@ static void bnx2fc_free_session_resc(struct bnx2fc_hba *hba, ...@@ -830,11 +828,13 @@ static void bnx2fc_free_session_resc(struct bnx2fc_hba *hba,
tgt->rq = NULL; tgt->rq = NULL;
} }
/* Free CQ */ /* Free CQ */
spin_lock_bh(&tgt->cq_lock);
if (tgt->cq) { if (tgt->cq) {
dma_free_coherent(&hba->pcidev->dev, tgt->cq_mem_size, dma_free_coherent(&hba->pcidev->dev, tgt->cq_mem_size,
tgt->cq, tgt->cq_dma); tgt->cq, tgt->cq_dma);
tgt->cq = NULL; tgt->cq = NULL;
} }
spin_unlock_bh(&tgt->cq_lock);
/* Free SQ */ /* Free SQ */
if (tgt->sq) { if (tgt->sq) {
dma_free_coherent(&hba->pcidev->dev, tgt->sq_mem_size, dma_free_coherent(&hba->pcidev->dev, tgt->sq_mem_size,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment