aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/brocade/bna/bnad.c
diff options
context:
space:
mode:
authorRasesh Mody <rmody@brocade.com>2011-08-30 11:27:45 -0400
committerDavid S. Miller <davem@davemloft.net>2011-09-15 15:36:33 -0400
commitdfee325ad23ff4714981c9d2a4df6386493a4475 (patch)
tree744b2abe6cde55f5049f8eafe75c3bfa93dd2f82 /drivers/net/ethernet/brocade/bna/bnad.c
parent761fab374e5b8efa6f7a8650ff546905578a482d (diff)
bna: MBOX IRQ Flag Check after Locking
Change details: - Check the BNAD_RF_MBOX_IRQ_DISABLED flag after acquiring the bna_lock, since checking the flag and executing bna_mbox_handler needs to be atomic. If not, it opens up window where flag is reset when it was checked, but got set while spinning on the lock by the other thread which is actually holding the lock Signed-off-by: Gurunatha Karaje <gkaraje@brocade.com> Signed-off-by: Rasesh Mody <rmody@brocade.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/brocade/bna/bnad.c')
-rw-r--r--drivers/net/ethernet/brocade/bna/bnad.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index c81550b076ad..11990cf0a265 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -586,10 +586,11 @@ bnad_msix_mbox_handler(int irq, void *data)
586 unsigned long flags; 586 unsigned long flags;
587 struct bnad *bnad = (struct bnad *)data; 587 struct bnad *bnad = (struct bnad *)data;
588 588
589 if (unlikely(test_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags)))
590 return IRQ_HANDLED;
591
592 spin_lock_irqsave(&bnad->bna_lock, flags); 589 spin_lock_irqsave(&bnad->bna_lock, flags);
590 if (unlikely(test_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags))) {
591 spin_unlock_irqrestore(&bnad->bna_lock, flags);
592 return IRQ_HANDLED;
593 }
593 594
594 bna_intr_status_get(&bnad->bna, intr_status); 595 bna_intr_status_get(&bnad->bna, intr_status);
595 596
@@ -612,15 +613,18 @@ bnad_isr(int irq, void *data)
612 struct bnad_rx_ctrl *rx_ctrl; 613 struct bnad_rx_ctrl *rx_ctrl;
613 struct bna_tcb *tcb = NULL; 614 struct bna_tcb *tcb = NULL;
614 615
615 if (unlikely(test_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags))) 616 spin_lock_irqsave(&bnad->bna_lock, flags);
617 if (unlikely(test_bit(BNAD_RF_MBOX_IRQ_DISABLED, &bnad->run_flags))) {
618 spin_unlock_irqrestore(&bnad->bna_lock, flags);
616 return IRQ_NONE; 619 return IRQ_NONE;
620 }
617 621
618 bna_intr_status_get(&bnad->bna, intr_status); 622 bna_intr_status_get(&bnad->bna, intr_status);
619 623
620 if (unlikely(!intr_status)) 624 if (unlikely(!intr_status)) {
625 spin_unlock_irqrestore(&bnad->bna_lock, flags);
621 return IRQ_NONE; 626 return IRQ_NONE;
622 627 }
623 spin_lock_irqsave(&bnad->bna_lock, flags);
624 628
625 if (BNA_IS_MBOX_ERR_INTR(&bnad->bna, intr_status)) 629 if (BNA_IS_MBOX_ERR_INTR(&bnad->bna, intr_status))
626 bna_mbox_handler(&bnad->bna, intr_status); 630 bna_mbox_handler(&bnad->bna, intr_status);