public inbox for linux-gpio@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] gpio: ljca: reduce struct allocation
@ 2026-03-08  2:12 Rosen Penev
  2026-03-08 12:19 ` Sakari Ailus
  2026-03-09  9:22 ` Bartosz Golaszewski
  0 siblings, 2 replies; 8+ messages in thread
From: Rosen Penev @ 2026-03-08  2:12 UTC (permalink / raw)
  To: linux-gpio
  Cc: Lixu Zhang, linux-hardening, gustavoars, Sakari Ailus,
	Linus Walleij, Bartosz Golaszewski, open list

Convert connect_mode to a flexible array member to avoid calling
kcalloc and to combine the allocations.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
 drivers/gpio/gpio-ljca.c | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/drivers/gpio/gpio-ljca.c b/drivers/gpio/gpio-ljca.c
index f32d1d237795..a531aaa0425f 100644
--- a/drivers/gpio/gpio-ljca.c
+++ b/drivers/gpio/gpio-ljca.c
@@ -63,7 +63,6 @@ struct ljca_gpio_dev {
 	DECLARE_BITMAP(enabled_irqs, LJCA_MAX_GPIO_NUM);
 	DECLARE_BITMAP(reenable_irqs, LJCA_MAX_GPIO_NUM);
 	DECLARE_BITMAP(output_enabled, LJCA_MAX_GPIO_NUM);
-	u8 *connect_mode;
 	/* protect irq bus */
 	struct mutex irq_lock;
 	struct work_struct work;
@@ -72,6 +71,8 @@ struct ljca_gpio_dev {
 
 	u8 obuf[LJCA_GPIO_BUF_SIZE];
 	u8 ibuf[LJCA_GPIO_BUF_SIZE];
+
+	u8 connect_mode[];
 };
 
 static int ljca_gpio_config(struct ljca_gpio_dev *ljca_gpio, u8 gpio_id,
@@ -400,22 +401,19 @@ static int ljca_gpio_probe(struct auxiliary_device *auxdev,
 			   const struct auxiliary_device_id *aux_dev_id)
 {
 	struct ljca_client *ljca = auxiliary_dev_to_ljca_client(auxdev);
+	struct ljca_gpio_info *gpio_info;
 	struct ljca_gpio_dev *ljca_gpio;
 	struct gpio_irq_chip *girq;
 	int ret;
 
-	ljca_gpio = devm_kzalloc(&auxdev->dev, sizeof(*ljca_gpio), GFP_KERNEL);
+	gpio_info = dev_get_platdata(&auxdev->dev);
+	ljca_gpio = devm_kzalloc(&auxdev->dev, struct_size(ljca_gpio, connect_mode, gpio_info->num),
+				 GFP_KERNEL);
 	if (!ljca_gpio)
 		return -ENOMEM;
 
 	ljca_gpio->ljca = ljca;
-	ljca_gpio->gpio_info = dev_get_platdata(&auxdev->dev);
-	ljca_gpio->connect_mode = devm_kcalloc(&auxdev->dev,
-					       ljca_gpio->gpio_info->num,
-					       sizeof(*ljca_gpio->connect_mode),
-					       GFP_KERNEL);
-	if (!ljca_gpio->connect_mode)
-		return -ENOMEM;
+	ljca_gpio->gpio_info = gpio_info;
 
 	ret = devm_mutex_init(&auxdev->dev, &ljca_gpio->irq_lock);
 	if (ret)
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] gpio: ljca: reduce struct allocation
  2026-03-08  2:12 [PATCH] gpio: ljca: reduce struct allocation Rosen Penev
@ 2026-03-08 12:19 ` Sakari Ailus
  2026-03-08 18:54   ` Rosen Penev
  2026-03-09  9:22 ` Bartosz Golaszewski
  1 sibling, 1 reply; 8+ messages in thread
From: Sakari Ailus @ 2026-03-08 12:19 UTC (permalink / raw)
  To: Rosen Penev
  Cc: linux-gpio, Lixu Zhang, linux-hardening, gustavoars,
	Linus Walleij, Bartosz Golaszewski, open list

Hi Rosen,

Thanks or the patch.

On Sat, Mar 07, 2026 at 06:12:01PM -0800, Rosen Penev wrote:
> Convert connect_mode to a flexible array member to avoid calling
> kcalloc and to combine the allocations.
> 
> Signed-off-by: Rosen Penev <rosenp@gmail.com>
> ---
>  drivers/gpio/gpio-ljca.c | 16 +++++++---------
>  1 file changed, 7 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpio/gpio-ljca.c b/drivers/gpio/gpio-ljca.c
> index f32d1d237795..a531aaa0425f 100644
> --- a/drivers/gpio/gpio-ljca.c
> +++ b/drivers/gpio/gpio-ljca.c
> @@ -63,7 +63,6 @@ struct ljca_gpio_dev {
>  	DECLARE_BITMAP(enabled_irqs, LJCA_MAX_GPIO_NUM);
>  	DECLARE_BITMAP(reenable_irqs, LJCA_MAX_GPIO_NUM);
>  	DECLARE_BITMAP(output_enabled, LJCA_MAX_GPIO_NUM);
> -	u8 *connect_mode;
>  	/* protect irq bus */
>  	struct mutex irq_lock;
>  	struct work_struct work;
> @@ -72,6 +71,8 @@ struct ljca_gpio_dev {
>  
>  	u8 obuf[LJCA_GPIO_BUF_SIZE];
>  	u8 ibuf[LJCA_GPIO_BUF_SIZE];
> +
> +	u8 connect_mode[];
>  };
>  
>  static int ljca_gpio_config(struct ljca_gpio_dev *ljca_gpio, u8 gpio_id,
> @@ -400,22 +401,19 @@ static int ljca_gpio_probe(struct auxiliary_device *auxdev,
>  			   const struct auxiliary_device_id *aux_dev_id)
>  {
>  	struct ljca_client *ljca = auxiliary_dev_to_ljca_client(auxdev);
> +	struct ljca_gpio_info *gpio_info;
>  	struct ljca_gpio_dev *ljca_gpio;
>  	struct gpio_irq_chip *girq;
>  	int ret;
>  
> -	ljca_gpio = devm_kzalloc(&auxdev->dev, sizeof(*ljca_gpio), GFP_KERNEL);
> +	gpio_info = dev_get_platdata(&auxdev->dev);

You can do this assignment in variable declaration.

> +	ljca_gpio = devm_kzalloc(&auxdev->dev, struct_size(ljca_gpio, connect_mode, gpio_info->num),

This line is a bit long, I'd wrap it.

> +				 GFP_KERNEL);
>  	if (!ljca_gpio)
>  		return -ENOMEM;
>  
>  	ljca_gpio->ljca = ljca;
> -	ljca_gpio->gpio_info = dev_get_platdata(&auxdev->dev);
> -	ljca_gpio->connect_mode = devm_kcalloc(&auxdev->dev,
> -					       ljca_gpio->gpio_info->num,
> -					       sizeof(*ljca_gpio->connect_mode),
> -					       GFP_KERNEL);
> -	if (!ljca_gpio->connect_mode)
> -		return -ENOMEM;
> +	ljca_gpio->gpio_info = gpio_info;
>  
>  	ret = devm_mutex_init(&auxdev->dev, &ljca_gpio->irq_lock);
>  	if (ret)

-- 
Kind regards,

Sakari Ailus

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] gpio: ljca: reduce struct allocation
  2026-03-08 12:19 ` Sakari Ailus
@ 2026-03-08 18:54   ` Rosen Penev
  2026-03-09  7:19     ` Sakari Ailus
  0 siblings, 1 reply; 8+ messages in thread
From: Rosen Penev @ 2026-03-08 18:54 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: linux-gpio, Lixu Zhang, linux-hardening, gustavoars,
	Linus Walleij, Bartosz Golaszewski, open list

On Sun, Mar 8, 2026 at 5:19 AM Sakari Ailus
<sakari.ailus@linux.intel.com> wrote:
>
> Hi Rosen,
>
> Thanks or the patch.
>
> On Sat, Mar 07, 2026 at 06:12:01PM -0800, Rosen Penev wrote:
> > Convert connect_mode to a flexible array member to avoid calling
> > kcalloc and to combine the allocations.
> >
> > Signed-off-by: Rosen Penev <rosenp@gmail.com>
> > ---
> >  drivers/gpio/gpio-ljca.c | 16 +++++++---------
> >  1 file changed, 7 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/gpio/gpio-ljca.c b/drivers/gpio/gpio-ljca.c
> > index f32d1d237795..a531aaa0425f 100644
> > --- a/drivers/gpio/gpio-ljca.c
> > +++ b/drivers/gpio/gpio-ljca.c
> > @@ -63,7 +63,6 @@ struct ljca_gpio_dev {
> >       DECLARE_BITMAP(enabled_irqs, LJCA_MAX_GPIO_NUM);
> >       DECLARE_BITMAP(reenable_irqs, LJCA_MAX_GPIO_NUM);
> >       DECLARE_BITMAP(output_enabled, LJCA_MAX_GPIO_NUM);
> > -     u8 *connect_mode;
> >       /* protect irq bus */
> >       struct mutex irq_lock;
> >       struct work_struct work;
> > @@ -72,6 +71,8 @@ struct ljca_gpio_dev {
> >
> >       u8 obuf[LJCA_GPIO_BUF_SIZE];
> >       u8 ibuf[LJCA_GPIO_BUF_SIZE];
> > +
> > +     u8 connect_mode[];
> >  };
> >
> >  static int ljca_gpio_config(struct ljca_gpio_dev *ljca_gpio, u8 gpio_id,
> > @@ -400,22 +401,19 @@ static int ljca_gpio_probe(struct auxiliary_device *auxdev,
> >                          const struct auxiliary_device_id *aux_dev_id)
> >  {
> >       struct ljca_client *ljca = auxiliary_dev_to_ljca_client(auxdev);
> > +     struct ljca_gpio_info *gpio_info;
> >       struct ljca_gpio_dev *ljca_gpio;
> >       struct gpio_irq_chip *girq;
> >       int ret;
> >
> > -     ljca_gpio = devm_kzalloc(&auxdev->dev, sizeof(*ljca_gpio), GFP_KERNEL);
> > +     gpio_info = dev_get_platdata(&auxdev->dev);
>
> You can do this assignment in variable declaration.
I avoided doing so to keep reverse christmas tree order. I can still
do so if desired.
>
> > +     ljca_gpio = devm_kzalloc(&auxdev->dev, struct_size(ljca_gpio, connect_mode, gpio_info->num),
>
> This line is a bit long, I'd wrap it.
Will fix.
>
> > +                              GFP_KERNEL);
> >       if (!ljca_gpio)
> >               return -ENOMEM;
> >
> >       ljca_gpio->ljca = ljca;
> > -     ljca_gpio->gpio_info = dev_get_platdata(&auxdev->dev);
> > -     ljca_gpio->connect_mode = devm_kcalloc(&auxdev->dev,
> > -                                            ljca_gpio->gpio_info->num,
> > -                                            sizeof(*ljca_gpio->connect_mode),
> > -                                            GFP_KERNEL);
> > -     if (!ljca_gpio->connect_mode)
> > -             return -ENOMEM;
> > +     ljca_gpio->gpio_info = gpio_info;
> >
> >       ret = devm_mutex_init(&auxdev->dev, &ljca_gpio->irq_lock);
> >       if (ret)
>
> --
> Kind regards,
>
> Sakari Ailus

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] gpio: ljca: reduce struct allocation
  2026-03-08 18:54   ` Rosen Penev
@ 2026-03-09  7:19     ` Sakari Ailus
  2026-03-09  7:32       ` Rosen Penev
  0 siblings, 1 reply; 8+ messages in thread
From: Sakari Ailus @ 2026-03-09  7:19 UTC (permalink / raw)
  To: Rosen Penev
  Cc: linux-gpio, Lixu Zhang, linux-hardening, gustavoars,
	Linus Walleij, Bartosz Golaszewski, open list

Hi Rosen,

On Sun, Mar 08, 2026 at 11:54:07AM -0700, Rosen Penev wrote:
> On Sun, Mar 8, 2026 at 5:19 AM Sakari Ailus
> <sakari.ailus@linux.intel.com> wrote:
> >
> > Hi Rosen,
> >
> > Thanks or the patch.
> >
> > On Sat, Mar 07, 2026 at 06:12:01PM -0800, Rosen Penev wrote:
> > > Convert connect_mode to a flexible array member to avoid calling
> > > kcalloc and to combine the allocations.
> > >
> > > Signed-off-by: Rosen Penev <rosenp@gmail.com>
> > > ---
> > >  drivers/gpio/gpio-ljca.c | 16 +++++++---------
> > >  1 file changed, 7 insertions(+), 9 deletions(-)
> > >
> > > diff --git a/drivers/gpio/gpio-ljca.c b/drivers/gpio/gpio-ljca.c
> > > index f32d1d237795..a531aaa0425f 100644
> > > --- a/drivers/gpio/gpio-ljca.c
> > > +++ b/drivers/gpio/gpio-ljca.c
> > > @@ -63,7 +63,6 @@ struct ljca_gpio_dev {
> > >       DECLARE_BITMAP(enabled_irqs, LJCA_MAX_GPIO_NUM);
> > >       DECLARE_BITMAP(reenable_irqs, LJCA_MAX_GPIO_NUM);
> > >       DECLARE_BITMAP(output_enabled, LJCA_MAX_GPIO_NUM);
> > > -     u8 *connect_mode;
> > >       /* protect irq bus */
> > >       struct mutex irq_lock;
> > >       struct work_struct work;
> > > @@ -72,6 +71,8 @@ struct ljca_gpio_dev {
> > >
> > >       u8 obuf[LJCA_GPIO_BUF_SIZE];
> > >       u8 ibuf[LJCA_GPIO_BUF_SIZE];
> > > +
> > > +     u8 connect_mode[];
> > >  };
> > >
> > >  static int ljca_gpio_config(struct ljca_gpio_dev *ljca_gpio, u8 gpio_id,
> > > @@ -400,22 +401,19 @@ static int ljca_gpio_probe(struct auxiliary_device *auxdev,
> > >                          const struct auxiliary_device_id *aux_dev_id)
> > >  {
> > >       struct ljca_client *ljca = auxiliary_dev_to_ljca_client(auxdev);
> > > +     struct ljca_gpio_info *gpio_info;
> > >       struct ljca_gpio_dev *ljca_gpio;
> > >       struct gpio_irq_chip *girq;
> > >       int ret;
> > >
> > > -     ljca_gpio = devm_kzalloc(&auxdev->dev, sizeof(*ljca_gpio), GFP_KERNEL);
> > > +     gpio_info = dev_get_platdata(&auxdev->dev);
> >
> > You can do this assignment in variable declaration.
> I avoided doing so to keep reverse christmas tree order. I can still
> do so if desired.

How does that affect it? There doesn't seem to be a dependency here -- and
even if there was, the dependency obviously has priority.

> >
> > > +     ljca_gpio = devm_kzalloc(&auxdev->dev, struct_size(ljca_gpio, connect_mode, gpio_info->num),
> >
> > This line is a bit long, I'd wrap it.
> Will fix.
> >
> > > +                              GFP_KERNEL);
> > >       if (!ljca_gpio)
> > >               return -ENOMEM;
> > >
> > >       ljca_gpio->ljca = ljca;
> > > -     ljca_gpio->gpio_info = dev_get_platdata(&auxdev->dev);
> > > -     ljca_gpio->connect_mode = devm_kcalloc(&auxdev->dev,
> > > -                                            ljca_gpio->gpio_info->num,
> > > -                                            sizeof(*ljca_gpio->connect_mode),
> > > -                                            GFP_KERNEL);
> > > -     if (!ljca_gpio->connect_mode)
> > > -             return -ENOMEM;
> > > +     ljca_gpio->gpio_info = gpio_info;
> > >
> > >       ret = devm_mutex_init(&auxdev->dev, &ljca_gpio->irq_lock);
> > >       if (ret)
> >

-- 
Kind regards,

Sakari Ailus

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] gpio: ljca: reduce struct allocation
  2026-03-09  7:19     ` Sakari Ailus
@ 2026-03-09  7:32       ` Rosen Penev
  0 siblings, 0 replies; 8+ messages in thread
From: Rosen Penev @ 2026-03-09  7:32 UTC (permalink / raw)
  To: Sakari Ailus
  Cc: linux-gpio, Lixu Zhang, linux-hardening, gustavoars,
	Linus Walleij, Bartosz Golaszewski, open list

On Mon, Mar 9, 2026 at 12:20 AM Sakari Ailus
<sakari.ailus@linux.intel.com> wrote:
>
> Hi Rosen,
>
> On Sun, Mar 08, 2026 at 11:54:07AM -0700, Rosen Penev wrote:
> > On Sun, Mar 8, 2026 at 5:19 AM Sakari Ailus
> > <sakari.ailus@linux.intel.com> wrote:
> > >
> > > Hi Rosen,
> > >
> > > Thanks or the patch.
> > >
> > > On Sat, Mar 07, 2026 at 06:12:01PM -0800, Rosen Penev wrote:
> > > > Convert connect_mode to a flexible array member to avoid calling
> > > > kcalloc and to combine the allocations.
> > > >
> > > > Signed-off-by: Rosen Penev <rosenp@gmail.com>
> > > > ---
> > > >  drivers/gpio/gpio-ljca.c | 16 +++++++---------
> > > >  1 file changed, 7 insertions(+), 9 deletions(-)
> > > >
> > > > diff --git a/drivers/gpio/gpio-ljca.c b/drivers/gpio/gpio-ljca.c
> > > > index f32d1d237795..a531aaa0425f 100644
> > > > --- a/drivers/gpio/gpio-ljca.c
> > > > +++ b/drivers/gpio/gpio-ljca.c
> > > > @@ -63,7 +63,6 @@ struct ljca_gpio_dev {
> > > >       DECLARE_BITMAP(enabled_irqs, LJCA_MAX_GPIO_NUM);
> > > >       DECLARE_BITMAP(reenable_irqs, LJCA_MAX_GPIO_NUM);
> > > >       DECLARE_BITMAP(output_enabled, LJCA_MAX_GPIO_NUM);
> > > > -     u8 *connect_mode;
> > > >       /* protect irq bus */
> > > >       struct mutex irq_lock;
> > > >       struct work_struct work;
> > > > @@ -72,6 +71,8 @@ struct ljca_gpio_dev {
> > > >
> > > >       u8 obuf[LJCA_GPIO_BUF_SIZE];
> > > >       u8 ibuf[LJCA_GPIO_BUF_SIZE];
> > > > +
> > > > +     u8 connect_mode[];
> > > >  };
> > > >
> > > >  static int ljca_gpio_config(struct ljca_gpio_dev *ljca_gpio, u8 gpio_id,
> > > > @@ -400,22 +401,19 @@ static int ljca_gpio_probe(struct auxiliary_device *auxdev,
> > > >                          const struct auxiliary_device_id *aux_dev_id)
> > > >  {
> > > >       struct ljca_client *ljca = auxiliary_dev_to_ljca_client(auxdev);
> > > > +     struct ljca_gpio_info *gpio_info;
> > > >       struct ljca_gpio_dev *ljca_gpio;
> > > >       struct gpio_irq_chip *girq;
> > > >       int ret;
> > > >
> > > > -     ljca_gpio = devm_kzalloc(&auxdev->dev, sizeof(*ljca_gpio), GFP_KERNEL);
> > > > +     gpio_info = dev_get_platdata(&auxdev->dev);
> > >
> > > You can do this assignment in variable declaration.
> > I avoided doing so to keep reverse christmas tree order. I can still
> > do so if desired.
>
> How does that affect it? There doesn't seem to be a dependency here -- and
> even if there was, the dependency obviously has priority.
It's just cosmetic.
>
> > >
> > > > +     ljca_gpio = devm_kzalloc(&auxdev->dev, struct_size(ljca_gpio, connect_mode, gpio_info->num),
> > >
> > > This line is a bit long, I'd wrap it.
> > Will fix.
> > >
> > > > +                              GFP_KERNEL);
> > > >       if (!ljca_gpio)
> > > >               return -ENOMEM;
> > > >
> > > >       ljca_gpio->ljca = ljca;
> > > > -     ljca_gpio->gpio_info = dev_get_platdata(&auxdev->dev);
> > > > -     ljca_gpio->connect_mode = devm_kcalloc(&auxdev->dev,
> > > > -                                            ljca_gpio->gpio_info->num,
> > > > -                                            sizeof(*ljca_gpio->connect_mode),
> > > > -                                            GFP_KERNEL);
> > > > -     if (!ljca_gpio->connect_mode)
> > > > -             return -ENOMEM;
> > > > +     ljca_gpio->gpio_info = gpio_info;
> > > >
> > > >       ret = devm_mutex_init(&auxdev->dev, &ljca_gpio->irq_lock);
> > > >       if (ret)
> > >
>
> --
> Kind regards,
>
> Sakari Ailus

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] gpio: ljca: reduce struct allocation
  2026-03-08  2:12 [PATCH] gpio: ljca: reduce struct allocation Rosen Penev
  2026-03-08 12:19 ` Sakari Ailus
@ 2026-03-09  9:22 ` Bartosz Golaszewski
  2026-03-09 21:48   ` Rosen Penev
  1 sibling, 1 reply; 8+ messages in thread
From: Bartosz Golaszewski @ 2026-03-09  9:22 UTC (permalink / raw)
  To: Rosen Penev
  Cc: linux-gpio, Lixu Zhang, linux-hardening, gustavoars, Sakari Ailus,
	Linus Walleij, open list

On Sun, Mar 8, 2026 at 3:12 AM Rosen Penev <rosenp@gmail.com> wrote:
>
> Convert connect_mode to a flexible array member to avoid calling
> kcalloc and to combine the allocations.
>
> Signed-off-by: Rosen Penev <rosenp@gmail.com>
> ---
>  drivers/gpio/gpio-ljca.c | 16 +++++++---------
>  1 file changed, 7 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpio/gpio-ljca.c b/drivers/gpio/gpio-ljca.c
> index f32d1d237795..a531aaa0425f 100644
> --- a/drivers/gpio/gpio-ljca.c
> +++ b/drivers/gpio/gpio-ljca.c
> @@ -63,7 +63,6 @@ struct ljca_gpio_dev {
>         DECLARE_BITMAP(enabled_irqs, LJCA_MAX_GPIO_NUM);
>         DECLARE_BITMAP(reenable_irqs, LJCA_MAX_GPIO_NUM);
>         DECLARE_BITMAP(output_enabled, LJCA_MAX_GPIO_NUM);
> -       u8 *connect_mode;
>         /* protect irq bus */
>         struct mutex irq_lock;
>         struct work_struct work;
> @@ -72,6 +71,8 @@ struct ljca_gpio_dev {
>
>         u8 obuf[LJCA_GPIO_BUF_SIZE];
>         u8 ibuf[LJCA_GPIO_BUF_SIZE];
> +
> +       u8 connect_mode[];

Please use __counted_by().

>  };
>
>  static int ljca_gpio_config(struct ljca_gpio_dev *ljca_gpio, u8 gpio_id,
> @@ -400,22 +401,19 @@ static int ljca_gpio_probe(struct auxiliary_device *auxdev,
>                            const struct auxiliary_device_id *aux_dev_id)
>  {
>         struct ljca_client *ljca = auxiliary_dev_to_ljca_client(auxdev);
> +       struct ljca_gpio_info *gpio_info;
>         struct ljca_gpio_dev *ljca_gpio;
>         struct gpio_irq_chip *girq;
>         int ret;
>
> -       ljca_gpio = devm_kzalloc(&auxdev->dev, sizeof(*ljca_gpio), GFP_KERNEL);
> +       gpio_info = dev_get_platdata(&auxdev->dev);
> +       ljca_gpio = devm_kzalloc(&auxdev->dev, struct_size(ljca_gpio, connect_mode, gpio_info->num),

I'm surprised to learn that there's no devm_kzalloc_flex() yet. I
wanted to ask you to use it but it doesn't exist.

Bart

> +                                GFP_KERNEL);
>         if (!ljca_gpio)
>                 return -ENOMEM;
>
>         ljca_gpio->ljca = ljca;
> -       ljca_gpio->gpio_info = dev_get_platdata(&auxdev->dev);
> -       ljca_gpio->connect_mode = devm_kcalloc(&auxdev->dev,
> -                                              ljca_gpio->gpio_info->num,
> -                                              sizeof(*ljca_gpio->connect_mode),
> -                                              GFP_KERNEL);
> -       if (!ljca_gpio->connect_mode)
> -               return -ENOMEM;
> +       ljca_gpio->gpio_info = gpio_info;
>
>         ret = devm_mutex_init(&auxdev->dev, &ljca_gpio->irq_lock);
>         if (ret)
> --
> 2.53.0
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] gpio: ljca: reduce struct allocation
  2026-03-09  9:22 ` Bartosz Golaszewski
@ 2026-03-09 21:48   ` Rosen Penev
  2026-03-10 11:52     ` Linus Walleij
  0 siblings, 1 reply; 8+ messages in thread
From: Rosen Penev @ 2026-03-09 21:48 UTC (permalink / raw)
  To: Bartosz Golaszewski
  Cc: linux-gpio, Lixu Zhang, linux-hardening, gustavoars, Sakari Ailus,
	Linus Walleij, open list

On Mon, Mar 9, 2026 at 2:22 AM Bartosz Golaszewski <brgl@kernel.org> wrote:
>
> On Sun, Mar 8, 2026 at 3:12 AM Rosen Penev <rosenp@gmail.com> wrote:
> >
> > Convert connect_mode to a flexible array member to avoid calling
> > kcalloc and to combine the allocations.
> >
> > Signed-off-by: Rosen Penev <rosenp@gmail.com>
> > ---
> >  drivers/gpio/gpio-ljca.c | 16 +++++++---------
> >  1 file changed, 7 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/gpio/gpio-ljca.c b/drivers/gpio/gpio-ljca.c
> > index f32d1d237795..a531aaa0425f 100644
> > --- a/drivers/gpio/gpio-ljca.c
> > +++ b/drivers/gpio/gpio-ljca.c
> > @@ -63,7 +63,6 @@ struct ljca_gpio_dev {
> >         DECLARE_BITMAP(enabled_irqs, LJCA_MAX_GPIO_NUM);
> >         DECLARE_BITMAP(reenable_irqs, LJCA_MAX_GPIO_NUM);
> >         DECLARE_BITMAP(output_enabled, LJCA_MAX_GPIO_NUM);
> > -       u8 *connect_mode;
> >         /* protect irq bus */
> >         struct mutex irq_lock;
> >         struct work_struct work;
> > @@ -72,6 +71,8 @@ struct ljca_gpio_dev {
> >
> >         u8 obuf[LJCA_GPIO_BUF_SIZE];
> >         u8 ibuf[LJCA_GPIO_BUF_SIZE];
> > +
> > +       u8 connect_mode[];
>
> Please use __counted_by().
Counted by what?

__counted_by(gpio_info->num); does not work.
> >  };
> >
> >  static int ljca_gpio_config(struct ljca_gpio_dev *ljca_gpio, u8 gpio_id,
> > @@ -400,22 +401,19 @@ static int ljca_gpio_probe(struct auxiliary_device *auxdev,
> >                            const struct auxiliary_device_id *aux_dev_id)
> >  {
> >         struct ljca_client *ljca = auxiliary_dev_to_ljca_client(auxdev);
> > +       struct ljca_gpio_info *gpio_info;
> >         struct ljca_gpio_dev *ljca_gpio;
> >         struct gpio_irq_chip *girq;
> >         int ret;
> >
> > -       ljca_gpio = devm_kzalloc(&auxdev->dev, sizeof(*ljca_gpio), GFP_KERNEL);
> > +       gpio_info = dev_get_platdata(&auxdev->dev);
> > +       ljca_gpio = devm_kzalloc(&auxdev->dev, struct_size(ljca_gpio, connect_mode, gpio_info->num),
>
> I'm surprised to learn that there's no devm_kzalloc_flex() yet. I
> wanted to ask you to use it but it doesn't exist.
I'm sure a treewide commit will be applied when it gets introduced.
>
> Bart
>
> > +                                GFP_KERNEL);
> >         if (!ljca_gpio)
> >                 return -ENOMEM;
> >
> >         ljca_gpio->ljca = ljca;
> > -       ljca_gpio->gpio_info = dev_get_platdata(&auxdev->dev);
> > -       ljca_gpio->connect_mode = devm_kcalloc(&auxdev->dev,
> > -                                              ljca_gpio->gpio_info->num,
> > -                                              sizeof(*ljca_gpio->connect_mode),
> > -                                              GFP_KERNEL);
> > -       if (!ljca_gpio->connect_mode)
> > -               return -ENOMEM;
> > +       ljca_gpio->gpio_info = gpio_info;
> >
> >         ret = devm_mutex_init(&auxdev->dev, &ljca_gpio->irq_lock);
> >         if (ret)
> > --
> > 2.53.0
> >

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] gpio: ljca: reduce struct allocation
  2026-03-09 21:48   ` Rosen Penev
@ 2026-03-10 11:52     ` Linus Walleij
  0 siblings, 0 replies; 8+ messages in thread
From: Linus Walleij @ 2026-03-10 11:52 UTC (permalink / raw)
  To: Rosen Penev
  Cc: Bartosz Golaszewski, linux-gpio, Lixu Zhang, linux-hardening,
	gustavoars, Sakari Ailus, open list

On Mon, Mar 9, 2026 at 10:48 PM Rosen Penev <rosenp@gmail.com> wrote:

> > > +       u8 connect_mode[];
> >
> > Please use __counted_by().
> Counted by what?
>
> __counted_by(gpio_info->num); does not work.

As with the other patch (IIRC) just add a new member to the struct
to hold the count.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-03-10 11:52 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-08  2:12 [PATCH] gpio: ljca: reduce struct allocation Rosen Penev
2026-03-08 12:19 ` Sakari Ailus
2026-03-08 18:54   ` Rosen Penev
2026-03-09  7:19     ` Sakari Ailus
2026-03-09  7:32       ` Rosen Penev
2026-03-09  9:22 ` Bartosz Golaszewski
2026-03-09 21:48   ` Rosen Penev
2026-03-10 11:52     ` Linus Walleij

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox