Message ID | 1383645702-30636-5-git-send-email-m.chehab@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 --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)
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(-)