> -----Original Message-----
> From: Andrew Lunn <[email protected]>
> Sent: Friday, February 20, 2026 11:42 AM
> To: Shenwei Wang <[email protected]>
> Cc: Arnaud POULIQUEN <[email protected]>; Linus Walleij
> <[email protected]>; Bartosz Golaszewski <[email protected]>; Jonathan Corbet
> <[email protected]>; Rob Herring <[email protected]>; Krzysztof Kozlowski
> <[email protected]>; Conor Dooley <[email protected]>; Bjorn Andersson
> <[email protected]>; Mathieu Poirier <[email protected]>; Frank Li
> <[email protected]>; Sascha Hauer <[email protected]>; Shuah Khan
> <[email protected]>; [email protected]; linux-
> [email protected]; [email protected]; Pengutronix Kernel Team
> <[email protected]>; Fabio Estevam <[email protected]>; Peng Fan
> <[email protected]>; [email protected]; linux-
> [email protected]; [email protected]; linux-arm-
> [email protected]; dl-linux-imx <[email protected]>; Bartosz
> Golaszewski <[email protected]>
> Subject: [EXT] Re: [PATCH v8 3/4] gpio: rpmsg: add generic rpmsg GPIO driver
> > > > struct msg_hdr {
> > > > u8 id;
> > > > u32 size;
> > > > u8 flags;
> > > > };
> > >
> > > That is just a bad design. The point of not allowing __packed is
> > > that it forces you to design your structures correctly. Maybe AI has
> > > no idea of taste, but Maintainer do and would not allow a u32 to be
> > > unaligned
> like this.
> > >
> >
> > Let’s keep the discussion technical instead of taste. 😊
> >
> > My point with the earlier example was simply to illustrate how layout
> > differences can happen across architectures or compilers. I’m more
> > interested in understanding how you would prefer this specific
> > structure to be defined so that it avoids unaligned fields while still
> > maintaining a
> stable on‑wire format.
>
> struct msg_hdr {
> u32 size;
> u8 id;
> u8 flags;
> };
>
> The compiler will lay this out as you expect, it won't add any padding between
> the fields.
>
Yes, most compilers will lay this out without inserting padding between the
fields.
However, for a communication packet, we cannot freely reorder or tweak members
just to satisfy alignment rules—the field order itself becomes part of the
protocol definition.
Even within netdev, where you’re very familiar, the classic ethhdr still
carries the packed annotation
despite being naturally aligned:
struct ethhdr {
unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
unsigned char h_source[ETH_ALEN]; /* source ether addr */
__be16 h_proto; /* packet type ID field */
} __attribute__((packed));
Thanks,
Shenwei
> You need to be careful with sizeof(struct msg_hdr). On 8 and 16 bit machines,
> it is
> probably 6. On 32, or 64 bit machine it is probably 8.
>
> I would say having a 6 byte message is probably a bad design, and you should
> try
> to make the u32 a u16 if you can. Again, not using the __packed is making you
> think about the design, and probably makes the design better as a result.
>
> Andrew