Re: [PATCH v3 04/29] [media] cx18: struct i2c_client is too big for stack

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2013-11-05 at 08:01 -0200, Mauro Carvalho Chehab wrote:
> 	drivers/media/pci/cx18/cx18-driver.c: In function 'cx18_read_eeprom':
> 	drivers/media/pci/cx18/cx18-driver.c:357:1: warning: the frame size of 1072 bytes is larger than 1024 bytes [-Wframe-larger-than=]
> That happens because the routine allocates 256 bytes for an eeprom buffer, plus
> the size of struct i2c_client, with is big.
> Change the logic to dynamically allocate/deallocate space for struct i2c_client,
> instead of  using the stack.
> 
> Signed-off-by: Mauro Carvalho Chehab <m.chehab@xxxxxxxxxxx>
> ---
>  drivers/media/pci/cx18/cx18-driver.c | 20 ++++++++++++--------
>  1 file changed, 12 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/media/pci/cx18/cx18-driver.c b/drivers/media/pci/cx18/cx18-driver.c
> index ff7232023f56..87f5bcf29e90 100644
> --- a/drivers/media/pci/cx18/cx18-driver.c
> +++ b/drivers/media/pci/cx18/cx18-driver.c
> @@ -324,23 +324,24 @@ static void cx18_eeprom_dump(struct cx18 *cx, unsigned char *eedata, int len)
>  /* Hauppauge card? get values from tveeprom */
>  void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv)
>  {
> -	struct i2c_client c;
> +	struct i2c_client *c;
>  	u8 eedata[256];
>  
> -	memset(&c, 0, sizeof(c));
> -	strlcpy(c.name, "cx18 tveeprom tmp", sizeof(c.name));
> -	c.adapter = &cx->i2c_adap[0];
> -	c.addr = 0xA0 >> 1;
> +	c = kzalloc(sizeof(*c), GFP_ATOMIC);

Hi Mauro,

GFP_ATOMIC seems overly strict, as this function is not in called in an
atomic context AFAIK.

Maybe use GFP_TEMPORARY or GFP_KERNEL.

Regards,
Andy

> +
> +	strlcpy(c->name, "cx18 tveeprom tmp", sizeof(c->name));
> +	c->adapter = &cx->i2c_adap[0];
> +	c->addr = 0xa0 >> 1;
>  
>  	memset(tv, 0, sizeof(*tv));
> -	if (tveeprom_read(&c, eedata, sizeof(eedata)))
> -		return;
> +	if (tveeprom_read(c, eedata, sizeof(eedata)))
> +		goto ret;
>  
>  	switch (cx->card->type) {
>  	case CX18_CARD_HVR_1600_ESMT:
>  	case CX18_CARD_HVR_1600_SAMSUNG:
>  	case CX18_CARD_HVR_1600_S5H1411:
> -		tveeprom_hauppauge_analog(&c, tv, eedata);
> +		tveeprom_hauppauge_analog(c, tv, eedata);
>  		break;
>  	case CX18_CARD_YUAN_MPC718:
>  	case CX18_CARD_GOTVIEW_PCI_DVD3:
> @@ -354,6 +355,9 @@ void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv)
>  		cx18_eeprom_dump(cx, eedata, sizeof(eedata));
>  		break;
>  	}
> +
> +ret:
> +	kfree(c);
>  }
>  
>  static void cx18_process_eeprom(struct cx18 *cx)


--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux