lkml.org 
[lkml]   [2017]   [Jun]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 034/212] IB/ipoib: Fix deadlock over vlan_mutex
    3.16.44-rc1 review patch.  If anyone has any objections, please let me know.

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

    From: Feras Daoud <ferasda@mellanox.com>

    commit 1c3098cdb05207e740715857df7b0998e372f527 upstream.

    This patch fixes Deadlock while executing ipoib_vlan_delete.

    The function takes the vlan_rwsem semaphore and calls
    unregister_netdevice. The later function calls
    ipoib_mcast_stop_thread that cause workqueue flush.

    When the queue has one of the ipoib_ib_dev_flush_xxx events,
    a deadlock occur because these events also tries to catch the
    same vlan_rwsem semaphore.

    To fix, unregister_netdevice should be called after releasing
    the semaphore.

    Fixes: cbbe1efa4972 ("IPoIB: Fix deadlock between ipoib_open() and child interface create")
    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>
    Signed-off-by: Doug Ledford <dledford@redhat.com>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/infiniband/ulp/ipoib/ipoib_vlan.c | 6 +++++-
    1 file changed, 5 insertions(+), 1 deletion(-)

    --- a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
    +++ b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c
    @@ -196,7 +196,6 @@ int ipoib_vlan_delete(struct net_device
    list_for_each_entry_safe(priv, tpriv, &ppriv->child_intfs, list) {
    if (priv->pkey == pkey &&
    priv->child_type == IPOIB_LEGACY_CHILD) {
    - unregister_netdevice(priv->dev);
    list_del(&priv->list);
    dev = priv->dev;
    break;
    @@ -204,6 +203,11 @@ int ipoib_vlan_delete(struct net_device
    }
    up_write(&ppriv->vlan_rwsem);

    + if (dev) {
    + ipoib_dbg(ppriv, "delete child vlan %s\n", dev->name);
    + unregister_netdevice(dev);
    + }
    +
    rtnl_unlock();

    if (dev) {
    \
     
     \ /
      Last update: 2017-06-01 18:33    [W:3.004 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site