]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/infiniband/hw/mlx5/main.c
IB/core, opa_vnic, hfi1, mlx5: Properly free rdma_netdev
[karo-tx-linux.git] / drivers / infiniband / hw / mlx5 / main.c
index 9ecc089d4529440fa87929fb74461558db920549..afa5f6e88e1df36f46741187be85d8803c70eb03 100644 (file)
@@ -3542,6 +3542,11 @@ static int mlx5_ib_get_hw_stats(struct ib_device *ibdev,
        return num_counters;
 }
 
+static void mlx5_ib_free_rdma_netdev(struct net_device *netdev)
+{
+       return mlx5_rdma_netdev_free(netdev);
+}
+
 static struct net_device*
 mlx5_ib_alloc_rdma_netdev(struct ib_device *hca,
                          u8 port_num,
@@ -3550,16 +3555,19 @@ mlx5_ib_alloc_rdma_netdev(struct ib_device *hca,
                          unsigned char name_assign_type,
                          void (*setup)(struct net_device *))
 {
+       struct net_device *netdev;
+       struct rdma_netdev *rn;
+
        if (type != RDMA_NETDEV_IPOIB)
                return ERR_PTR(-EOPNOTSUPP);
 
-       return mlx5_rdma_netdev_alloc(to_mdev(hca)->mdev, hca,
-                                     name, setup);
-}
-
-static void mlx5_ib_free_rdma_netdev(struct net_device *netdev)
-{
-       return mlx5_rdma_netdev_free(netdev);
+       netdev = mlx5_rdma_netdev_alloc(to_mdev(hca)->mdev, hca,
+                                       name, setup);
+       if (likely(!IS_ERR_OR_NULL(netdev))) {
+               rn = netdev_priv(netdev);
+               rn->free_rdma_netdev = mlx5_ib_free_rdma_netdev;
+       }
+       return netdev;
 }
 
 static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
@@ -3692,10 +3700,9 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
        dev->ib_dev.check_mr_status     = mlx5_ib_check_mr_status;
        dev->ib_dev.get_port_immutable  = mlx5_port_immutable;
        dev->ib_dev.get_dev_fw_str      = get_dev_fw_str;
-       if (MLX5_CAP_GEN(mdev, ipoib_enhanced_offloads)) {
+       if (MLX5_CAP_GEN(mdev, ipoib_enhanced_offloads))
                dev->ib_dev.alloc_rdma_netdev   = mlx5_ib_alloc_rdma_netdev;
-               dev->ib_dev.free_rdma_netdev    = mlx5_ib_free_rdma_netdev;
-       }
+
        if (mlx5_core_is_pf(mdev)) {
                dev->ib_dev.get_vf_config       = mlx5_ib_get_vf_config;
                dev->ib_dev.set_vf_link_state   = mlx5_ib_set_vf_link_state;