From: Patrick McHardy <kaber@trash.net>
To: netdev@vger.kernel.org
Cc: Patrick McHardy <kaber@trash.net>
Subject: [RFC VLAN 04/10]: Move vlan_group allocation to seperate function
Date: Tue, 5 Jun 2007 16:36:57 +0200 (MEST) [thread overview]
Message-ID: <20070605143655.23717.2119.sendpatchset@localhost.localdomain> (raw)
In-Reply-To: <20070605143650.23717.91261.sendpatchset@localhost.localdomain>
[VLAN]: Move vlan_group allocation to seperate function
Move group allocation to a seperate function to clean up the code a bit
and allocate groups before registering the device. Device registration
is globally visible and causes netlink events, so we shouldn't fail
afterwards.
Signed-off-by: Patrick McHardy <kaber@trash.net>
---
commit 77fa17d4f74fcc3a330b95023fc335713eba995a
tree d1fdc97531109725b31bf1feb27440a5af370d4a
parent ffed416aac143a9431c7d9d6b3214288809eb89a
author Patrick McHardy <kaber@trash.net> Tue, 05 Jun 2007 16:33:44 +0200
committer Patrick McHardy <kaber@trash.net> Tue, 05 Jun 2007 16:33:44 +0200
net/8021q/vlan.c | 78 ++++++++++++++++++++++++++++--------------------------
1 files changed, 41 insertions(+), 37 deletions(-)
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index 7da8210..f193d78 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -197,6 +197,34 @@ static void vlan_group_free(struct vlan_group *grp)
kfree(grp);
}
+static struct vlan_group *vlan_group_alloc(int ifindex)
+{
+ struct vlan_group *grp;
+ unsigned int size;
+ unsigned int i;
+
+ grp = kzalloc(sizeof(struct vlan_group), GFP_KERNEL);
+ if (!grp)
+ return NULL;
+
+ size = sizeof(struct net_device *) * VLAN_GROUP_ARRAY_PART_LEN;
+
+ for (i = 0; i < VLAN_GROUP_ARRAY_SPLIT_PARTS; i++) {
+ grp->vlan_devices_arrays[i] = kzalloc(size, GFP_KERNEL);
+ if (!grp->vlan_devices_arrays[i])
+ goto err;
+ }
+
+ grp->real_dev_ifindex = ifindex;
+ hlist_add_head_rcu(&grp->hlist,
+ &vlan_group_hash[vlan_grp_hashfn(ifindex)]);
+ return grp;
+
+err:
+ vlan_group_free(grp);
+ return NULL;
+}
+
static void vlan_rcu_free(struct rcu_head *rcu)
{
vlan_group_free(container_of(rcu, struct vlan_group, rcu));
@@ -394,10 +422,9 @@ static void vlan_transfer_operstate(const struct net_device *dev, struct net_dev
static struct net_device *register_vlan_device(struct net_device *real_dev,
unsigned short VLAN_ID)
{
- struct vlan_group *grp;
+ struct vlan_group *grp, *ngrp = NULL;
struct net_device *new_dev;
char name[IFNAMSIZ];
- int i;
#ifdef VLAN_DEBUG
printk(VLAN_DBG "%s: if_name -:%s:- vid: %i\n",
@@ -491,9 +518,15 @@ static struct net_device *register_vlan_device(struct net_device *real_dev,
printk(VLAN_DBG "About to go find the group for idx: %i\n",
real_dev->ifindex);
#endif
+ grp = __vlan_find_group(real_dev->ifindex);
+ if (!grp) {
+ ngrp = grp = vlan_group_alloc(real_dev->ifindex);
+ if (!grp)
+ goto out_free_newdev;
+ }
if (register_netdevice(new_dev))
- goto out_free_newdev;
+ goto out_free_group;
vlan_transfer_operstate(real_dev, new_dev);
linkwatch_fire_event(new_dev); /* _MUST_ call rfc2863_policy() */
@@ -501,34 +534,8 @@ static struct net_device *register_vlan_device(struct net_device *real_dev,
/* So, got the sucker initialized, now lets place
* it into our local structure.
*/
- grp = __vlan_find_group(real_dev->ifindex);
-
- /* Note, we are running under the RTNL semaphore
- * so it cannot "appear" on us.
- */
- if (!grp) { /* need to add a new group */
- grp = kzalloc(sizeof(struct vlan_group), GFP_KERNEL);
- if (!grp)
- goto out_free_unregister;
-
- for (i=0; i < VLAN_GROUP_ARRAY_SPLIT_PARTS; i++) {
- grp->vlan_devices_arrays[i] = kzalloc(
- sizeof(struct net_device *)*VLAN_GROUP_ARRAY_PART_LEN,
- GFP_KERNEL);
-
- if (!grp->vlan_devices_arrays[i])
- goto out_free_arrays;
- }
-
- /* printk(KERN_ALERT "VLAN REGISTER: Allocated new group.\n"); */
- grp->real_dev_ifindex = real_dev->ifindex;
-
- hlist_add_head_rcu(&grp->hlist,
- &vlan_group_hash[vlan_grp_hashfn(real_dev->ifindex)]);
-
- if (real_dev->features & NETIF_F_HW_VLAN_RX)
- real_dev->vlan_rx_register(real_dev, grp);
- }
+ if (ngrp && real_dev->features & NETIF_F_HW_VLAN_RX)
+ real_dev->vlan_rx_register(real_dev, ngrp);
vlan_group_set_device(grp, VLAN_ID, new_dev);
@@ -546,12 +553,9 @@ static struct net_device *register_vlan_device(struct net_device *real_dev,
#endif
return new_dev;
-out_free_arrays:
- vlan_group_free(grp);
-
-out_free_unregister:
- unregister_netdev(new_dev);
- goto out_ret_null;
+out_free_group:
+ if (ngrp)
+ vlan_group_free(ngrp);
out_free_newdev:
free_netdev(new_dev);
next prev parent reply other threads:[~2007-06-05 14:36 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-05 14:36 [RFC VLAN 00/10]: VLAN netlink support try 2 Patrick McHardy
2007-06-05 14:36 ` [RFC VLAN 01/10]: Fix off-by-ones in VLAN ID checks Patrick McHardy
2007-06-05 16:16 ` Ben Greear
2007-06-05 18:16 ` Patrick McHardy
2007-06-05 14:36 ` [RFC VLAN 02/10]: Convert name-based configuration functions to struct netdevice * Patrick McHardy
2007-06-05 14:36 ` [RFC VLAN 03/10]: Move some device intialization code to dev->init callback Patrick McHardy
2007-06-05 14:36 ` Patrick McHardy [this message]
2007-06-05 14:36 ` [RFC VLAN 05/10]: Split up device checks Patrick McHardy
2007-06-05 14:36 ` [RFC VLAN 06/10]: Move device registation to seperate function Patrick McHardy
2007-06-05 14:37 ` [RFC VLAN 07/10]: Return proper error codes in register_vlan_device Patrick McHardy
2007-06-05 14:37 ` [RFC VLAN 08/10]: Use 32 bit value for skb->priority mapping Patrick McHardy
2007-06-05 14:37 ` [RFC VLAN 09/10]: Keep track of number of QoS mappings Patrick McHardy
2007-06-05 14:37 ` [RFC VLAN 10/10]: Use rtnl_link API Patrick McHardy
2007-06-05 21:31 ` Ben Greear
2007-06-05 21:58 ` Patrick McHardy
2007-06-05 22:03 ` Ben Greear
2007-06-05 16:25 ` [RFC VLAN 00/10]: VLAN netlink support try 2 Ben Greear
2007-06-05 18:28 ` Patrick McHardy
2007-06-05 20:08 ` Ben Greear
2007-06-05 21:12 ` Patrick McHardy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070605143655.23717.2119.sendpatchset@localhost.localdomain \
--to=kaber@trash.net \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).