From: Dexuan Cui <decui@xxxxxxxxxxxxx> Date: Fri, 9 Apr 2021 00:24:51 +0000 >> From: David Miller <davem@xxxxxxxxxxxxx> >> Sent: Thursday, April 8, 2021 4:46 PM >> ... >> > +struct gdma_msg_hdr { >> > + u32 hdr_type; >> > + u32 msg_type; >> > + u16 msg_version; >> > + u16 hwc_msg_id; >> > + u32 msg_size; >> > +} __packed; >> > + >> > +struct gdma_dev_id { >> > + union { >> > + struct { >> > + u16 type; >> > + u16 instance; >> > + }; >> > + >> > + u32 as_uint32; >> > + }; >> > +} __packed; >> >> Please don't use __packed unless absolutely necessary. It generates >> suboptimal code (byte at a time >> accesses etc.) and for many of these you don't even need it. > > In the driver code, all the structs/unions marked by __packed are used to > talk with the hardware, so I think __packed is necessary here? It actually isan't in many cases, check with and without the __packed directive and see if anything chasnges. > Do you think if it's better if we remove all the __packed, and add > static_assert(sizeof(struct XXX) == YYY) instead? e.g. > > @@ -105,7 +105,8 @@ struct gdma_msg_hdr { > u16 msg_version; > u16 hwc_msg_id; > u32 msg_size; > -} __packed; > +}; > +static_assert(sizeof(struct gdma_msg_hdr) == 16); This won't make sure the structure member offsets are what you expect. I think you'll have to go through the structures one-by-one by hand to figure out which ones really require the __packed attribute and which do not. Thank you.