Skip to content

Commit 730c41d

Browse files
Yevgeny Petrilindavem330
Yevgeny Petrilin
authored andcommitted
mlx4: Replacing pool_lock with mutex
Under the spinlock we call request_irq(), which allocates memory with GFP_KERNEL, This causes the following trace when DEBUG_SPINLOCK is enabled, it can cause the following trace: BUG: spinlock wrong CPU on CPU#2, ethtool/2595 lock: ffff8801f9cbc2b0, .magic: dead4ead, .owner: ethtool/2595, .owner_cpu: 0 Pid: 2595, comm: ethtool Not tainted 3.0.18 raspberrypi#2 Call Trace: spin_bug+0xa2/0xf0 do_raw_spin_unlock+0x71/0xa0 _raw_spin_unlock+0xe/0x10 mlx4_assign_eq+0x12b/0x190 [mlx4_core] mlx4_en_activate_cq+0x252/0x2d0 [mlx4_en] ? mlx4_en_activate_rx_rings+0x227/0x370 [mlx4_en] mlx4_en_start_port+0x189/0xb90 [mlx4_en] mlx4_en_set_ringparam+0x29a/0x340 [mlx4_en] dev_ethtool+0x816/0xb10 ? dev_get_by_name_rcu+0xa4/0xe0 dev_ioctl+0x2b5/0x470 handle_mm_fault+0x1cd/0x2d0 sock_do_ioctl+0x5d/0x70 sock_ioctl+0x79/0x2f0 do_vfs_ioctl+0x8c/0x340 sys_ioctl+0xa1/0xb0 system_call_fastpath+0x16/0x1b Replacing with mutex, which is enough in this case. Signed-off-by: Yevgeny Petrilin <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 15103aa commit 730c41d

File tree

3 files changed

+6
-6
lines changed

3 files changed

+6
-6
lines changed

drivers/net/ethernet/mellanox/mlx4/eq.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,7 @@ int mlx4_assign_eq(struct mlx4_dev *dev, char* name, int * vector)
10361036
struct mlx4_priv *priv = mlx4_priv(dev);
10371037
int vec = 0, err = 0, i;
10381038

1039-
spin_lock(&priv->msix_ctl.pool_lock);
1039+
mutex_lock(&priv->msix_ctl.pool_lock);
10401040
for (i = 0; !vec && i < dev->caps.comp_pool; i++) {
10411041
if (~priv->msix_ctl.pool_bm & 1ULL << i) {
10421042
priv->msix_ctl.pool_bm |= 1ULL << i;
@@ -1058,7 +1058,7 @@ int mlx4_assign_eq(struct mlx4_dev *dev, char* name, int * vector)
10581058
eq_set_ci(&priv->eq_table.eq[vec], 1);
10591059
}
10601060
}
1061-
spin_unlock(&priv->msix_ctl.pool_lock);
1061+
mutex_unlock(&priv->msix_ctl.pool_lock);
10621062

10631063
if (vec) {
10641064
*vector = vec;
@@ -1079,13 +1079,13 @@ void mlx4_release_eq(struct mlx4_dev *dev, int vec)
10791079
if (likely(i >= 0)) {
10801080
/*sanity check , making sure were not trying to free irq's
10811081
Belonging to a legacy EQ*/
1082-
spin_lock(&priv->msix_ctl.pool_lock);
1082+
mutex_lock(&priv->msix_ctl.pool_lock);
10831083
if (priv->msix_ctl.pool_bm & 1ULL << i) {
10841084
free_irq(priv->eq_table.eq[vec].irq,
10851085
&priv->eq_table.eq[vec]);
10861086
priv->msix_ctl.pool_bm &= ~(1ULL << i);
10871087
}
1088-
spin_unlock(&priv->msix_ctl.pool_lock);
1088+
mutex_unlock(&priv->msix_ctl.pool_lock);
10891089
}
10901090

10911091
}

drivers/net/ethernet/mellanox/mlx4/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1828,7 +1828,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
18281828
goto err_master_mfunc;
18291829

18301830
priv->msix_ctl.pool_bm = 0;
1831-
spin_lock_init(&priv->msix_ctl.pool_lock);
1831+
mutex_init(&priv->msix_ctl.pool_lock);
18321832

18331833
mlx4_enable_msi_x(dev);
18341834
if ((mlx4_is_mfunc(dev)) &&

drivers/net/ethernet/mellanox/mlx4/mlx4.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,7 @@ struct mlx4_sense {
697697

698698
struct mlx4_msix_ctl {
699699
u64 pool_bm;
700-
spinlock_t pool_lock;
700+
struct mutex pool_lock;
701701
};
702702

703703
struct mlx4_steer {

0 commit comments

Comments
 (0)