lkml.org 
[lkml]   [2017]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.18 11/35] IB/ipoib: Replace list_del of the neigh->list with list_del_init
    Date
    3.18-stable review patch.  If anyone has any objections, please let me know.

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

    From: Feras Daoud <ferasda@mellanox.com>


    [ Upstream commit c586071d1dc8227a7182179b8e50ee92cc43f6d2 ]

    In order to resolve a situation where a few process delete
    the same list element in sequence and cause panic, list_del
    is replaced with list_del_init. In this case if the first
    process that calls list_del releases the lock before acquiring
    it again, other processes who can acquire the lock will call
    list_del_init.

    Fixes: b63b70d87741 ("IPoIB: Use a private hash table for path lookup")
    Signed-off-by: Feras Daoud <ferasda@mellanox.com>
    Signed-off-by: Erez Shitrit <erezsh@mellanox.com>
    Reviewed-by: Alex Vesker <valex@mellanox.com>
    Signed-off-by: Leon Romanovsky <leon@kernel.org>
    Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com>
    Signed-off-by: Doug Ledford <dledford@redhat.com>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/infiniband/ulp/ipoib/ipoib_main.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
    +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
    @@ -958,7 +958,7 @@ static void __ipoib_reap_neigh(struct ip
    rcu_dereference_protected(neigh->hnext,
    lockdep_is_held(&priv->lock)));
    /* remove from path/mc list */
    - list_del(&neigh->list);
    + list_del_init(&neigh->list);
    call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
    } else {
    np = &neigh->hnext;
    @@ -1121,7 +1121,7 @@ void ipoib_neigh_free(struct ipoib_neigh
    rcu_dereference_protected(neigh->hnext,
    lockdep_is_held(&priv->lock)));
    /* remove from parent list */
    - list_del(&neigh->list);
    + list_del_init(&neigh->list);
    call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
    return;
    } else {
    @@ -1206,7 +1206,7 @@ void ipoib_del_neighs_by_gid(struct net_
    rcu_dereference_protected(neigh->hnext,
    lockdep_is_held(&priv->lock)));
    /* remove from parent list */
    - list_del(&neigh->list);
    + list_del_init(&neigh->list);
    call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
    } else {
    np = &neigh->hnext;
    @@ -1248,7 +1248,7 @@ static void ipoib_flush_neighs(struct ip
    rcu_dereference_protected(neigh->hnext,
    lockdep_is_held(&priv->lock)));
    /* remove from path/mc list */
    - list_del(&neigh->list);
    + list_del_init(&neigh->list);
    call_rcu(&neigh->rcu, ipoib_neigh_reclaim);
    }
    }

    \
     
     \ /
      Last update: 2017-10-06 11:34    [W:4.420 / U:0.312 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site