| From: Jack Morgenstein <jackm@dev.mellanox.co.il> |
| Date: Wed, 23 May 2018 10:41:59 +0300 |
| Subject: net/mlx4: Fix irq-unsafe spinlock usage |
| |
| commit d546b67cda015fb92bfee93d5dc0ceadb91deaee upstream. |
| |
| spin_lock/unlock was used instead of spin_un/lock_irq |
| in a procedure used in process space, on a spinlock |
| which can be grabbed in an interrupt. |
| |
| This caused the stack trace below to be displayed (on kernel |
| 4.17.0-rc1 compiled with Lock Debugging enabled): |
| |
| [ 154.661474] WARNING: SOFTIRQ-safe -> SOFTIRQ-unsafe lock order detected |
| [ 154.668909] 4.17.0-rc1-rdma_rc_mlx+ #3 Tainted: G I |
| [ 154.675856] ----------------------------------------------------- |
| [ 154.682706] modprobe/10159 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire: |
| [ 154.690254] 00000000f3b0e495 (&(&qp_table->lock)->rlock){+.+.}, at: mlx4_qp_remove+0x20/0x50 [mlx4_core] |
| [ 154.700927] |
| and this task is already holding: |
| [ 154.707461] 0000000094373b5d (&(&cq->lock)->rlock/1){....}, at: destroy_qp_common+0x111/0x560 [mlx4_ib] |
| [ 154.718028] which would create a new lock dependency: |
| [ 154.723705] (&(&cq->lock)->rlock/1){....} -> (&(&qp_table->lock)->rlock){+.+.} |
| [ 154.731922] |
| but this new dependency connects a SOFTIRQ-irq-safe lock: |
| [ 154.740798] (&(&cq->lock)->rlock){..-.} |
| [ 154.740800] |
| ... which became SOFTIRQ-irq-safe at: |
| [ 154.752163] _raw_spin_lock_irqsave+0x3e/0x50 |
| [ 154.757163] mlx4_ib_poll_cq+0x36/0x900 [mlx4_ib] |
| [ 154.762554] ipoib_tx_poll+0x4a/0xf0 [ib_ipoib] |
| ... |
| to a SOFTIRQ-irq-unsafe lock: |
| [ 154.815603] (&(&qp_table->lock)->rlock){+.+.} |
| [ 154.815604] |
| ... which became SOFTIRQ-irq-unsafe at: |
| [ 154.827718] ... |
| [ 154.827720] _raw_spin_lock+0x35/0x50 |
| [ 154.833912] mlx4_qp_lookup+0x1e/0x50 [mlx4_core] |
| [ 154.839302] mlx4_flow_attach+0x3f/0x3d0 [mlx4_core] |
| |
| Since mlx4_qp_lookup() is called only in process space, we can |
| simply replace the spin_un/lock calls with spin_un/lock_irq calls. |
| |
| Fixes: 6dc06c08bef1 ("net/mlx4: Fix the check in attaching steering rules") |
| Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> |
| Signed-off-by: Tariq Toukan <tariqt@mellanox.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/net/ethernet/mellanox/mlx4/qp.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/ethernet/mellanox/mlx4/qp.c |
| +++ b/drivers/net/ethernet/mellanox/mlx4/qp.c |
| @@ -363,11 +363,11 @@ struct mlx4_qp *mlx4_qp_lookup(struct ml |
| struct mlx4_qp_table *qp_table = &mlx4_priv(dev)->qp_table; |
| struct mlx4_qp *qp; |
| |
| - spin_lock(&qp_table->lock); |
| + spin_lock_irq(&qp_table->lock); |
| |
| qp = __mlx4_qp_lookup(dev, qpn); |
| |
| - spin_unlock(&qp_table->lock); |
| + spin_unlock_irq(&qp_table->lock); |
| return qp; |
| } |
| |