diff options
author | Alex Vesker <valex@mellanox.com> | 2017-09-24 14:46:33 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2017-09-25 11:47:24 -0400 |
commit | 7c9d9662103ae1c11acc7bfc47d988466cff23cf (patch) | |
tree | 1bf5b71801a8895c4fc14c8df5c395aab5e8dac3 | |
parent | 9c6f42e9254150d2772242d9f8bd8d0b7b7431ff (diff) |
IB/ipoib: Fix inconsistency with free_netdev and free_rdma_netdev
Call free_rdma_netdev instead of free_netdev each time we want to
release a netdevice. This call is also relevant for future freeing
of offloaded child interfaces.
This patch also adds a missing call for free netdevice when releasing
a parent interface that has child interfaces using ipoib_remove_one.
Fixes: cd565b4b51e5 ('IB/IPoIB: Support acceleration options callbacks')
Signed-off-by: Alex Vesker <valex@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_main.c | 15 | ||||
-rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_vlan.c | 10 |
2 files changed, 19 insertions, 6 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index bac95b509a9b..dcc77014018d 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -2180,6 +2180,7 @@ static struct net_device *ipoib_add_port(const char *format, | |||
2180 | { | 2180 | { |
2181 | struct ipoib_dev_priv *priv; | 2181 | struct ipoib_dev_priv *priv; |
2182 | struct ib_port_attr attr; | 2182 | struct ib_port_attr attr; |
2183 | struct rdma_netdev *rn; | ||
2183 | int result = -ENOMEM; | 2184 | int result = -ENOMEM; |
2184 | 2185 | ||
2185 | priv = ipoib_intf_alloc(hca, port, format); | 2186 | priv = ipoib_intf_alloc(hca, port, format); |
@@ -2279,7 +2280,8 @@ register_failed: | |||
2279 | ipoib_dev_cleanup(priv->dev); | 2280 | ipoib_dev_cleanup(priv->dev); |
2280 | 2281 | ||
2281 | device_init_failed: | 2282 | device_init_failed: |
2282 | free_netdev(priv->dev); | 2283 | rn = netdev_priv(priv->dev); |
2284 | rn->free_rdma_netdev(priv->dev); | ||
2283 | kfree(priv); | 2285 | kfree(priv); |
2284 | 2286 | ||
2285 | alloc_mem_failed: | 2287 | alloc_mem_failed: |
@@ -2328,7 +2330,7 @@ static void ipoib_remove_one(struct ib_device *device, void *client_data) | |||
2328 | return; | 2330 | return; |
2329 | 2331 | ||
2330 | list_for_each_entry_safe(priv, tmp, dev_list, list) { | 2332 | list_for_each_entry_safe(priv, tmp, dev_list, list) { |
2331 | struct rdma_netdev *rn = netdev_priv(priv->dev); | 2333 | struct rdma_netdev *parent_rn = netdev_priv(priv->dev); |
2332 | 2334 | ||
2333 | ib_unregister_event_handler(&priv->event_handler); | 2335 | ib_unregister_event_handler(&priv->event_handler); |
2334 | flush_workqueue(ipoib_workqueue); | 2336 | flush_workqueue(ipoib_workqueue); |
@@ -2350,10 +2352,15 @@ static void ipoib_remove_one(struct ib_device *device, void *client_data) | |||
2350 | unregister_netdev(priv->dev); | 2352 | unregister_netdev(priv->dev); |
2351 | mutex_unlock(&priv->sysfs_mutex); | 2353 | mutex_unlock(&priv->sysfs_mutex); |
2352 | 2354 | ||
2353 | rn->free_rdma_netdev(priv->dev); | 2355 | parent_rn->free_rdma_netdev(priv->dev); |
2356 | |||
2357 | list_for_each_entry_safe(cpriv, tcpriv, &priv->child_intfs, list) { | ||
2358 | struct rdma_netdev *child_rn; | ||
2354 | 2359 | ||
2355 | list_for_each_entry_safe(cpriv, tcpriv, &priv->child_intfs, list) | 2360 | child_rn = netdev_priv(cpriv->dev); |
2361 | child_rn->free_rdma_netdev(cpriv->dev); | ||
2356 | kfree(cpriv); | 2362 | kfree(cpriv); |
2363 | } | ||
2357 | 2364 | ||
2358 | kfree(priv); | 2365 | kfree(priv); |
2359 | } | 2366 | } |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c index e01c58edca15..55a9b71ed05a 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c | |||
@@ -179,7 +179,10 @@ out: | |||
179 | mutex_unlock(&ppriv->sysfs_mutex); | 179 | mutex_unlock(&ppriv->sysfs_mutex); |
180 | 180 | ||
181 | if (result && priv) { | 181 | if (result && priv) { |
182 | free_netdev(priv->dev); | 182 | struct rdma_netdev *rn; |
183 | |||
184 | rn = netdev_priv(priv->dev); | ||
185 | rn->free_rdma_netdev(priv->dev); | ||
183 | kfree(priv); | 186 | kfree(priv); |
184 | } | 187 | } |
185 | 188 | ||
@@ -232,7 +235,10 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey) | |||
232 | mutex_unlock(&ppriv->sysfs_mutex); | 235 | mutex_unlock(&ppriv->sysfs_mutex); |
233 | 236 | ||
234 | if (dev) { | 237 | if (dev) { |
235 | free_netdev(dev); | 238 | struct rdma_netdev *rn; |
239 | |||
240 | rn = netdev_priv(dev); | ||
241 | rn->free_rdma_netdev(priv->dev); | ||
236 | kfree(priv); | 242 | kfree(priv); |
237 | return 0; | 243 | return 0; |
238 | } | 244 | } |