Message ID | 20220105132141.2648876-7-vladimir.oltean@nxp.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Cleanup to main DSA structures | expand |
On 1/5/22 5:21 AM, Vladimir Oltean wrote: > dst->ports is accessed most notably by dsa_master_find_slave(), which is > invoked in the RX path. > > dst->lags is accessed by dsa_lag_dev(), which is invoked in the RX path > of tag_dsa.c. > > dst->tag_ops, dst->default_proto and dst->pd don't need to be in the > first cache line, so they are moved out by this change. > > Before: > > pahole -C dsa_switch_tree net/dsa/slave.o > struct dsa_switch_tree { > struct list_head list; /* 0 16 */ > struct raw_notifier_head nh; /* 16 8 */ > unsigned int index; /* 24 4 */ > struct kref refcount; /* 28 4 */ > bool setup; /* 32 1 */ > > /* XXX 7 bytes hole, try to pack */ > > const struct dsa_device_ops * tag_ops; /* 40 8 */ > enum dsa_tag_protocol default_proto; /* 48 4 */ > > /* XXX 4 bytes hole, try to pack */ > > struct dsa_platform_data * pd; /* 56 8 */ > /* --- cacheline 1 boundary (64 bytes) --- */ > struct list_head ports; /* 64 16 */ > struct list_head rtable; /* 80 16 */ > struct net_device * * lags; /* 96 8 */ > unsigned int lags_len; /* 104 4 */ > unsigned int last_switch; /* 108 4 */ > > /* size: 112, cachelines: 2, members: 13 */ > /* sum members: 101, holes: 2, sum holes: 11 */ > /* last cacheline: 48 bytes */ > }; > > After: > > pahole -C dsa_switch_tree net/dsa/slave.o > struct dsa_switch_tree { > struct list_head list; /* 0 16 */ > struct list_head ports; /* 16 16 */ > struct raw_notifier_head nh; /* 32 8 */ > unsigned int index; /* 40 4 */ > struct kref refcount; /* 44 4 */ > struct net_device * * lags; /* 48 8 */ > bool setup; /* 56 1 */ > > /* XXX 7 bytes hole, try to pack */ > > /* --- cacheline 1 boundary (64 bytes) --- */ > const struct dsa_device_ops * tag_ops; /* 64 8 */ > enum dsa_tag_protocol default_proto; /* 72 4 */ > > /* XXX 4 bytes hole, try to pack */ > > struct dsa_platform_data * pd; /* 80 8 */ > struct list_head rtable; /* 88 16 */ > unsigned int lags_len; /* 104 4 */ > unsigned int last_switch; /* 108 4 */ > > /* size: 112, cachelines: 2, members: 13 */ > /* sum members: 101, holes: 2, sum holes: 11 */ > /* last cacheline: 48 bytes */ > }; > > Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
diff --git a/include/net/dsa.h b/include/net/dsa.h index fef9d8bb5190..cbbac75138d9 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -119,6 +119,9 @@ struct dsa_netdevice_ops { struct dsa_switch_tree { struct list_head list; + /* List of switch ports */ + struct list_head ports; + /* Notifier chain for switch-wide events */ struct raw_notifier_head nh; @@ -128,6 +131,11 @@ struct dsa_switch_tree { /* Number of switches attached to this tree */ struct kref refcount; + /* Maps offloaded LAG netdevs to a zero-based linear ID for + * drivers that need it. + */ + struct net_device **lags; + /* Has this tree been applied to the hardware? */ bool setup; @@ -145,16 +153,10 @@ struct dsa_switch_tree { */ struct dsa_platform_data *pd; - /* List of switch ports */ - struct list_head ports; - /* List of DSA links composing the routing table */ struct list_head rtable; - /* Maps offloaded LAG netdevs to a zero-based linear ID for - * drivers that need it. - */ - struct net_device **lags; + /* Length of "lags" array */ unsigned int lags_len; /* Track the largest switch index within a tree */
dst->ports is accessed most notably by dsa_master_find_slave(), which is invoked in the RX path. dst->lags is accessed by dsa_lag_dev(), which is invoked in the RX path of tag_dsa.c. dst->tag_ops, dst->default_proto and dst->pd don't need to be in the first cache line, so they are moved out by this change. Before: pahole -C dsa_switch_tree net/dsa/slave.o struct dsa_switch_tree { struct list_head list; /* 0 16 */ struct raw_notifier_head nh; /* 16 8 */ unsigned int index; /* 24 4 */ struct kref refcount; /* 28 4 */ bool setup; /* 32 1 */ /* XXX 7 bytes hole, try to pack */ const struct dsa_device_ops * tag_ops; /* 40 8 */ enum dsa_tag_protocol default_proto; /* 48 4 */ /* XXX 4 bytes hole, try to pack */ struct dsa_platform_data * pd; /* 56 8 */ /* --- cacheline 1 boundary (64 bytes) --- */ struct list_head ports; /* 64 16 */ struct list_head rtable; /* 80 16 */ struct net_device * * lags; /* 96 8 */ unsigned int lags_len; /* 104 4 */ unsigned int last_switch; /* 108 4 */ /* size: 112, cachelines: 2, members: 13 */ /* sum members: 101, holes: 2, sum holes: 11 */ /* last cacheline: 48 bytes */ }; After: pahole -C dsa_switch_tree net/dsa/slave.o struct dsa_switch_tree { struct list_head list; /* 0 16 */ struct list_head ports; /* 16 16 */ struct raw_notifier_head nh; /* 32 8 */ unsigned int index; /* 40 4 */ struct kref refcount; /* 44 4 */ struct net_device * * lags; /* 48 8 */ bool setup; /* 56 1 */ /* XXX 7 bytes hole, try to pack */ /* --- cacheline 1 boundary (64 bytes) --- */ const struct dsa_device_ops * tag_ops; /* 64 8 */ enum dsa_tag_protocol default_proto; /* 72 4 */ /* XXX 4 bytes hole, try to pack */ struct dsa_platform_data * pd; /* 80 8 */ struct list_head rtable; /* 88 16 */ unsigned int lags_len; /* 104 4 */ unsigned int last_switch; /* 108 4 */ /* size: 112, cachelines: 2, members: 13 */ /* sum members: 101, holes: 2, sum holes: 11 */ /* last cacheline: 48 bytes */ }; Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> --- include/net/dsa.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)