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: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
63dfef75ed
commit
1f90c7f347
@ -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
|
|||||||
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
|
|||||||
#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 *
|
|||||||
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
|
|||||||
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
|
|||||||
|
|
||||||
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
|
|||||||
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
|
|||||||
#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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user