linux/drivers/net/ethernet/mellanox/mlx4
Jack Morgenstein d546b67cda net/mlx4: Fix irq-unsafe spinlock usage
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: 6dc06c08be ("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>
2018-05-23 15:48:58 -04:00
..
alloc.c
catas.c
cmd.c
cq.c
en_clock.c
en_cq.c
en_dcb_nl.c net/mlx4_en: Fix mixed PFC and Global pause user control requests 2018-03-27 12:02:30 -04:00
en_ethtool.c net/mlx4_en: Verify coalescing parameters are in range 2018-05-10 16:09:05 -04:00
en_main.c net/mlx4_en: Fix mixed PFC and Global pause user control requests 2018-03-27 12:02:30 -04:00
en_netdev.c net/mlx4_en: Fix an error handling path in 'mlx4_en_init_netdev()' 2018-05-10 17:46:45 -04:00
en_port.c net/mlx4_en: Add physical RX/TX bytes/packets counters 2018-02-27 14:53:26 -05:00
en_port.h
en_resources.c
en_rx.c net/mlx4_en: CHECKSUM_COMPLETE support for fragments 2018-04-01 13:56:37 -04:00
en_selftest.c
en_tx.c
eq.c
fw.c RDMA/mlx4: Move flag constants to uapi header 2018-03-15 15:58:03 -06:00
fw.h
fw_qos.c
fw_qos.h
icm.c
icm.h
intf.c net/mlx4: fix spelling mistake: "Inrerface" -> "Interface" and rephrase message 2018-05-23 14:58:10 -04:00
Kconfig
main.c net/mlx4_core: Fix error handling in mlx4_init_port_info. 2018-05-14 16:29:08 -04:00
Makefile
mcg.c
mlx4.h
mlx4_en.h net/mlx4_en: Verify coalescing parameters are in range 2018-05-10 16:09:05 -04:00
mlx4_stats.h net/mlx4_en: Add physical RX/TX bytes/packets counters 2018-02-27 14:53:26 -05:00
mr.c
pd.c
port.c
profile.c
qp.c net/mlx4: Fix irq-unsafe spinlock usage 2018-05-23 15:48:58 -04:00
reset.c
resource_tracker.c net/mlx4_core: Fix memory leak while delete slave's resources 2018-03-27 12:02:30 -04:00
sense.c
srq.c