]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/infiniband/ulp/ipoib/ipoib_main.c
IB/core, opa_vnic, hfi1, mlx5: Properly free rdma_netdev
[karo-tx-linux.git] / drivers / infiniband / ulp / ipoib / ipoib_main.c
index 1015a63de6aed6f3a8b88f3816dc5720a2d24092..9ec0dbea3b6b2716db74b2b470e571b46ce7d586 100644 (file)
@@ -1893,6 +1893,7 @@ static struct net_device
        rn->send = ipoib_send;
        rn->attach_mcast = ipoib_mcast_attach;
        rn->detach_mcast = ipoib_mcast_detach;
+       rn->free_rdma_netdev = free_netdev;
        rn->hca = hca;
 
        dev->netdev_ops = &ipoib_netdev_default_pf;
@@ -2288,6 +2289,8 @@ static void ipoib_remove_one(struct ib_device *device, void *client_data)
                return;
 
        list_for_each_entry_safe(priv, tmp, dev_list, list) {
+               struct rdma_netdev *rn = netdev_priv(priv->dev);
+
                ib_unregister_event_handler(&priv->event_handler);
                flush_workqueue(ipoib_workqueue);
 
@@ -2304,10 +2307,7 @@ static void ipoib_remove_one(struct ib_device *device, void *client_data)
                flush_workqueue(priv->wq);
 
                unregister_netdev(priv->dev);
-               if (device->free_rdma_netdev)
-                       device->free_rdma_netdev(priv->dev);
-               else
-                       free_netdev(priv->dev);
+               rn->free_rdma_netdev(priv->dev);
 
                list_for_each_entry_safe(cpriv, tcpriv, &priv->child_intfs, list)
                        kfree(cpriv);