lkml.org 
[lkml]   [2018]   [Oct]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 344/366] net/mlx4: Fix irq-unsafe spinlock usage
    3.16.60-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Jack Morgenstein <jackm@dev.mellanox.co.il>

    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;
    }

    \
     
     \ /
      Last update: 2018-10-14 18:00    [W:4.912 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site