net: minor reshuffle of napi_struct
authorJakub Kicinski <kuba@kernel.org>
Fri, 31 Mar 2023 04:47:31 +0000 (21:47 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 2 Apr 2023 12:27:17 +0000 (13:27 +0100)
commitdd2d6604407da5b1b260faee409cd601fe914ce9
treecafd3865714fb74183552c137e4a19d0f5cfaa48
parentceb29474bbbc377e11be3a70589a0005305e4fc3
net: minor reshuffle of napi_struct

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: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h