aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2016-12-11 14:00:06 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2016-12-11 14:00:06 +0100
commit124d864b20c0fc6434ee526841a7d527122a5f8a (patch)
treeb5a797b376fab9b02da06094c94df4c92d6331c8 /src
parentdevice: clean up xmit error path (diff)
downloadwireguard-monolithic-historical-124d864b20c0fc6434ee526841a7d527122a5f8a.tar.xz
wireguard-monolithic-historical-124d864b20c0fc6434ee526841a7d527122a5f8a.zip
device: allocate tstats in newlink
Every place else does this in ndo_init, but this seems completely redundant, so to simplify things, I'm moving it into newlink.
Diffstat (limited to 'src')
-rw-r--r--src/device.c47
1 files changed, 20 insertions, 27 deletions
diff --git a/src/device.c b/src/device.c
index bd58eb8..e48cb68 100644
--- a/src/device.c
+++ b/src/device.c
@@ -25,18 +25,6 @@
#include <net/netfilter/nf_nat_core.h>
#endif
-static int init(struct net_device *dev)
-{
- dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
- if (!dev->tstats)
- return -ENOMEM;
- return 0;
-}
-static void uninit(struct net_device *dev)
-{
- free_percpu(dev->tstats);
-}
-
static int open_peer(struct wireguard_peer *peer, void *data)
{
timers_init_peer(peer);
@@ -220,8 +208,6 @@ static int ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
}
static const struct net_device_ops netdev_ops = {
- .ndo_init = init,
- .ndo_uninit = uninit,
.ndo_open = open,
.ndo_stop = stop,
.ndo_start_xmit = xmit,
@@ -251,6 +237,7 @@ static void destruct(struct net_device *dev)
unregister_pm_notifier(&wg->clear_peers_on_suspend);
#endif
mutex_unlock(&wg->device_update_lock);
+ free_percpu(dev->tstats);
put_net(wg->creating_net);
@@ -304,61 +291,67 @@ static int newlink(struct net *src_net, struct net_device *dev, struct nlattr *t
routing_table_init(&wg->peer_routing_table);
INIT_LIST_HEAD(&wg->peer_list);
+ dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
+ if (!dev->tstats)
+ goto error_1;
+
wg->workqueue = alloc_workqueue(KBUILD_MODNAME "-%s", WQ_UNBOUND | WQ_FREEZABLE, 0, dev->name);
if (!wg->workqueue)
- goto error_1;
+ goto error_2;
#ifdef CONFIG_WIREGUARD_PARALLEL
wg->parallelqueue = alloc_workqueue(KBUILD_MODNAME "-crypt-%s", WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM, 1, dev->name);
if (!wg->parallelqueue)
- goto error_2;
+ goto error_3;
wg->parallel_send = padata_alloc_possible(wg->parallelqueue);
if (!wg->parallel_send)
- goto error_3;
+ goto error_4;
padata_start(wg->parallel_send);
wg->parallel_receive = padata_alloc_possible(wg->parallelqueue);
if (!wg->parallel_receive)
- goto error_4;
+ goto error_5;
padata_start(wg->parallel_receive);
#endif
err = cookie_checker_init(&wg->cookie_checker, wg);
if (err < 0)
- goto error_5;
+ goto error_6;
#ifdef CONFIG_PM_SLEEP
wg->clear_peers_on_suspend.notifier_call = suspending_clear_noise_peers;
err = register_pm_notifier(&wg->clear_peers_on_suspend);
if (err < 0)
- goto error_6;
+ goto error_7;
#endif
err = register_netdevice(dev);
if (err < 0)
- goto error_7;
+ goto error_8;
pr_debug("Device %s has been created\n", dev->name);
return 0;
-error_7:
+error_8:
#ifdef CONFIG_PM_SLEEP
unregister_pm_notifier(&wg->clear_peers_on_suspend);
-error_6:
+error_7:
#endif
cookie_checker_uninit(&wg->cookie_checker);
-error_5:
+error_6:
#ifdef CONFIG_WIREGUARD_PARALLEL
padata_free(wg->parallel_receive);
-error_4:
+error_5:
padata_free(wg->parallel_send);
-error_3:
+error_4:
destroy_workqueue(wg->parallelqueue);
-error_2:
+error_3:
#endif
destroy_workqueue(wg->workqueue);
+error_2:
+ free_percpu(dev->tstats);
error_1:
put_net(src_net);
return err;