can: dev: reorder struct can_priv members for better packing
authorVincent Mailhol <mailhol.vincent@wanadoo.fr>
Wed, 24 Feb 2021 00:20:05 +0000 (09:20 +0900)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 30 Mar 2021 09:14:44 +0000 (11:14 +0200)
commit4c9258dd26fdb3bacb35e767fa55c9a03a78a08e
tree49638e1c01c3d04ec6afcd5295002c03a7715730
parent289ea9e4ae595545e736a63ccaadba65f880e9a4
can: dev: reorder struct can_priv members for better packing

Save eight bytes of holes on x86-64 architectures by reordering struct
can_priv members.

Before:

$ pahole -C can_priv drivers/net/can/dev/dev.o
struct can_priv {
struct net_device *        dev;                  /*     0     8 */
struct can_device_stats    can_stats;            /*     8    24 */
struct can_bittiming       bittiming;            /*    32    32 */
/* --- cacheline 1 boundary (64 bytes) --- */
struct can_bittiming       data_bittiming;       /*    64    32 */
const struct can_bittiming_const  * bittiming_const; /*    96     8 */
const struct can_bittiming_const  * data_bittiming_const; /*   104     8 */
struct can_tdc             tdc;                  /*   112    12 */

/* XXX 4 bytes hole, try to pack */

/* --- cacheline 2 boundary (128 bytes) --- */
const struct can_tdc_const  * tdc_const;         /*   128     8 */
const u16  *               termination_const;    /*   136     8 */
unsigned int               termination_const_cnt; /*   144     4 */
u16                        termination;          /*   148     2 */

/* XXX 2 bytes hole, try to pack */

const u32  *               bitrate_const;        /*   152     8 */
unsigned int               bitrate_const_cnt;    /*   160     4 */

/* XXX 4 bytes hole, try to pack */

const u32  *               data_bitrate_const;   /*   168     8 */
unsigned int               data_bitrate_const_cnt; /*   176     4 */
u32                        bitrate_max;          /*   180     4 */
struct can_clock           clock;                /*   184     4 */
enum can_state             state;                /*   188     4 */
/* --- cacheline 3 boundary (192 bytes) --- */
u32                        ctrlmode;             /*   192     4 */
u32                        ctrlmode_supported;   /*   196     4 */
u32                        ctrlmode_static;      /*   200     4 */
int                        restart_ms;           /*   204     4 */
struct delayed_work        restart_work;         /*   208   168 */

/* XXX last struct has 4 bytes of padding */

/* --- cacheline 5 boundary (320 bytes) was 56 bytes ago --- */
int                        (*do_set_bittiming)(struct net_device *); /*   376     8 */
/* --- cacheline 6 boundary (384 bytes) --- */
int                        (*do_set_data_bittiming)(struct net_device *); /*   384     8 */
int                        (*do_set_mode)(struct net_device *, enum can_mode); /*   392     8 */
int                        (*do_set_termination)(struct net_device *, u16); /*   400     8 */
int                        (*do_get_state)(const struct net_device  *, enum can_state *); /*   408     8 */
int                        (*do_get_berr_counter)(const struct net_device  *, struct can_berr_counter *); /*   416     8 */
unsigned int               echo_skb_max;         /*   424     4 */

/* XXX 4 bytes hole, try to pack */

struct sk_buff * *         echo_skb;             /*   432     8 */

/* size: 440, cachelines: 7, members: 31 */
/* sum members: 426, holes: 4, sum holes: 14 */
/* paddings: 1, sum paddings: 4 */
/* last cacheline: 56 bytes */
};

After:

$ pahole -C can_priv drivers/net/can/dev/dev.o
struct can_priv {
struct net_device *        dev;                  /*     0     8 */
struct can_device_stats    can_stats;            /*     8    24 */
const struct can_bittiming_const  * bittiming_const; /*    32     8 */
const struct can_bittiming_const  * data_bittiming_const; /*    40     8 */
struct can_bittiming       bittiming;            /*    48    32 */
/* --- cacheline 1 boundary (64 bytes) was 16 bytes ago --- */
struct can_bittiming       data_bittiming;       /*    80    32 */
const struct can_tdc_const  * tdc_const;         /*   112     8 */
struct can_tdc             tdc;                  /*   120    12 */
/* --- cacheline 2 boundary (128 bytes) was 4 bytes ago --- */
unsigned int               bitrate_const_cnt;    /*   132     4 */
const u32  *               bitrate_const;        /*   136     8 */
const u32  *               data_bitrate_const;   /*   144     8 */
unsigned int               data_bitrate_const_cnt; /*   152     4 */
u32                        bitrate_max;          /*   156     4 */
struct can_clock           clock;                /*   160     4 */
unsigned int               termination_const_cnt; /*   164     4 */
const u16  *               termination_const;    /*   168     8 */
u16                        termination;          /*   176     2 */

/* XXX 2 bytes hole, try to pack */

enum can_state             state;                /*   180     4 */
u32                        ctrlmode;             /*   184     4 */
u32                        ctrlmode_supported;   /*   188     4 */
/* --- cacheline 3 boundary (192 bytes) --- */
u32                        ctrlmode_static;      /*   192     4 */
int                        restart_ms;           /*   196     4 */
struct delayed_work        restart_work;         /*   200   168 */

/* XXX last struct has 4 bytes of padding */

/* --- cacheline 5 boundary (320 bytes) was 48 bytes ago --- */
int                        (*do_set_bittiming)(struct net_device *); /*   368     8 */
int                        (*do_set_data_bittiming)(struct net_device *); /*   376     8 */
/* --- cacheline 6 boundary (384 bytes) --- */
int                        (*do_set_mode)(struct net_device *, enum can_mode); /*   384     8 */
int                        (*do_set_termination)(struct net_device *, u16); /*   392     8 */
int                        (*do_get_state)(const struct net_device  *, enum can_state *); /*   400     8 */
int                        (*do_get_berr_counter)(const struct net_device  *, struct can_berr_counter *); /*   408     8 */
unsigned int               echo_skb_max;         /*   416     4 */

/* XXX 4 bytes hole, try to pack */

struct sk_buff * *         echo_skb;             /*   424     8 */

/* size: 432, cachelines: 7, members: 31 */
/* sum members: 426, holes: 2, sum holes: 6 */
/* paddings: 1, sum paddings: 4 */
/* last cacheline: 48 bytes */
};

Link: https://lore.kernel.org/r/20210224002008.4158-3-mailhol.vincent@wanadoo.fr
Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
include/linux/can/dev.h