summaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp
diff options
context:
space:
mode:
authorValentine Fatiev <valentinef@mellanox.com>2019-06-30 09:48:41 -0400
committerJason Gunthorpe <jgg@mellanox.com>2019-07-04 13:20:54 -0400
commit91b01061fef9c57d2f5b712a6322ef51061f4efd (patch)
tree93e65463effdaeedfaf10f7b0efe0d9e1f58e3a5 /drivers/infiniband/ulp
parent50ba3c18a4e549ba6a5a4672dfb3eb30fcb7d570 (diff)
IB/ipoib: Add child to parent list only if device initialized
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>
Diffstat (limited to 'drivers/infiniband/ulp')
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_main.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 9b5e11d3fb85..bb904ec511be 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)
1893 struct ipoib_dev_priv *priv = ipoib_priv(ndev); 1893 struct ipoib_dev_priv *priv = ipoib_priv(ndev);
1894 struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent); 1894 struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent);
1895 1895
1896 dev_hold(priv->parent);
1897
1898 down_write(&ppriv->vlan_rwsem);
1899 list_add_tail(&priv->list, &ppriv->child_intfs);
1900 up_write(&ppriv->vlan_rwsem);
1901
1902 priv->max_ib_mtu = ppriv->max_ib_mtu; 1896 priv->max_ib_mtu = ppriv->max_ib_mtu;
1903 set_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags); 1897 set_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags);
1904 memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr, INFINIBAND_ALEN); 1898 memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr, INFINIBAND_ALEN);
@@ -1941,6 +1935,17 @@ static int ipoib_ndo_init(struct net_device *ndev)
1941 if (rc) { 1935 if (rc) {
1942 pr_warn("%s: failed to initialize device: %s port %d (ret = %d)\n", 1936 pr_warn("%s: failed to initialize device: %s port %d (ret = %d)\n",
1943 priv->ca->name, priv->dev->name, priv->port, rc); 1937 priv->ca->name, priv->dev->name, priv->port, rc);
1938 return rc;
1939 }
1940
1941 if (priv->parent) {
1942 struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent);
1943
1944 dev_hold(priv->parent);
1945
1946 down_write(&ppriv->vlan_rwsem);
1947 list_add_tail(&priv->list, &ppriv->child_intfs);
1948 up_write(&ppriv->vlan_rwsem);
1944 } 1949 }
1945 1950
1946 return 0; 1951 return 0;
@@ -1958,6 +1963,14 @@ static void ipoib_ndo_uninit(struct net_device *dev)
1958 */ 1963 */
1959 WARN_ON(!list_empty(&priv->child_intfs)); 1964 WARN_ON(!list_empty(&priv->child_intfs));
1960 1965
1966 if (priv->parent) {
1967 struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent);
1968
1969 down_write(&ppriv->vlan_rwsem);
1970 list_del(&priv->list);
1971 up_write(&ppriv->vlan_rwsem);
1972 }
1973
1961 ipoib_neigh_hash_uninit(dev); 1974 ipoib_neigh_hash_uninit(dev);
1962 1975
1963 ipoib_ib_dev_cleanup(dev); 1976 ipoib_ib_dev_cleanup(dev);
@@ -1969,15 +1982,8 @@ static void ipoib_ndo_uninit(struct net_device *dev)
1969 priv->wq = NULL; 1982 priv->wq = NULL;
1970 } 1983 }
1971 1984
1972 if (priv->parent) { 1985 if (priv->parent)
1973 struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent);
1974
1975 down_write(&ppriv->vlan_rwsem);
1976 list_del(&priv->list);
1977 up_write(&ppriv->vlan_rwsem);
1978
1979 dev_put(priv->parent); 1986 dev_put(priv->parent);
1980 }
1981} 1987}
1982 1988
1983static int ipoib_set_vf_link_state(struct net_device *dev, int vf, int link_state) 1989static int ipoib_set_vf_link_state(struct net_device *dev, int vf, int link_state)