aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2010-10-20 09:56:05 -0400
committerDavid S. Miller <davem@davemloft.net>2010-10-21 04:26:53 -0400
commit65ac6a5fa658b90f1be700c55e7cd72e4611015d (patch)
tree7330c3234101c6d4c952f4abec9c8064df0e685a /include
parent7b9c60903714bf0a19d746b228864bad3497284e (diff)
vlan: Avoid hash table lookup to find group.
A struct net_device always maps to zero or one vlan groups and we always know the device when we are looking up a group. We currently do a hash table lookup on the device to find the group but it is much simpler to just store a pointer. Signed-off-by: Jesse Gross <jesse@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r--include/linux/if_vlan.h19
-rw-r--r--include/linux/netdevice.h5
2 files changed, 23 insertions, 1 deletions
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
index 494cce866564..4047781da727 100644
--- a/include/linux/if_vlan.h
+++ b/include/linux/if_vlan.h
@@ -16,6 +16,7 @@
16#ifdef __KERNEL__ 16#ifdef __KERNEL__
17#include <linux/netdevice.h> 17#include <linux/netdevice.h>
18#include <linux/etherdevice.h> 18#include <linux/etherdevice.h>
19#include <linux/rtnetlink.h>
19 20
20#define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header) 21#define VLAN_HLEN 4 /* The additional bytes (on top of the Ethernet header)
21 * that VLAN requires. 22 * that VLAN requires.
@@ -114,6 +115,18 @@ static inline void vlan_group_set_device(struct vlan_group *vg,
114#define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT) 115#define vlan_tx_tag_get(__skb) ((__skb)->vlan_tci & ~VLAN_TAG_PRESENT)
115 116
116#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) 117#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
118/* Must be invoked with rcu_read_lock or with RTNL. */
119static inline struct net_device *vlan_find_dev(struct net_device *real_dev,
120 u16 vlan_id)
121{
122 struct vlan_group *grp = rcu_dereference_rtnl(real_dev->vlgrp);
123
124 if (grp)
125 return vlan_group_get_device(grp, vlan_id);
126
127 return NULL;
128}
129
117extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); 130extern struct net_device *vlan_dev_real_dev(const struct net_device *dev);
118extern u16 vlan_dev_vlan_id(const struct net_device *dev); 131extern u16 vlan_dev_vlan_id(const struct net_device *dev);
119 132
@@ -128,6 +141,12 @@ vlan_gro_frags(struct napi_struct *napi, struct vlan_group *grp,
128 unsigned int vlan_tci); 141 unsigned int vlan_tci);
129 142
130#else 143#else
144static inline struct net_device *vlan_find_dev(struct net_device *real_dev,
145 u16 vlan_id)
146{
147 return NULL;
148}
149
131static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) 150static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev)
132{ 151{
133 BUG(); 152 BUG();
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 2861565a27d9..9c78312ce142 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -942,7 +942,10 @@ struct net_device {
942 942
943 943
944 /* Protocol specific pointers */ 944 /* Protocol specific pointers */
945 945
946#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
947 struct vlan_group *vlgrp; /* VLAN group */
948#endif
946#ifdef CONFIG_NET_DSA 949#ifdef CONFIG_NET_DSA
947 void *dsa_ptr; /* dsa specific data */ 950 void *dsa_ptr; /* dsa specific data */
948#endif 951#endif