diff mbox

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

Message ID 1383645702-30636-5-git-send-email-m.chehab@samsung.com (mailing list archive)
State New, archived
Headers show

Commit Message

Mauro Carvalho Chehab Nov. 5, 2013, 10:01 a.m. UTC
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@samsung.com>
---
 drivers/media/pci/cx18/cx18-driver.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

Comments

Andy Walls Nov. 6, 2013, 12:19 a.m. UTC | #1
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@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 majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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);
+
+	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)