linux-spi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] spi: Reorder fields in 'struct spi_transfer'
@ 2023-02-14 10:34 Christophe JAILLET
  2023-02-14 21:10 ` Mark Brown
  0 siblings, 1 reply; 2+ messages in thread
From: Christophe JAILLET @ 2023-02-14 10:34 UTC (permalink / raw)
  To: Mark Brown, Richard Cochran
  Cc: linux-kernel, kernel-janitors, Christophe JAILLET, linux-spi, netdev

Group some variables based on their sizes to reduce hole and avoid padding.
On x86_64, this shrinks the size from 144 to 128 bytes.

Turn 'timestamped' into a bitfield so that it can be easily merged with
some other bifields and move 'error'.

This should have no real impact on memory allocation because 'struct
spi_transfer' is mostly used on stack, but it can save a few cycles
when the structure is initialized or copied.

Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
---
Using pahole

Before:
======
struct spi_transfer {
	const void  *              tx_buf;               /*     0     8 */
	void *                     rx_buf;               /*     8     8 */
	unsigned int               len;                  /*    16     4 */

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

	dma_addr_t                 tx_dma;               /*    24     8 */
	dma_addr_t                 rx_dma;               /*    32     8 */
	struct sg_table            tx_sg;                /*    40    16 */
	struct sg_table            rx_sg;                /*    56    16 */
	/* --- cacheline 1 boundary (64 bytes) was 8 bytes ago --- */
	unsigned int               dummy_data:1;         /*    72: 0  4 */
	unsigned int               cs_off:1;             /*    72: 1  4 */
	unsigned int               cs_change:1;          /*    72: 2  4 */
	unsigned int               tx_nbits:3;           /*    72: 3  4 */
	unsigned int               rx_nbits:3;           /*    72: 6  4 */

	/* XXX 7 bits hole, try to pack */
	/* Bitfield combined with next fields */

	u8                         bits_per_word;        /*    74     1 */

	/* XXX 1 byte hole, try to pack */

	struct spi_delay           delay;                /*    76     4 */

	/* XXX last struct has 1 byte of padding */

	struct spi_delay           cs_change_delay;      /*    80     4 */

	/* XXX last struct has 1 byte of padding */

	struct spi_delay           word_delay;           /*    84     4 */

	/* XXX last struct has 1 byte of padding */

	u32                        speed_hz;             /*    88     4 */
	u32                        effective_speed_hz;   /*    92     4 */
	unsigned int               ptp_sts_word_pre;     /*    96     4 */
	unsigned int               ptp_sts_word_post;    /*   100     4 */
	struct ptp_system_timestamp * ptp_sts;           /*   104     8 */
	bool                       timestamped;          /*   112     1 */

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

	struct list_head           transfer_list;        /*   120    16 */
	/* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */
	u16                        error;                /*   136     2 */

	/* size: 144, cachelines: 3, members: 24 */
	/* sum members: 124, holes: 3, sum holes: 12 */
	/* sum bitfield members: 9 bits, bit holes: 1, sum bit holes: 7 bits */
	/* padding: 6 */
	/* paddings: 3, sum paddings: 3 */
	/* last cacheline: 16 bytes */
};


After:
=====
struct spi_transfer {
	const void  *              tx_buf;               /*     0     8 */
	void *                     rx_buf;               /*     8     8 */
	unsigned int               len;                  /*    16     4 */
	u16                        error;                /*    20     2 */

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

	dma_addr_t                 tx_dma;               /*    24     8 */
	dma_addr_t                 rx_dma;               /*    32     8 */
	struct sg_table            tx_sg;                /*    40    16 */
	struct sg_table            rx_sg;                /*    56    16 */
	/* --- cacheline 1 boundary (64 bytes) was 8 bytes ago --- */
	unsigned int               dummy_data:1;         /*    72: 0  4 */
	unsigned int               cs_off:1;             /*    72: 1  4 */
	unsigned int               cs_change:1;          /*    72: 2  4 */
	unsigned int               tx_nbits:3;           /*    72: 3  4 */
	unsigned int               rx_nbits:3;           /*    72: 6  4 */
	unsigned int               timestamped:1;        /*    72: 9  4 */

	/* XXX 6 bits hole, try to pack */
	/* Bitfield combined with next fields */

	u8                         bits_per_word;        /*    74     1 */

	/* XXX 1 byte hole, try to pack */

	struct spi_delay           delay;                /*    76     4 */

	/* XXX last struct has 1 byte of padding */

	struct spi_delay           cs_change_delay;      /*    80     4 */

	/* XXX last struct has 1 byte of padding */

	struct spi_delay           word_delay;           /*    84     4 */

	/* XXX last struct has 1 byte of padding */

	u32                        speed_hz;             /*    88     4 */
	u32                        effective_speed_hz;   /*    92     4 */
	unsigned int               ptp_sts_word_pre;     /*    96     4 */
	unsigned int               ptp_sts_word_post;    /*   100     4 */
	struct ptp_system_timestamp * ptp_sts;           /*   104     8 */
	struct list_head           transfer_list;        /*   112    16 */

	/* size: 128, cachelines: 2, members: 24 */
	/* sum members: 123, holes: 2, sum holes: 3 */
	/* sum bitfield members: 10 bits, bit holes: 1, sum bit holes: 6 bits */
	/* paddings: 3, sum paddings: 3 */
};
---
 drivers/spi/spi.c       | 2 +-
 include/linux/spi/spi.h | 9 ++++-----
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 9f5c6b9f5135..44b85a8d47f1 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -1927,7 +1927,7 @@ void spi_take_timestamp_post(struct spi_controller *ctlr,
 	/* Capture the resolution of the timestamp */
 	xfer->ptp_sts_word_post = progress;
 
-	xfer->timestamped = true;
+	xfer->timestamped = 1;
 }
 EXPORT_SYMBOL_GPL(spi_take_timestamp_post);
 
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index 988aabc31871..4fa26b9a3572 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -1022,6 +1022,9 @@ struct spi_transfer {
 	void		*rx_buf;
 	unsigned	len;
 
+#define SPI_TRANS_FAIL_NO_START	BIT(0)
+	u16		error;
+
 	dma_addr_t	tx_dma;
 	dma_addr_t	rx_dma;
 	struct sg_table tx_sg;
@@ -1032,6 +1035,7 @@ struct spi_transfer {
 	unsigned	cs_change:1;
 	unsigned	tx_nbits:3;
 	unsigned	rx_nbits:3;
+	unsigned	timestamped:1;
 #define	SPI_NBITS_SINGLE	0x01 /* 1bit transfer */
 #define	SPI_NBITS_DUAL		0x02 /* 2bits transfer */
 #define	SPI_NBITS_QUAD		0x04 /* 4bits transfer */
@@ -1048,12 +1052,7 @@ struct spi_transfer {
 
 	struct ptp_system_timestamp *ptp_sts;
 
-	bool		timestamped;
-
 	struct list_head transfer_list;
-
-#define SPI_TRANS_FAIL_NO_START	BIT(0)
-	u16		error;
 };
 
 /**
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] spi: Reorder fields in 'struct spi_transfer'
  2023-02-14 10:34 [PATCH] spi: Reorder fields in 'struct spi_transfer' Christophe JAILLET
@ 2023-02-14 21:10 ` Mark Brown
  0 siblings, 0 replies; 2+ messages in thread
From: Mark Brown @ 2023-02-14 21:10 UTC (permalink / raw)
  To: Richard Cochran, Christophe JAILLET
  Cc: linux-kernel, kernel-janitors, linux-spi, netdev

On Tue, 14 Feb 2023 11:34:50 +0100, Christophe JAILLET wrote:
> Group some variables based on their sizes to reduce hole and avoid padding.
> On x86_64, this shrinks the size from 144 to 128 bytes.
> 
> Turn 'timestamped' into a bitfield so that it can be easily merged with
> some other bifields and move 'error'.
> 
> This should have no real impact on memory allocation because 'struct
> spi_transfer' is mostly used on stack, but it can save a few cycles
> when the structure is initialized or copied.
> 
> [...]

Applied to

   broonie/spi.git for-next

Thanks!

[1/1] spi: Reorder fields in 'struct spi_transfer'
      commit: 9d77522b45246c3dc5950b9641aea49ce3c973d7

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-02-14 21:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-14 10:34 [PATCH] spi: Reorder fields in 'struct spi_transfer' Christophe JAILLET
2023-02-14 21:10 ` Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).