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 |
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 --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;
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(-)