[PATCH] siox: use kzalloc_flex

Rosen Penev posted 1 patch 1 week ago
drivers/siox/siox-core.c | 5 +++--
drivers/siox/siox.h      | 3 ++-
2 files changed, 5 insertions(+), 3 deletions(-)
[PATCH] siox: use kzalloc_flex
Posted by Rosen Penev 1 week ago
Use the proper function to allocate a struct with a flexible array
member.

Add __counted_by for extra runtime analysis. Add counting variable
assignment as required by __counted_by.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
 drivers/siox/siox-core.c | 5 +++--
 drivers/siox/siox.h      | 3 ++-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/siox/siox-core.c b/drivers/siox/siox-core.c
index 3e8f3b6a4555..b87e2a12d640 100644
--- a/drivers/siox/siox-core.c
+++ b/drivers/siox/siox-core.c
@@ -689,10 +689,11 @@ struct siox_master *siox_master_alloc(struct device *dev,
 	if (!dev)
 		return NULL;
 
-	smaster = kzalloc(sizeof(*smaster) + size, GFP_KERNEL);
+	smaster = kzalloc_flex(*smaster, buf, size);
 	if (!smaster)
 		return NULL;
 
+	smaster->buf_len = size;
 	device_initialize(&smaster->dev);
 
 	smaster->busno = -1;
@@ -854,7 +855,7 @@ static struct siox_device *siox_device_add(struct siox_master *smaster,
 		}
 
 		smaster->buf_len = buf_len;
-		smaster->buf = buf;
+		memcpy(smaster->buf, buf, buf_len);
 	}
 
 	ret = device_register(&sdevice->dev);
diff --git a/drivers/siox/siox.h b/drivers/siox/siox.h
index 513f2c8312f7..e6809fcafa0f 100644
--- a/drivers/siox/siox.h
+++ b/drivers/siox/siox.h
@@ -27,11 +27,12 @@ struct siox_master {
 
 	size_t setbuf_len, getbuf_len;
 	size_t buf_len;
-	u8 *buf;
 	u8 status;
 
 	unsigned long last_poll;
 	struct task_struct *poll_thread;
+
+	u8 buf[] __counted_by(buf_len);
 };
 
 static inline void *siox_master_get_devdata(struct siox_master *smaster)
-- 
2.53.0
Re: [PATCH] siox: use kzalloc_flex
Posted by Marc Kleine-Budde 1 week ago
On 25.03.2026 21:47:25, Rosen Penev wrote:
> Use the proper function to allocate a struct with a flexible array
> member.
>
> Add __counted_by for extra runtime analysis. Add counting variable
> assignment as required by __counted_by.
>
> Signed-off-by: Rosen Penev <rosenp@gmail.com>

NACK - What's you motivation to do this?

> ---
>  drivers/siox/siox-core.c | 5 +++--
>  drivers/siox/siox.h      | 3 ++-
>  2 files changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/siox/siox-core.c b/drivers/siox/siox-core.c
> index 3e8f3b6a4555..b87e2a12d640 100644
> --- a/drivers/siox/siox-core.c
> +++ b/drivers/siox/siox-core.c
> @@ -689,10 +689,11 @@ struct siox_master *siox_master_alloc(struct device *dev,
>  	if (!dev)
>  		return NULL;
>
> -	smaster = kzalloc(sizeof(*smaster) + size, GFP_KERNEL);
> +	smaster = kzalloc_flex(*smaster, buf, size);
>  	if (!smaster)
>  		return NULL;
>
> +	smaster->buf_len = size;

The "size" extra space is not used for master->buf, but for
dev->driver_data. master->buf is allocated in siox_device_add().

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   |
Re: [PATCH] siox: use kzalloc_flex
Posted by Rosen Penev 1 week ago
On Thu, Mar 26, 2026 at 1:22 AM Marc Kleine-Budde <mkl@pengutronix.de> wrote:
>
> On 25.03.2026 21:47:25, Rosen Penev wrote:
> > Use the proper function to allocate a struct with a flexible array
> > member.
> >
> > Add __counted_by for extra runtime analysis. Add counting variable
> > assignment as required by __counted_by.
> >
> > Signed-off-by: Rosen Penev <rosenp@gmail.com>
>
> NACK - What's you motivation to do this?
>
> > ---
> >  drivers/siox/siox-core.c | 5 +++--
> >  drivers/siox/siox.h      | 3 ++-
> >  2 files changed, 5 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/siox/siox-core.c b/drivers/siox/siox-core.c
> > index 3e8f3b6a4555..b87e2a12d640 100644
> > --- a/drivers/siox/siox-core.c
> > +++ b/drivers/siox/siox-core.c
> > @@ -689,10 +689,11 @@ struct siox_master *siox_master_alloc(struct device *dev,
> >       if (!dev)
> >               return NULL;
> >
> > -     smaster = kzalloc(sizeof(*smaster) + size, GFP_KERNEL);
> > +     smaster = kzalloc_flex(*smaster, buf, size);
> >       if (!smaster)
> >               return NULL;
> >
> > +     smaster->buf_len = size;
>
> The "size" extra space is not used for master->buf, but for
> dev->driver_data. master->buf is allocated in siox_device_add().
I assume this means a new struct member should be added and
kzalloc_flex modified to work on that.
>
> 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   |
Re: [PATCH] siox: use kzalloc_flex
Posted by Marc Kleine-Budde 6 days, 13 hours ago
On 26.03.2026 12:17:34, Rosen Penev wrote:
> > NACK - What's you motivation to do this?

> > The "size" extra space is not used for master->buf, but for
> > dev->driver_data. master->buf is allocated in siox_device_add().

> I assume this means a new struct member should be added and
    ^^^^^^
> kzalloc_flex modified to work on that.

I suggest you look at the code, try to understand what it currently
does, then re-think what your proposed changed do, what problem your
changes fix.

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   |