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. -- Jens Axboe