net: dsa: move dsa_switch_tree :: ports and lags to first cache line
authorVladimir Oltean <vladimir.oltean@nxp.com>
Wed, 5 Jan 2022 13:21:40 +0000 (15:21 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 5 Jan 2022 14:46:23 +0000 (14:46 +0000)
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dsa.h

index fef9d8b..cbbac75 100644 (file)
@@ -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 */