• Jakub Kicinski's avatar
    net: minor reshuffle of napi_struct · dd2d6604
    Jakub Kicinski authored
    napi_id is read by GRO and drivers to mark skbs, and it currently
    sits at the end of the structure, in a mostly unused cache line.
    Move it up into a hole, and separate the clearly control path
    fields from the important ones.
    
    Before:
    
    struct napi_struct {
    	struct list_head           poll_list;            /*     0    16 */
    	long unsigned int          state;                /*    16     8 */
    	int                        weight;               /*    24     4 */
    	int                        defer_hard_irqs_count; /*    28     4 */
    	long unsigned int          gro_bitmask;          /*    32     8 */
    	int                        (*poll)(struct napi_struct *, int); /*    40     8 */
    	int                        poll_owner;           /*    48     4 */
    
    	/* XXX 4 bytes hole, try to pack */
    
    	struct net_device *        dev;                  /*    56     8 */
    	/* --- cacheline 1 boundary (64 bytes) --- */
    	struct gro_list            gro_hash[8];          /*    64   192 */
    	/* --- cacheline 4 boundary (256 bytes) --- */
    	struct sk_buff *           skb;                  /*   256     8 */
    	struct list_head           rx_list;              /*   264    16 */
    	int                        rx_count;             /*   280     4 */
    
    	/* XXX 4 bytes hole, try to pack */
    
    	struct hrtimer             timer;                /*   288    64 */
    
    	/* XXX last struct has 4 bytes of padding */
    
    	/* --- cacheline 5 boundary (320 bytes) was 32 bytes ago --- */
    	struct list_head           dev_list;             /*   352    16 */
    	struct hlist_node          napi_hash_node;       /*   368    16 */
    	/* --- cacheline 6 boundary (384 bytes) --- */
    	unsigned int               napi_id;              /*   384     4 */
    
    	/* XXX 4 bytes hole, try to pack */
    
    	struct task_struct *       thread;               /*   392     8 */
    
    	/* size: 400, cachelines: 7, members: 17 */
    	/* sum members: 388, holes: 3, sum holes: 12 */
    	/* paddings: 1, sum paddings: 4 */
    	/* last cacheline: 16 bytes */
    };
    
    After:
    
    struct napi_struct {
    	struct list_head           poll_list;            /*     0    16 */
    	long unsigned int          state;                /*    16     8 */
    	int                        weight;               /*    24     4 */
    	int                        defer_hard_irqs_count; /*    28     4 */
    	long unsigned int          gro_bitmask;          /*    32     8 */
    	int                        (*poll)(struct napi_struct *, int); /*    40     8 */
    	int                        poll_owner;           /*    48     4 */
    
    	/* XXX 4 bytes hole, try to pack */
    
    	struct net_device *        dev;                  /*    56     8 */
    	/* --- cacheline 1 boundary (64 bytes) --- */
    	struct gro_list            gro_hash[8];          /*    64   192 */
    	/* --- cacheline 4 boundary (256 bytes) --- */
    	struct sk_buff *           skb;                  /*   256     8 */
    	struct list_head           rx_list;              /*   264    16 */
    	int                        rx_count;             /*   280     4 */
    	unsigned int               napi_id;              /*   284     4 */
    	struct hrtimer             timer;                /*   288    64 */
    
    	/* XXX last struct has 4 bytes of padding */
    
    	/* --- cacheline 5 boundary (320 bytes) was 32 bytes ago --- */
    	struct task_struct *       thread;               /*   352     8 */
    	struct list_head           dev_list;             /*   360    16 */
    	struct hlist_node          napi_hash_node;       /*   376    16 */
    
    	/* size: 392, cachelines: 7, members: 17 */
    	/* sum members: 388, holes: 1, sum holes: 4 */
    	/* paddings: 1, sum paddings: 4 */
    	/* forced alignments: 1 */
    	/* last cacheline: 8 bytes */
    } __attribute__((__aligned__(8)));
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    dd2d6604
netdevice.h 162 KB