Skip to content

Commit a4b70a0

Browse files
sowminivdavem330
authored andcommitted
sunvnet: clean up objects created in vnet_new() on vnet_exit()
Nothing cleans up the objects created by vnet_new(), they are completely leaked. vnet_exit(), after doing the vio_unregister_driver() to clean up ports, should call a helper function that iterates over vnet_list and cleans up those objects. This includes unregister_netdevice() as well as free_netdev(). Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com> Acked-by: Dave Kleikamp <dave.kleikamp@oracle.com> Reviewed-by: Karl Volz <karl.volz@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 7a9810e commit a4b70a0

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

drivers/net/ethernet/sun/sunvnet.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,24 @@ static struct vnet *vnet_find_or_create(const u64 *local_mac)
10831083
return vp;
10841084
}
10851085

1086+
static void vnet_cleanup(void)
1087+
{
1088+
struct vnet *vp;
1089+
struct net_device *dev;
1090+
1091+
mutex_lock(&vnet_list_mutex);
1092+
while (!list_empty(&vnet_list)) {
1093+
vp = list_first_entry(&vnet_list, struct vnet, list);
1094+
list_del(&vp->list);
1095+
dev = vp->dev;
1096+
/* vio_unregister_driver() should have cleaned up port_list */
1097+
BUG_ON(!list_empty(&vp->port_list));
1098+
unregister_netdev(dev);
1099+
free_netdev(dev);
1100+
}
1101+
mutex_unlock(&vnet_list_mutex);
1102+
}
1103+
10861104
static const char *local_mac_prop = "local-mac-address";
10871105

10881106
static struct vnet *vnet_find_parent(struct mdesc_handle *hp,
@@ -1240,7 +1258,6 @@ static int vnet_port_remove(struct vio_dev *vdev)
12401258

12411259
kfree(port);
12421260

1243-
unregister_netdev(vp->dev);
12441261
}
12451262
return 0;
12461263
}
@@ -1268,6 +1285,7 @@ static int __init vnet_init(void)
12681285
static void __exit vnet_exit(void)
12691286
{
12701287
vio_unregister_driver(&vnet_port_driver);
1288+
vnet_cleanup();
12711289
}
12721290

12731291
module_init(vnet_init);

0 commit comments

Comments
 (0)