[lvm-devel] data alignment of structures with 'status'

Alasdair G Kergon agk at redhat.com
Mon Nov 23 23:44:25 UTC 2009


On Mon, Nov 23, 2009 at 06:23:45PM -0500, Mike Snitzer wrote:
> /* Moving 'extents_copied' from after 'region_size' to after 'area_len' */
> struct lv_segment {
>         struct dm_list             list;                 /*     0    16 */
>         struct logical_volume *    lv;                   /*    16     8 */
>         const struct segment_type  * segtype;            /*    24     8 */
>         uint32_t                   le;                   /*    32     4 */
>         uint32_t                   len;                  /*    36     4 */
>         uint64_t                   status;               /*    40     8 */
>         uint32_t                   stripe_size;          /*    48     4 */
>         uint32_t                   area_count;           /*    52     4 */
>         uint32_t                   area_len;             /*    56     4 */

>         uint32_t                   extents_copied;       /*    60     4 */

But it doesn't logically fit there - it's a mirror field not an all-areas one
or a snapshot one.  I'm only arguing for packing things efficiently
if it can be done while keeping groups of related fields together (and
normally it can be).

How about moving chunk_size from the end of the group of snapshot fields
to the front instead?  I.e. rotating 3 uint32_t fields in what you've posted
here.

>         /* --- cacheline 1 boundary (64 bytes) --- */
>         struct logical_volume *    origin;               /*    64     8 */
>         struct logical_volume *    cow;                  /*    72     8 */
>         struct dm_list             origin_list;          /*    80    16 */
>         uint32_t                   chunk_size;           /*    96     4 */
>         uint32_t                   region_size;          /*   100     4 */
>         struct logical_volume *    log_lv;               /*   104     8 */
>         void *                     segtype_private;      /*   112     8 */
>         struct dm_list             tags;                 /*   120    16 */
>         /* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */
>         struct lv_segment_area *   areas;                /*   136     8 */
> 
>         /* size: 144, cachelines: 3, members: 19 */
>         /* last cacheline: 16 bytes */
> }

Alasdair




More information about the lvm-devel mailing list