On Tue, 30 Aug 2022, Greg Kroah-Hartman wrote: > On Tue, Aug 30, 2022 at 10:29:56AM +0300, Ilpo Järvinen wrote: > > The struct serial_rs485 has a .padding field to make uapi updates > > easier. It wastes space, however. Create struct kserial_rs485 which is > > a kerner counterpart w/o padding. > > "kernel"? > > And what is the size difference now? Roughly 16B of padding is eliminated. That saving is then multiplied by the times it appears in in-kernel structs (2x per uart_port, 1x per rs485 supporting driver). As said in my other reply, if you feel it's too little gained by eliminating the padding, I can drop this patch, just let me know. > > +/** > > + * struct kserial_rs485 - kernel-side struct for controlling RS485 settings. > > + * @flags: RS485 feature flags > > + * @delay_rts_before_send: Delay before send (milliseconds) > > + * @delay_rts_after_send: Delay after send (milliseconds) > > + * @addr_recv: Receive filter for RS485 addressing mode > > + * (used only when %SER_RS485_ADDR_RECV is set). > > + * @addr_dest: Destination address for RS485 addressing mode > > + * (used only when %SER_RS485_ADDR_DEST is set). > > + * > > + * Must match with struct serial_rs485 in include/uapi/linux/serial.h excluding > > + * the padding. > > Why must this match? Because serial_rs485_from_user() and serial_rs485_to_user() just copy things over from one struct type to another w/o considering the fields individually. If that's not acceptable, I could make it copy field by field but it didn't feel necessary to allow "real" fields to differ to achieve padding elimination... > And how is that going to be enforced? With static_assert()s in serial_core.c. I'll add a note about that into the comment. > > + */ > > +struct kserial_rs485 { > > + __u32 flags; > > + __u32 delay_rts_before_send; > > + __u32 delay_rts_after_send; > > + struct { > > + __u8 addr_recv; > > + __u8 addr_dest; > > + }; > > As this is an in-kernel structure, this should be "u32" and "u8" now. Right, I'll change those. -- i.