[PATCH] blk-mq: Reorder fields in 'struct blk_mq_tag_set'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Group some variables based on their sizes to reduce hole and avoid padding.
On x86_64, this shrinks the size of 'struct blk_mq_tag_set'
from 304 to 296 bytes.

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

Before:
======
struct blk_mq_tag_set {
	struct blk_mq_queue_map    map[3];               /*     0    48 */
	unsigned int               nr_maps;              /*    48     4 */

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

	const struct blk_mq_ops  * ops;                  /*    56     8 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	unsigned int               nr_hw_queues;         /*    64     4 */
	unsigned int               queue_depth;          /*    68     4 */
	unsigned int               reserved_tags;        /*    72     4 */
	unsigned int               cmd_size;             /*    76     4 */
	int                        numa_node;            /*    80     4 */
	unsigned int               timeout;              /*    84     4 */
	unsigned int               flags;                /*    88     4 */

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

	void *                     driver_data;          /*    96     8 */
	struct blk_mq_tags * *     tags;                 /*   104     8 */
	struct blk_mq_tags *       shared_tags;          /*   112     8 */
	struct mutex               tag_list_lock;        /*   120   160 */
	/* --- cacheline 4 boundary (256 bytes) was 24 bytes ago --- */
	struct list_head           tag_list;             /*   280    16 */
	struct srcu_struct *       srcu;                 /*   296     8 */

	/* size: 304, cachelines: 5, members: 16 */
	/* sum members: 296, holes: 2, sum holes: 8 */
	/* last cacheline: 48 bytes */
};

After:
=====
struct blk_mq_tag_set {
	const struct blk_mq_ops  * ops;                  /*     0     8 */
	struct blk_mq_queue_map    map[3];               /*     8    48 */
	unsigned int               nr_maps;              /*    56     4 */
	unsigned int               nr_hw_queues;         /*    60     4 */
	/* --- cacheline 1 boundary (64 bytes) --- */
	unsigned int               queue_depth;          /*    64     4 */
	unsigned int               reserved_tags;        /*    68     4 */
	unsigned int               cmd_size;             /*    72     4 */
	int                        numa_node;            /*    76     4 */
	unsigned int               timeout;              /*    80     4 */
	unsigned int               flags;                /*    84     4 */
	void *                     driver_data;          /*    88     8 */
	struct blk_mq_tags * *     tags;                 /*    96     8 */
	struct blk_mq_tags *       shared_tags;          /*   104     8 */
	struct mutex               tag_list_lock;        /*   112   160 */
	/* --- cacheline 4 boundary (256 bytes) was 16 bytes ago --- */
	struct list_head           tag_list;             /*   272    16 */
	struct srcu_struct *       srcu;                 /*   288     8 */

	/* size: 296, cachelines: 5, members: 16 */
	/* last cacheline: 40 bytes */
};
---
 include/linux/blk-mq.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index 779fba613bd0..dd5ce1137f04 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -473,6 +473,7 @@ enum hctx_type {
 
 /**
  * struct blk_mq_tag_set - tag set that can be shared between request queues
+ * @ops:	   Pointers to functions that implement block driver behavior.
  * @map:	   One or more ctx -> hctx mappings. One map exists for each
  *		   hardware queue type (enum hctx_type) that the driver wishes
  *		   to support. There are no restrictions on maps being of the
@@ -480,7 +481,6 @@ enum hctx_type {
  *		   types.
  * @nr_maps:	   Number of elements in the @map array. A number in the range
  *		   [1, HCTX_MAX_TYPES].
- * @ops:	   Pointers to functions that implement block driver behavior.
  * @nr_hw_queues:  Number of hardware queues supported by the block driver that
  *		   owns this data structure.
  * @queue_depth:   Number of tags per hardware queue, reserved tags included.
@@ -505,9 +505,9 @@ enum hctx_type {
  *		   (BLK_MQ_F_BLOCKING).
  */
 struct blk_mq_tag_set {
+	const struct blk_mq_ops	*ops;
 	struct blk_mq_queue_map	map[HCTX_MAX_TYPES];
 	unsigned int		nr_maps;
-	const struct blk_mq_ops	*ops;
 	unsigned int		nr_hw_queues;
 	unsigned int		queue_depth;
 	unsigned int		reserved_tags;
-- 
2.34.1




[Index of Archives]     [Kernel Development]     [Kernel Announce]     [Kernel Newbies]     [Linux Networking Development]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Device Mapper]

  Powered by Linux