can: dev: reorder struct can_priv members for better packing
authorVincent Mailhol <mailhol.vincent@wanadoo.fr>
Mon, 13 Dec 2021 16:02:25 +0000 (01:02 +0900)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 5 Jan 2022 11:09:06 +0000 (12:09 +0100)
commit5fe1be81efd28bf2afcac218f23118dca6b1b648
treee0e47de3945af339d356836237866fa8a7fd8fbe
parent7d4a101c0bd3c6e5c6e45c705a54f7bc8f6c128d
can: dev: reorder struct can_priv members for better packing

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

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 */
|  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 6 bytes hole, try to pack */
|
|  struct gpio_desc *         termination_gpio;     /*   184     8 */
|  /* --- cacheline 3 boundary (192 bytes) --- */
|  u16                        termination_gpio_ohms[2]; /*   192     4 */
|  enum can_state             state;                /*   196     4 */
|  u32                        ctrlmode;             /*   200     4 */
|  u32                        ctrlmode_supported;   /*   204     4 */
|  int                        restart_ms;           /*   208     4 */
|
|  /* XXX 4 bytes hole, try to pack */
|
|  struct delayed_work        restart_work;         /*   216    88 */
|
|  /* XXX last struct has 4 bytes of padding */
|
|  /* --- cacheline 4 boundary (256 bytes) was 48 bytes ago --- */
|  int                        (*do_set_bittiming)(struct net_device *); /*   304     8 */
|  int                        (*do_set_data_bittiming)(struct net_device *); /*   312     8 */
|  /* --- cacheline 5 boundary (320 bytes) --- */
|  int                        (*do_set_mode)(struct net_device *, enum can_mode); /*   320     8 */
|  int                        (*do_set_termination)(struct net_device *, u16); /*   328     8 */
|  int                        (*do_get_state)(const struct net_device  *, enum can_state *); /*   336     8 */
|  int                        (*do_get_berr_counter)(const struct net_device  *, struct can_berr_counter *); /*   344     8 */
|  unsigned int               echo_skb_max;         /*   352     4 */
|
|  /* XXX 4 bytes hole, try to pack */
|
|  struct sk_buff * *         echo_skb;             /*   360     8 */
|
|  /* size: 368, cachelines: 6, members: 32 */
|  /* sum members: 354, holes: 3, sum holes: 14 */
|  /* paddings: 1, sum paddings: 4 */
|  /* last cacheline: 48 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 6 bytes hole, try to pack */
|
|  struct gpio_desc *         termination_gpio;     /*   184     8 */
|  /* --- cacheline 3 boundary (192 bytes) --- */
|  u16                        termination_gpio_ohms[2]; /*   192     4 */
|  unsigned int               echo_skb_max;         /*   196     4 */
|  struct sk_buff * *         echo_skb;             /*   200     8 */
|  enum can_state             state;                /*   208     4 */
|  u32                        ctrlmode;             /*   212     4 */
|  u32                        ctrlmode_supported;   /*   216     4 */
|  int                        restart_ms;           /*   220     4 */
|  struct delayed_work        restart_work;         /*   224    88 */
|
|  /* XXX last struct has 4 bytes of padding */
|
|  /* --- cacheline 4 boundary (256 bytes) was 56 bytes ago --- */
|  int                        (*do_set_bittiming)(struct net_device *); /*   312     8 */
|  /* --- cacheline 5 boundary (320 bytes) --- */
|  int                        (*do_set_data_bittiming)(struct net_device *); /*   320     8 */
|  int                        (*do_set_mode)(struct net_device *, enum can_mode); /*   328     8 */
|  int                        (*do_set_termination)(struct net_device *, u16); /*   336     8 */
|  int                        (*do_get_state)(const struct net_device  *, enum can_state *); /*   344     8 */
|  int                        (*do_get_berr_counter)(const struct net_device  *, struct can_berr_counter *); /*   352     8 */
|
|  /* size: 360, cachelines: 6, members: 32 */
|  /* sum members: 354, holes: 1, sum holes: 6 */
|  /* paddings: 1, sum paddings: 4 */
|  /* last cacheline: 40 bytes */
| };

Link: https://lore.kernel.org/all/20211213160226.56219-4-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