path: root/drivers/infiniband/core/verbs.c
diff options
authorDenis Drozdov <denisd@mellanox.com>2018-08-14 14:22:35 +0300
committerSaeed Mahameed <saeedm@mellanox.com>2018-10-10 17:58:12 -0700
commit5d6b0cb3369df425de75c94c98eb3f1a86659022 (patch)
tree1a497bbb346e05d83fed7e831f5255f133195075 /drivers/infiniband/core/verbs.c
parentRDMA/netdev: Hoist alloc_netdev_mqs out of the driver (diff)
RDMA/netdev: Fix netlink support in IPoIB
IPoIB netlink support was broken by the below commit since integrating the rdma_netdev support relies on an allocation flow for netdevs that was controlled by the ipoib driver while netdev's rtnl_newlink implementation assumes that the netdev will be allocated by netlink. Such situation leads to crash in __ipoib_device_add, once trying to reuse netlink device. This patch fixes the kernel oops for both mlx4 and mlx5 devices triggered by the following command: Fixes: cd565b4b51e5 ("IB/IPoIB: Support acceleration options callbacks") Signed-off-by: Denis Drozdov <denisd@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> Signed-off-by: Feras Daoud <ferasda@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Diffstat (limited to 'drivers/infiniband/core/verbs.c')
1 files changed, 21 insertions, 7 deletions
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
index 2f34d3412097..8ec7418e99f0 100644
--- a/drivers/infiniband/core/verbs.c
+++ b/drivers/infiniband/core/verbs.c
@@ -2643,13 +2643,27 @@ struct net_device *rdma_alloc_netdev(struct ib_device *device, u8 port_num,
if (!netdev)
return ERR_PTR(-ENOMEM);
- rc = params.initialize_rdma_netdev(device, port_num, netdev,
- params.param);
- if (rc) {
- free_netdev(netdev);
- return ERR_PTR(rc);
- }
return netdev;
+int rdma_init_netdev(struct ib_device *device, u8 port_num,
+ enum rdma_netdev_t type, const char *name,
+ unsigned char name_assign_type,
+ void (*setup)(struct net_device *),
+ struct net_device *netdev)
+ struct rdma_netdev_alloc_params params;
+ int rc;
+ if (!device->rdma_netdev_get_params)
+ return -EOPNOTSUPP;
+ rc = device->rdma_netdev_get_params(device, port_num, type, &params);
+ if (rc)
+ return rc;
+ return params.initialize_rdma_netdev(device, port_num,
+ netdev, params.param);