RDMA/nes: Fix incorrect unlock in nes_process_mac_intr()
authorChien Tung <chien.tin.tung@intel.com>
Tue, 25 May 2010 15:13:09 +0000 (10:13 -0500)
committerRoland Dreier <rolandd@cisco.com>
Tue, 25 May 2010 16:53:06 +0000 (09:53 -0700)
Commit ce6e74f2 ("RDMA/nes: Make nesadapter->phy_lock usage
consistent") introduced a problem where phy_lock was only unlocked
within an if statement and so nes_process_mac_intr() could return with
phy_lock still held.  Fix this.

This was discovered because of the sparse warning:

    drivers/infiniband/hw/nes/nes_hw.c:2643:9: warning: context imbalance in 'nes_process_mac_intr' - different lock contexts for basic block

Reported-by: Roland Dreier <rdreier@cisco.com>
Signed-off-by: Chien Tung <chien.tin.tung@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/nes/nes_hw.c

index bb9c77504fe265fe2ad96c6d40e73c73226fd804..57874a165083df1d62ce1bbd9f4e7635b52d071d 100644 (file)
@@ -2584,7 +2584,6 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number)
                                break;
                        }
                }
-               spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
 
                if (phy_data & 0x0004) {
                        if (wide_ppm_offset &&
@@ -2639,6 +2638,8 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number)
                }
        }
 
+       spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
+
        nesadapter->mac_sw_state[mac_number] = NES_MAC_SW_IDLE;
 }