diff mbox series

block: reorder bio::__bi_remaining for better packing

Message ID dacdf91e8d1af60ce5675a87615bdf271e9a3e17.1571938064.git.dsterba@suse.com (mailing list archive)
State New, archived
Headers show
Series block: reorder bio::__bi_remaining for better packing | expand

Commit Message

David Sterba Oct. 24, 2019, 5:31 p.m. UTC
Simple reordering of __bi_remaining can reduce bio size by 8 bytes that
are now wasted on padding (measured on x86_64):

struct bio {
        struct bio *               bi_next;              /*     0     8 */
        struct gendisk *           bi_disk;              /*     8     8 */
        unsigned int               bi_opf;               /*    16     4 */
        short unsigned int         bi_flags;             /*    20     2 */
        short unsigned int         bi_ioprio;            /*    22     2 */
        short unsigned int         bi_write_hint;        /*    24     2 */
        blk_status_t               bi_status;            /*    26     1 */
        u8                         bi_partno;            /*    27     1 */

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

        struct bvec_iter   bi_iter;                      /*    32    24 */

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

        atomic_t                   __bi_remaining;       /*    56     4 */

        /* XXX 4 bytes hole, try to pack */
[...]
        /* size: 104, cachelines: 2, members: 19 */
        /* sum members: 96, holes: 2, sum holes: 8 */
        /* paddings: 1, sum paddings: 4 */
        /* last cacheline: 40 bytes */
};

Now becomes:

struct bio {
        struct bio *               bi_next;              /*     0     8 */
        struct gendisk *           bi_disk;              /*     8     8 */
        unsigned int               bi_opf;               /*    16     4 */
        short unsigned int         bi_flags;             /*    20     2 */
        short unsigned int         bi_ioprio;            /*    22     2 */
        short unsigned int         bi_write_hint;        /*    24     2 */
        blk_status_t               bi_status;            /*    26     1 */
        u8                         bi_partno;            /*    27     1 */
        atomic_t                   __bi_remaining;       /*    28     4 */
        struct bvec_iter   bi_iter;                      /*    32    24 */

        /* XXX last struct has 4 bytes of padding */
[...]
        /* size: 96, cachelines: 2, members: 19 */
        /* paddings: 1, sum paddings: 4 */
        /* last cacheline: 32 bytes */
};

Signed-off-by: David Sterba <dsterba@suse.com>
---
 include/linux/blk_types.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Jens Axboe Oct. 25, 2019, 8:13 p.m. UTC | #1
On 10/24/19 11:31 AM, David Sterba wrote:
> Simple reordering of __bi_remaining can reduce bio size by 8 bytes that
> are now wasted on padding (measured on x86_64):
> 
> struct bio {
>          struct bio *               bi_next;              /*     0     8 */
>          struct gendisk *           bi_disk;              /*     8     8 */
>          unsigned int               bi_opf;               /*    16     4 */
>          short unsigned int         bi_flags;             /*    20     2 */
>          short unsigned int         bi_ioprio;            /*    22     2 */
>          short unsigned int         bi_write_hint;        /*    24     2 */
>          blk_status_t               bi_status;            /*    26     1 */
>          u8                         bi_partno;            /*    27     1 */
> 
>          /* XXX 4 bytes hole, try to pack */
> 
>          struct bvec_iter   bi_iter;                      /*    32    24 */
> 
>          /* XXX last struct has 4 bytes of padding */
> 
>          atomic_t                   __bi_remaining;       /*    56     4 */
> 
>          /* XXX 4 bytes hole, try to pack */
> [...]
>          /* size: 104, cachelines: 2, members: 19 */
>          /* sum members: 96, holes: 2, sum holes: 8 */
>          /* paddings: 1, sum paddings: 4 */
>          /* last cacheline: 40 bytes */
> };
> 
> Now becomes:
> 
> struct bio {
>          struct bio *               bi_next;              /*     0     8 */
>          struct gendisk *           bi_disk;              /*     8     8 */
>          unsigned int               bi_opf;               /*    16     4 */
>          short unsigned int         bi_flags;             /*    20     2 */
>          short unsigned int         bi_ioprio;            /*    22     2 */
>          short unsigned int         bi_write_hint;        /*    24     2 */
>          blk_status_t               bi_status;            /*    26     1 */
>          u8                         bi_partno;            /*    27     1 */
>          atomic_t                   __bi_remaining;       /*    28     4 */
>          struct bvec_iter   bi_iter;                      /*    32    24 */
> 
>          /* XXX last struct has 4 bytes of padding */
> [...]
>          /* size: 96, cachelines: 2, members: 19 */
>          /* paddings: 1, sum paddings: 4 */
>          /* last cacheline: 32 bytes */
> };

This is great, obviously been too long since this kind of thing was
looked at by myself. Thanks, applied.
diff mbox series

Patch

diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index d688b96d1d63..1e7eeec16458 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -153,10 +153,10 @@  struct bio {
 	unsigned short		bi_write_hint;
 	blk_status_t		bi_status;
 	u8			bi_partno;
+	atomic_t		__bi_remaining;
 
 	struct bvec_iter	bi_iter;
 
-	atomic_t		__bi_remaining;
 	bio_end_io_t		*bi_end_io;
 
 	void			*bi_private;