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.che...@samsung.com>
> ---
>  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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to