Re: [PATCH net] bnx2: fix locking when netconsole is used

2016-10-18 Thread Ivan Vecera

Dne 17.10.2016 v 19:21 David Miller napsal(a):

From: Ivan Vecera 
Date: Mon, 17 Oct 2016 18:20:31 +0200


diff --git a/drivers/net/ethernet/broadcom/bnx2.c 
b/drivers/net/ethernet/broadcom/bnx2.c
index 27f11a5..9c408413 100644
--- a/drivers/net/ethernet/broadcom/bnx2.c
+++ b/drivers/net/ethernet/broadcom/bnx2.c
@@ -272,21 +272,24 @@ static u32
 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset)
 {
u32 val;
+   unsigned long flags;



Please order local variable declarations from longest to shortest
line.

Sure Dave, done.

Ivan



Re: [PATCH net] bnx2: fix locking when netconsole is used

2016-10-17 Thread David Miller
From: Ivan Vecera 
Date: Mon, 17 Oct 2016 18:20:31 +0200

> diff --git a/drivers/net/ethernet/broadcom/bnx2.c 
> b/drivers/net/ethernet/broadcom/bnx2.c
> index 27f11a5..9c408413 100644
> --- a/drivers/net/ethernet/broadcom/bnx2.c
> +++ b/drivers/net/ethernet/broadcom/bnx2.c
> @@ -272,21 +272,24 @@ static u32
>  bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset)
>  {
>   u32 val;
> + unsigned long flags;
>  

Please order local variable declarations from longest to shortest
line.

Thank you.


[PATCH net] bnx2: fix locking when netconsole is used

2016-10-17 Thread Ivan Vecera
Functions bnx2_reg_rd_ind(), bnx2_reg_wr_ind() and bnx2_ctx_wr()
can be called with IRQs disabled when netconsole is enabled. So they
should use spin_{,un}lock_irq{save,restore} instead of _bh variants.

Example call flow:
bnx2_poll()
  ->bnx2_poll_link()
->bnx2_phy_int()
  ->bnx2_set_remote_link()
->bnx2_shmem_rd()
  ->bnx2_reg_rd_ind()
-> spin_lock_bh(>indirect_lock);
   spin_unlock_bh(>indirect_lock);
   ...
   -> __local_bh_enable_ip

static inline void __local_bh_enable_ip(unsigned long ip)
  WARN_ON_ONCE(in_irq() || irqs_disabled());   << WARN

Cc: Sony Chacko 
Cc: dept-hsglinuxnic...@qlogic.com
Signed-off-by: Ivan Vecera 
---
 drivers/net/ethernet/broadcom/bnx2.c | 17 +++--
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnx2.c 
b/drivers/net/ethernet/broadcom/bnx2.c
index 27f11a5..9c408413 100644
--- a/drivers/net/ethernet/broadcom/bnx2.c
+++ b/drivers/net/ethernet/broadcom/bnx2.c
@@ -272,21 +272,24 @@ static u32
 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset)
 {
u32 val;
+   unsigned long flags;
 
-   spin_lock_bh(>indirect_lock);
+   spin_lock_irqsave(>indirect_lock, flags);
BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
val = BNX2_RD(bp, BNX2_PCICFG_REG_WINDOW);
-   spin_unlock_bh(>indirect_lock);
+   spin_unlock_irqrestore(>indirect_lock, flags);
return val;
 }
 
 static void
 bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val)
 {
-   spin_lock_bh(>indirect_lock);
+   unsigned long flags;
+
+   spin_lock_irqsave(>indirect_lock, flags);
BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
BNX2_WR(bp, BNX2_PCICFG_REG_WINDOW, val);
-   spin_unlock_bh(>indirect_lock);
+   spin_unlock_irqrestore(>indirect_lock, flags);
 }
 
 static void
@@ -304,8 +307,10 @@ bnx2_shmem_rd(struct bnx2 *bp, u32 offset)
 static void
 bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val)
 {
+   unsigned long flags;
+
offset += cid_addr;
-   spin_lock_bh(>indirect_lock);
+   spin_lock_irqsave(>indirect_lock, flags);
if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
int i;
 
@@ -322,7 +327,7 @@ bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 
val)
BNX2_WR(bp, BNX2_CTX_DATA_ADR, offset);
BNX2_WR(bp, BNX2_CTX_DATA, val);
}
-   spin_unlock_bh(>indirect_lock);
+   spin_unlock_irqrestore(>indirect_lock, flags);
 }
 
 #ifdef BCM_CNIC
-- 
2.7.3