[PATCH] pcmcia: reduce ds.c stack footprint

This patch reduces the stack footprint of pcmcia_device_query() from 416 bytes
to 36 bytes.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Ingo Molnar 2005-09-09 13:03:21 -07:00 committed by Linus Torvalds
parent 4da006c63f
commit 76fa82fb71

View file

@ -424,9 +424,13 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev)
{ {
cistpl_manfid_t manf_id; cistpl_manfid_t manf_id;
cistpl_funcid_t func_id; cistpl_funcid_t func_id;
cistpl_vers_1_t vers1; cistpl_vers_1_t *vers1;
unsigned int i; unsigned int i;
vers1 = kmalloc(sizeof(*vers1), GFP_KERNEL);
if (!vers1)
return -ENOMEM;
if (!pccard_read_tuple(p_dev->socket, p_dev->func, if (!pccard_read_tuple(p_dev->socket, p_dev->func,
CISTPL_MANFID, &manf_id)) { CISTPL_MANFID, &manf_id)) {
p_dev->manf_id = manf_id.manf; p_dev->manf_id = manf_id.manf;
@ -443,23 +447,30 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev)
/* rule of thumb: cards with no FUNCID, but with /* rule of thumb: cards with no FUNCID, but with
* common memory device geometry information, are * common memory device geometry information, are
* probably memory cards (from pcmcia-cs) */ * probably memory cards (from pcmcia-cs) */
cistpl_device_geo_t devgeo; cistpl_device_geo_t *devgeo;
devgeo = kmalloc(sizeof(*devgeo), GFP_KERNEL);
if (!devgeo) {
kfree(vers1);
return -ENOMEM;
}
if (!pccard_read_tuple(p_dev->socket, p_dev->func, if (!pccard_read_tuple(p_dev->socket, p_dev->func,
CISTPL_DEVICE_GEO, &devgeo)) { CISTPL_DEVICE_GEO, devgeo)) {
ds_dbg(0, "mem device geometry probably means " ds_dbg(0, "mem device geometry probably means "
"FUNCID_MEMORY\n"); "FUNCID_MEMORY\n");
p_dev->func_id = CISTPL_FUNCID_MEMORY; p_dev->func_id = CISTPL_FUNCID_MEMORY;
p_dev->has_func_id = 1; p_dev->has_func_id = 1;
} }
kfree(devgeo);
} }
if (!pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_VERS_1, if (!pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_VERS_1,
&vers1)) { vers1)) {
for (i=0; i < vers1.ns; i++) { for (i=0; i < vers1->ns; i++) {
char *tmp; char *tmp;
unsigned int length; unsigned int length;
tmp = vers1.str + vers1.ofs[i]; tmp = vers1->str + vers1->ofs[i];
length = strlen(tmp) + 1; length = strlen(tmp) + 1;
if ((length < 3) || (length > 255)) if ((length < 3) || (length > 255))
@ -475,6 +486,7 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev)
} }
} }
kfree(vers1);
return 0; return 0;
} }