lkml.org 
[lkml]   [2019]   [Jul]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.2 111/215] IB/ipoib: Add child to parent list only if device initialized
    Date
    [ Upstream commit 91b01061fef9c57d2f5b712a6322ef51061f4efd ]

    Despite failure in ipoib_dev_init() we continue with initialization flow
    and creation of child device. It causes to the situation where this child
    device is added too early to parent device list.

    Change the logic, so in case of failure we properly return error from
    ipoib_dev_init() and add child only in success path.

    Fixes: eaeb39842508 ("IB/ipoib: Move init code to ndo_init")
    Signed-off-by: Valentine Fatiev <valentinef@mellanox.com>
    Reviewed-by: Feras Daoud <ferasda@mellanox.com>
    Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
    Reviewed-by: Jason Gunthorpe <jgg@mellanox.com>
    Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/infiniband/ulp/ipoib/ipoib_main.c | 34 +++++++++++++----------
    1 file changed, 20 insertions(+), 14 deletions(-)

    diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
    index 04ea7db08e87..ac0583ff280d 100644
    --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
    +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
    @@ -1893,12 +1893,6 @@ static void ipoib_child_init(struct net_device *ndev)
    struct ipoib_dev_priv *priv = ipoib_priv(ndev);
    struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent);

    - dev_hold(priv->parent);
    -
    - down_write(&ppriv->vlan_rwsem);
    - list_add_tail(&priv->list, &ppriv->child_intfs);
    - up_write(&ppriv->vlan_rwsem);
    -
    priv->max_ib_mtu = ppriv->max_ib_mtu;
    set_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags);
    memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr, INFINIBAND_ALEN);
    @@ -1941,6 +1935,17 @@ static int ipoib_ndo_init(struct net_device *ndev)
    if (rc) {
    pr_warn("%s: failed to initialize device: %s port %d (ret = %d)\n",
    priv->ca->name, priv->dev->name, priv->port, rc);
    + return rc;
    + }
    +
    + if (priv->parent) {
    + struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent);
    +
    + dev_hold(priv->parent);
    +
    + down_write(&ppriv->vlan_rwsem);
    + list_add_tail(&priv->list, &ppriv->child_intfs);
    + up_write(&ppriv->vlan_rwsem);
    }

    return 0;
    @@ -1958,6 +1963,14 @@ static void ipoib_ndo_uninit(struct net_device *dev)
    */
    WARN_ON(!list_empty(&priv->child_intfs));

    + if (priv->parent) {
    + struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent);
    +
    + down_write(&ppriv->vlan_rwsem);
    + list_del(&priv->list);
    + up_write(&ppriv->vlan_rwsem);
    + }
    +
    ipoib_neigh_hash_uninit(dev);

    ipoib_ib_dev_cleanup(dev);
    @@ -1969,15 +1982,8 @@ static void ipoib_ndo_uninit(struct net_device *dev)
    priv->wq = NULL;
    }

    - if (priv->parent) {
    - struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent);
    -
    - down_write(&ppriv->vlan_rwsem);
    - list_del(&priv->list);
    - up_write(&ppriv->vlan_rwsem);
    -
    + if (priv->parent)
    dev_put(priv->parent);
    - }
    }

    static int ipoib_set_vf_link_state(struct net_device *dev, int vf, int link_state)
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-07-29 22:10    [W:4.189 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site