Skip to contentSkip to conversation

struct nbd_reply not packed => trouble?

DISCUSSION Sebastian Pipping 3 participants 5 messages Jan 10, 2013 – Jan 15, 2013

lore
Share & tools
lore
#0 lore raw

Hello kernel hackers,

I noticed that in [linux]/include/uapi/linux/nbd.h the structure

   struct nbd_request {
           __be32 magic;
           __be32 type;    /* == READ || == WRITE */
           char handle[8];
           __be64 from;
           __be32 len;
   } __attribute__((packed));

is packed but its reply counter part

   struct nbd_reply {
           __be32 magic;
           __be32 error;    /* 0 = ok, else error */
	  char handle[8];  /* handle you got from request */

};

is not. Since Linux seems to read sizeof(nbd_reply) bytes from the network (see [1]), the number of bytes read varies with the number of bytes of the structure.

So my understanding is that if the size of struct nbd_reply varies from platform/compiler to another that means trouble. I wonder:

- Is there anything about struct nbd_reply that would keep its size equal everywhere or a reason why variance in size is no problem here?

- Any ideas for a platform where you would expect struct nbd_reply to be other than 4 + 4 + 8 = 16 bytes in size?

Best,

Sebastian

[1] http://lxr.linux.no/#linux+v3.7.1/drivers/block/nbd.c#L336

#1 lore raw
Quoted 13 lines

Hello kernel hackers,

I noticed that in [linux]/include/uapi/linux/nbd.h the structure

   struct nbd_request {
           __be32 magic;
           __be32 type;    /* == READ || == WRITE */
           char handle[8];
           __be64 from;
           __be32 len;
   } __attribute__((packed));
Quoted 1 line

is packed

Given a target where ABI requires types to be aligned on their size (1 => 1, 2 => 2, 4 => 4, 8 => 8, etc.)

4 + 4 + 8 + 8 + 4 = 28 bytes

To satisfy __be64 alignement (the strictest), it must be aligned on a 8 bytes boundary, but 28 is not multiple of 8. 32 is. Padding is required.

[The padding is required so that in a array of struct nbd_request[],
all members of all structures are aligned to their requirement alignement]

Quoted 8 lines

but its reply counter part

   struct nbd_reply {
           __be32 magic;
           __be32 error;    /* 0 = ok, else error */
	  char handle[8];  /* handle you got from request */
   };

4 + 4 + 8 = 16 bytes.
To satisfy __be32 alignement (the strictest), it must be aligned on a 4 bytes boundary and 16 is a multiple of 4: no need for padding.

Quoted 3 lines

is not. Since Linux seems to read sizeof(nbd_reply) bytes from the network (see [1]), the number of bytes read varies with the number of bytes of the structure.

It won't.

Quoted 10 lines

So my understanding is that if the size of struct nbd_reply varies from platform/compiler to another that means trouble. I wonder:

- Is there anything about struct nbd_reply that would keep its size equal everywhere or a reason why variance in size is no problem here?

- Any ideas for a platform where you would expect struct nbd_reply to be other than 4 + 4 + 8 = 16 bytes in size?

Look for an ABI that require 'char' with either property:
- size > 1 byte
- alignment > 8 (16 bytes !)

Regards.

Signature · 2 lines
Yann Droneaud
OPTEYA
#3 lore raw
In reply to Yann Droneaud

? 2013-1-11?0:42?"Yann Droneaud" <[email protected]> ???

Quoted 54 lines
Quoted 13 lines

Hello kernel hackers,

I noticed that in [linux]/include/uapi/linux/nbd.h the structure

  struct nbd_request {
          __be32 magic;
          __be32 type;    /* == READ || == WRITE */
          char handle[8];
          __be64 from;
          __be32 len;
  } __attribute__((packed));
Quoted 1 line

is packed

Given a target where ABI requires types to be aligned on their size (1 => 1, 2 => 2, 4 => 4, 8 => 8, etc.)

4 + 4 + 8 + 8 + 4 = 28 bytes

To satisfy __be64 alignement (the strictest), it must be aligned on a 8 bytes boundary, but 28 is not multiple of 8. 32 is. Padding is required.

[The padding is required so that in a array of struct nbd_request[], all members of all structures are aligned to their requirement alignement]

Quoted 7 lines

but its reply counter part

  struct nbd_reply {
          __be32 magic;
          __be32 error;    /* 0 = ok, else error */
     char handle[8];  /* handle you got from request */
  };

4 + 4 + 8 = 16 bytes.
To satisfy __be32 alignement (the strictest), it must be aligned on a 4 bytes boundary and 16 is a multiple of 4: no need for padding.

Quoted 3 lines

is not. Since Linux seems to read sizeof(nbd_reply) bytes from the network (see [1]), the number of bytes read varies with the number of bytes of the structure.

It won't.

Quoted 7 lines

So my understanding is that if the size of struct nbd_reply varies from platform/compiler to another that means trouble. I wonder:

- Is there anything about struct nbd_reply that would keep its size equal everywhere or a reason why variance in size is no problem here?

Quoted 8 lines
Quoted 2 lines

- Any ideas for a platform where you would expect struct nbd_reply to be other than 4 + 4 + 8 = 16 bytes in size?

Look for an ABI that require 'char' with either property:
- size > 1 byte
- alignment > 8 (16 bytes !)

Do you mean this structure size will vary on different platform? If yes, why Linux does not packed here? Thanks

Quoted 12 lines

Regards.

Signature · 9 lines
Yann Droneaud
OPTEYA



_______________________________________________
Kernelnewbies mailing list
Kernelnewbies at kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
#4 lore raw

Hi,

Le mardi 15 janvier 2013 ? 07:59 +0800, ??? a ?crit :

Quoted 6 lines

? 2013-1-11?0:42?"Yann Droneaud" <[email protected]> ???

Quoted 3 lines
Quoted 2 lines

- Any ideas for a platform where you would expect struct nbd_reply to be other than 4 + 4 + 8 = 16 bytes in size?

Quoted 8 lines
Quoted 5 lines

Look for an ABI that require 'char' with either property:
- size > 1 byte
- alignment > 8 (16 bytes !)

Do you mean this structure size will vary on different platform? If yes, why Linux does not packed here? Thanks

There's probably no such architecture for a general purpose processor with the ABI properties I've mentionned. eg. (sizeof(char) > 1 || alignof(char) > 8).

And if one day Linux is going to be ported on such target, the packing of the nbd_reply struct will be the smallest problem to fix.

Regards

Signature · 2 lines
Yann Droneaud
OPTEYA