diff options
author | Krishna Kumar <krkumar2@in.ibm.com> | 2011-07-20 03:56:02 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-07-21 21:29:34 -0700 |
commit | 2e66f55b3afa290337a47e6ea134ac071c5dd9a7 (patch) | |
tree | 8955f5e6c3502174768de8c51d480a0abbf51a40 | |
parent | 87c48fa3b4630905f98268dde838ee43626a060c (diff) | |
download | blackbird-op-linux-2e66f55b3afa290337a47e6ea134ac071c5dd9a7.tar.gz blackbird-op-linux-2e66f55b3afa290337a47e6ea134ac071c5dd9a7.zip |
virtio_net: Fix panic in virtnet_remove
Fix a panic in virtnet_remove. unregister_netdev has already
freed up the netdev (and virtnet_info) due to dev->destructor
being set, while virtnet_info is still required. Remove
virtnet_free altogether, and move the freeing of the per-cpu
statistics from virtnet_free to virtnet_remove.
Tested patch below.
Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/virtio_net.c | 10 |
1 files changed, 1 insertions, 9 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index fbea637eb742..0c7321c35ad4 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -705,14 +705,6 @@ static void virtnet_netpoll(struct net_device *dev) } #endif -static void virtnet_free(struct net_device *dev) -{ - struct virtnet_info *vi = netdev_priv(dev); - - free_percpu(vi->stats); - free_netdev(dev); -} - static int virtnet_open(struct net_device *dev) { struct virtnet_info *vi = netdev_priv(dev); @@ -959,7 +951,6 @@ static int virtnet_probe(struct virtio_device *vdev) /* Set up network device as normal. */ dev->netdev_ops = &virtnet_netdev; dev->features = NETIF_F_HIGHDMA; - dev->destructor = virtnet_free; SET_ETHTOOL_OPS(dev, &virtnet_ethtool_ops); SET_NETDEV_DEV(dev, &vdev->dev); @@ -1122,6 +1113,7 @@ static void __devexit virtnet_remove(struct virtio_device *vdev) while (vi->pages) __free_pages(get_a_page(vi, GFP_KERNEL), 0); + free_percpu(vi->stats); free_netdev(vi->dev); } |