2013/1/16 Vlad Yasevich <vyasevic@xxxxxxxxxx>: [...] > --- /dev/null > +++ b/net/bridge/br_vlan.c [...] > +struct net_port_vlan *nbp_vlan_find(const struct net_port_vlans *v, u16 vid) > +{ > + struct net_port_vlan *pve; > + > + /* Must be done either in rcu critical section or with RTNL held */ > + WARN_ON_ONCE(!rcu_read_lock_held() && !rtnl_is_locked()); > + > + list_for_each_entry_rcu(pve, &v->vlan_list, list) { > + if (pve->vid == vid) > + return pve; > + } > + > + return NULL; > +} This looks expensive - it's O(n) with n = number of configured VLANs on a port. And this is called for every packet. The bridge already has a hash of VLAN structures found by br_vlan_find(). You could add a second bitmap there (eg. ingres_ports[]) and check port's bit instead of walking the list. You would use a bit more memory (64 bytes minus the removed list-head) per configured VLAN but save some cycles in hot path. Best Regards, Michał Mirosław