Hi Vincent, On Wed, May 18, 2022 at 08:43:57PM +0900, Vincent Mailhol wrote: > clang emits a -Wunaligned-access warning on union > mcp251xfd_tx_ojb_load_buf. > > The reason is that field hw_tx_obj (not declared as packed) is being > packed right after a 16 bits field inside a packed struct: > > | union mcp251xfd_tx_obj_load_buf { > | struct __packed { > | struct mcp251xfd_buf_cmd cmd; > | /* ^ 16 bits fields */ > | struct mcp251xfd_hw_tx_obj_raw hw_tx_obj; > | /* ^ not declared as packed */ > | } nocrc; > | struct __packed { > | struct mcp251xfd_buf_cmd_crc cmd; > | struct mcp251xfd_hw_tx_obj_raw hw_tx_obj; > | __be16 crc; > | } crc; > | } ____cacheline_aligned; > > Starting from LLVM 14, having an unpacked struct nested in a packed > struct triggers a warning. c.f. [1]. > > This is a false positive because the field is always being accessed > with the relevant put_unaligned_*() function. Adding __packed to the > structure declaration silences the warning. > > [1] https://github.com/llvm/llvm-project/issues/55520 > > Signed-off-by: Vincent Mailhol <mailhol.vincent@xxxxxxxxxx> > --- > Actually, I do not have llvm 14 installed so I am not able to test > (this check was introduced in v14). But as explained in [1], adding > __packed should fix the warning. Thanks for the patch! This does resolve the warning (verified with LLVM 15). > Because this is a false positive, I did not add a Fixes tag, nor a > Reported-by: kernel test robot. I think that the Reported-by tag should always be included but I agree that a Fixes tag is not necessary for this warning, as we currently have it under W=1, so it should not be visible under normal circumstances. > --- > drivers/net/can/spi/mcp251xfd/mcp251xfd.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h > index 1d43bccc29bf..2b0309fedfac 100644 > --- a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h > +++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h > @@ -441,7 +441,7 @@ struct mcp251xfd_hw_tef_obj { > /* The tx_obj_raw version is used in spi async, i.e. without > * regmap. We have to take care of endianness ourselves. > */ > -struct mcp251xfd_hw_tx_obj_raw { > +struct __packed mcp251xfd_hw_tx_obj_raw { > __le32 id; > __le32 flags; > u8 data[sizeof_field(struct canfd_frame, data)]; > -- > 2.35.1 > > Cheers, Nathan