Re: [PATCH v4 4/4] spi: Use struct_size() helper

From: Marc Kleine-Budde
Date: Mon Oct 09 2023 - 05:39:32 EST


Hello,

this change (75e308ffc4f0 ("spi: Use struct_size() helper")) reached
mainline with v6.6-rc1 and causes the following warning in my mcp251xfd
CAN driver.

On 14.07.2023 12:17:48, Andy Shevchenko wrote:
> The Documentation/process/deprecated.rst suggests to use flexible array
> members to provide a way to declare having a dynamically sized set of
> trailing elements in a structure.This makes code robust agains bunch of
> the issues described in the documentation, main of which is about the
> correctness of the sizeof() calculation for this data structure.
>
> Due to above, prefer struct_size() over open-coded versions.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
> ---
> include/linux/spi/spi.h | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
> index 04daf61dfd3f..7f8b478fdeb3 100644
> --- a/include/linux/spi/spi.h
> +++ b/include/linux/spi/spi.h
> @@ -13,6 +13,7 @@
> #include <linux/gpio/consumer.h>
> #include <linux/kthread.h>
> #include <linux/mod_devicetable.h>
> +#include <linux/overflow.h>
> #include <linux/scatterlist.h>
> #include <linux/slab.h>
> #include <linux/u64_stats_sync.h>
> @@ -1085,6 +1086,8 @@ struct spi_transfer {
> * @state: for use by whichever driver currently owns the message
> * @resources: for resource management when the SPI message is processed
> * @prepared: spi_prepare_message was called for the this message
> + * @t: for use with spi_message_alloc() when message and transfers have
> + * been allocated together
> *
> * A @spi_message is used to execute an atomic sequence of data transfers,
> * each represented by a struct spi_transfer. The sequence is "atomic"
> @@ -1139,6 +1142,9 @@ struct spi_message {
>
> /* List of spi_res resources when the SPI message is processed */
> struct list_head resources;
> +
> + /* For embedding transfers into the memory of the message */
> + struct spi_transfer t[];

| CHECK drivers/net/can/spi/mcp251xfd/mcp251xfd-chip-fifo.c
| drivers/net/can/spi/mcp251xfd/mcp251xfd-chip-fifo.c: note: in included file:
| drivers/net/can/spi/mcp251xfd/mcp251xfd.h:632:38: warning: array of flexible structures
| drivers/net/can/spi/mcp251xfd/mcp251xfd.h:547:36: warning: array of flexible structures

Line 632 is an array of struct mcp251xfd_tef_ring in the struct mcp251xfd_priv:

| struct mcp251xfd_priv {
[...]
| struct mcp251xfd_tef_ring tef[MCP251XFD_FIFO_TEF_NUM];
[...]
| }

...and struct mcp251xfd_tef_ring contains a struct spi_transfer:

| struct mcp251xfd_tef_ring {
| unsigned int head;
| unsigned int tail;
|
| /* u8 obj_num equals tx_ring->obj_num */
| /* u8 obj_size equals sizeof(struct mcp251xfd_hw_tef_obj) */
|
| union mcp251xfd_write_reg_buf irq_enable_buf;
| struct spi_transfer irq_enable_xfer;
| struct spi_message irq_enable_msg;
|
| union mcp251xfd_write_reg_buf uinc_buf;
| union mcp251xfd_write_reg_buf uinc_irq_disable_buf;
| struct spi_transfer uinc_xfer[MCP251XFD_TX_OBJ_NUM_MAX];
| };

The warning in line 547 is similar, but for the TX ring.

regards,
Marc

--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung Nürnberg | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |

Attachment: signature.asc
Description: PGP signature