Commit 1f90c7f3 authored by Nikolay Aleksandrov's avatar Nikolay Aleksandrov Committed by David S. Miller

bridge: modify bridge and port to have often accessed fields in one cache line

Move around net_bridge so the vlan fields are in the beginning since
they're checked on every packet even if vlan filtering is disabled.
For the port move flags & vlan group to the beginning, so they're in the
same cache line with the port's state (both flags and state are checked
on each packet).
Signed-off-by: default avatarNikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 63dfef75
...@@ -212,12 +212,16 @@ struct net_bridge_mdb_htable ...@@ -212,12 +212,16 @@ struct net_bridge_mdb_htable
u32 ver; u32 ver;
}; };
struct net_bridge_port struct net_bridge_port {
{
struct net_bridge *br; struct net_bridge *br;
struct net_device *dev; struct net_device *dev;
struct list_head list; struct list_head list;
unsigned long flags;
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
struct net_bridge_vlan_group __rcu *vlgrp;
#endif
/* STP */ /* STP */
u8 priority; u8 priority;
u8 state; u8 state;
...@@ -238,8 +242,6 @@ struct net_bridge_port ...@@ -238,8 +242,6 @@ struct net_bridge_port
struct kobject kobj; struct kobject kobj;
struct rcu_head rcu; struct rcu_head rcu;
unsigned long flags;
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
struct bridge_mcast_own_query ip4_own_query; struct bridge_mcast_own_query ip4_own_query;
#if IS_ENABLED(CONFIG_IPV6) #if IS_ENABLED(CONFIG_IPV6)
...@@ -259,9 +261,6 @@ struct net_bridge_port ...@@ -259,9 +261,6 @@ struct net_bridge_port
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
struct netpoll *np; struct netpoll *np;
#endif #endif
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
struct net_bridge_vlan_group __rcu *vlgrp;
#endif
#ifdef CONFIG_NET_SWITCHDEV #ifdef CONFIG_NET_SWITCHDEV
int offload_fwd_mark; int offload_fwd_mark;
#endif #endif
...@@ -283,14 +282,21 @@ static inline struct net_bridge_port *br_port_get_rtnl(const struct net_device * ...@@ -283,14 +282,21 @@ static inline struct net_bridge_port *br_port_get_rtnl(const struct net_device *
rtnl_dereference(dev->rx_handler_data) : NULL; rtnl_dereference(dev->rx_handler_data) : NULL;
} }
struct net_bridge struct net_bridge {
{
spinlock_t lock; spinlock_t lock;
spinlock_t hash_lock;
struct list_head port_list; struct list_head port_list;
struct net_device *dev; struct net_device *dev;
struct pcpu_sw_netstats __percpu *stats; struct pcpu_sw_netstats __percpu *stats;
spinlock_t hash_lock; /* These fields are accessed on each packet */
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
u8 vlan_enabled;
u8 vlan_stats_enabled;
__be16 vlan_proto;
u16 default_pvid;
struct net_bridge_vlan_group __rcu *vlgrp;
#endif
struct hlist_head hash[BR_HASH_SIZE]; struct hlist_head hash[BR_HASH_SIZE];
#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER) #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
union { union {
...@@ -308,6 +314,9 @@ struct net_bridge ...@@ -308,6 +314,9 @@ struct net_bridge
bridge_id designated_root; bridge_id designated_root;
bridge_id bridge_id; bridge_id bridge_id;
u32 root_path_cost; u32 root_path_cost;
unsigned char topology_change;
unsigned char topology_change_detected;
u16 root_port;
unsigned long max_age; unsigned long max_age;
unsigned long hello_time; unsigned long hello_time;
unsigned long forward_delay; unsigned long forward_delay;
...@@ -319,7 +328,6 @@ struct net_bridge ...@@ -319,7 +328,6 @@ struct net_bridge
u8 group_addr[ETH_ALEN]; u8 group_addr[ETH_ALEN];
bool group_addr_set; bool group_addr_set;
u16 root_port;
enum { enum {
BR_NO_STP, /* no spanning tree */ BR_NO_STP, /* no spanning tree */
...@@ -327,9 +335,6 @@ struct net_bridge ...@@ -327,9 +335,6 @@ struct net_bridge
BR_USER_STP, /* new RSTP in userspace */ BR_USER_STP, /* new RSTP in userspace */
} stp_enabled; } stp_enabled;
unsigned char topology_change;
unsigned char topology_change_detected;
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
unsigned char multicast_router; unsigned char multicast_router;
...@@ -381,14 +386,6 @@ struct net_bridge ...@@ -381,14 +386,6 @@ struct net_bridge
#ifdef CONFIG_NET_SWITCHDEV #ifdef CONFIG_NET_SWITCHDEV
int offload_fwd_mark; int offload_fwd_mark;
#endif #endif
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
struct net_bridge_vlan_group __rcu *vlgrp;
u8 vlan_enabled;
u8 vlan_stats_enabled;
__be16 vlan_proto;
u16 default_pvid;
#endif
}; };
struct br_input_skb_cb { struct br_input_skb_cb {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment