[TIPC]: Reduce stack usage

The node_map struct can be quite large (516 bytes) and allocating two of
them on the stack is not a good idea since we might only have a 4K stack
to start with.

Signed-off-by: Per Liden <per.liden@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Per Liden 2006-03-20 22:38:14 -08:00 committed by David S. Miller
parent 988f088a8e
commit de70c5ba43

View file

@ -531,10 +531,12 @@ static int tipc_bcbearer_send(struct sk_buff *buf,
{ {
static int send_count = 0; static int send_count = 0;
struct node_map remains; struct node_map *remains;
struct node_map remains_new; struct node_map *remains_new;
struct node_map *remains_tmp;
int bp_index; int bp_index;
int swap_time; int swap_time;
int err;
/* Prepare buffer for broadcasting (if first time trying to send it) */ /* Prepare buffer for broadcasting (if first time trying to send it) */
@ -555,7 +557,9 @@ static int tipc_bcbearer_send(struct sk_buff *buf,
/* Send buffer over bearers until all targets reached */ /* Send buffer over bearers until all targets reached */
remains = tipc_cltr_bcast_nodes; remains = kmalloc(sizeof(struct node_map), GFP_ATOMIC);
remains_new = kmalloc(sizeof(struct node_map), GFP_ATOMIC);
*remains = tipc_cltr_bcast_nodes;
for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) { for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) {
struct bearer *p = bcbearer->bpairs[bp_index].primary; struct bearer *p = bcbearer->bpairs[bp_index].primary;
@ -564,8 +568,8 @@ static int tipc_bcbearer_send(struct sk_buff *buf,
if (!p) if (!p)
break; /* no more bearers to try */ break; /* no more bearers to try */
tipc_nmap_diff(&remains, &p->nodes, &remains_new); tipc_nmap_diff(remains, &p->nodes, remains_new);
if (remains_new.count == remains.count) if (remains_new->count == remains->count)
continue; /* bearer pair doesn't add anything */ continue; /* bearer pair doesn't add anything */
if (!p->publ.blocked && if (!p->publ.blocked &&
@ -583,17 +587,27 @@ static int tipc_bcbearer_send(struct sk_buff *buf,
bcbearer->bpairs[bp_index].primary = s; bcbearer->bpairs[bp_index].primary = s;
bcbearer->bpairs[bp_index].secondary = p; bcbearer->bpairs[bp_index].secondary = p;
update: update:
if (remains_new.count == 0) if (remains_new->count == 0) {
return TIPC_OK; err = TIPC_OK;
goto out;
}
/* swap map */
remains_tmp = remains;
remains = remains_new; remains = remains_new;
remains_new = remains_tmp;
} }
/* Unable to reach all targets */ /* Unable to reach all targets */
bcbearer->bearer.publ.blocked = 1; bcbearer->bearer.publ.blocked = 1;
bcl->stats.bearer_congs++; bcl->stats.bearer_congs++;
return ~TIPC_OK; err = ~TIPC_OK;
out:
kfree(remains_new);
kfree(remains);
return err;
} }
/** /**