summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandy Dunlap <randy.dunlap@verizon.net>2003-07-13 18:49:23 -0700
committerJeff Garzik <jgarzik@redhat.com>2003-07-13 18:49:23 -0700
commitb03ac92ee0e87d00af2f120c5d7515a323cf8a4a (patch)
treebcd257fac4074e6a0cb910a7f6495f341e16d5be
parent1158633b978a2914025e72ac9d701be0e89d20e0 (diff)
[PATCH] reduce stack usage in wanrouter
From Jorn Engel <joern@wohnheim.fh-wedel.de> and Randy Dunlap. It reduces stack usage in the WAN router by about 0x500 bytes (from 0x520 to 0x24 when I did it in April).
-rw-r--r--net/wanrouter/wanmain.c45
1 files changed, 28 insertions, 17 deletions
diff --git a/net/wanrouter/wanmain.c b/net/wanrouter/wanmain.c
index ba98f7f0f984..942f17b86ad1 100644
--- a/net/wanrouter/wanmain.c
+++ b/net/wanrouter/wanmain.c
@@ -668,7 +668,7 @@ static int wanrouter_device_stat(struct wan_device *wandev,
static int wanrouter_device_new_if(struct wan_device *wandev,
wanif_conf_t *u_conf)
{
- wanif_conf_t conf;
+ wanif_conf_t *cnf;
struct net_device *dev = NULL;
#ifdef CONFIG_WANPIPE_MULTPPP
struct ppp_device *pppdev=NULL;
@@ -678,38 +678,47 @@ static int wanrouter_device_new_if(struct wan_device *wandev,
if ((wandev->state == WAN_UNCONFIGURED) || (wandev->new_if == NULL))
return -ENODEV;
- if (copy_from_user(&conf, u_conf, sizeof(wanif_conf_t)))
- return -EFAULT;
+ cnf = kmalloc(sizeof(wanif_conf_t), GFP_KERNEL);
+ if (!cnf)
+ return -ENOBUFS;
- if (conf.magic != ROUTER_MAGIC)
- return -EINVAL;
+ err = -EFAULT;
+ if (copy_from_user(cnf, u_conf, sizeof(wanif_conf_t)))
+ goto out;
+
+ err = -EINVAL;
+ if (cnf->magic != ROUTER_MAGIC)
+ goto out;
- if (conf.config_id == WANCONFIG_MPPP) {
+ if (cnf->config_id == WANCONFIG_MPPP) {
#ifdef CONFIG_WANPIPE_MULTPPP
pppdev = kmalloc(sizeof(struct ppp_device), GFP_KERNEL);
+ err = -ENOBUFS;
if (pppdev == NULL)
- return -ENOBUFS;
+ goto out;
memset(pppdev, 0, sizeof(struct ppp_device));
pppdev->dev = kmalloc(sizeof(struct net_device), GFP_KERNEL);
if (pppdev->dev == NULL) {
kfree(pppdev);
- return -ENOBUFS;
+ err = -ENOBUFS;
+ goto out;
}
memset(pppdev->dev, 0, sizeof(struct net_device));
- err = wandev->new_if(wandev,
- (struct net_device *)pppdev, &conf);
+ err = wandev->new_if(wandev, (struct net_device *)pppdev, cnf);
dev = pppdev->dev;
#else
printk(KERN_INFO "%s: Wanpipe Mulit-Port PPP support has not been compiled in!\n",
wandev->name);
- return -EPROTONOSUPPORT;
+ err = -EPROTONOSUPPORT;
+ goto out;
#endif
} else {
dev = kmalloc(sizeof(struct net_device), GFP_KERNEL);
+ err = -ENOBUFS;
if (dev == NULL)
- return -ENOBUFS;
+ goto out;
memset(dev, 0, sizeof(struct net_device));
- err = wandev->new_if(wandev, dev, &conf);
+ err = wandev->new_if(wandev, dev, cnf);
}
if (!err) {
@@ -748,7 +757,8 @@ static int wanrouter_device_new_if(struct wan_device *wandev,
++wandev->ndev;
unlock_adapter_irq(&wandev->lock, &smp_flags);
- return 0; /* done !!! */
+ err = 0; /* done !!! */
+ goto out;
}
}
if (wandev->del_if)
@@ -761,18 +771,19 @@ static int wanrouter_device_new_if(struct wan_device *wandev,
dev->priv = NULL;
}
-
#ifdef CONFIG_WANPIPE_MULTPPP
- if (conf.config_id == WANCONFIG_MPPP)
+ if (cnf->config_id == WANCONFIG_MPPP)
kfree(pppdev);
else
kfree(dev);
#else
/* Sync PPP is disabled */
- if (conf.config_id != WANCONFIG_MPPP)
+ if (cnf->config_id != WANCONFIG_MPPP)
kfree(dev);
#endif
+out:
+ kfree(cnf);
return err;
}