• Vladimir Oltean's avatar
    net: dsa: move dsa_switch_tree :: ports and lags to first cache line · b035c88c
    Vladimir Oltean authored
    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: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b035c88c
dsa.h 37.6 KB