diff options
Diffstat (limited to 'net/ipv4/fib_trie.c')
| -rw-r--r-- | net/ipv4/fib_trie.c | 6 | 
1 files changed, 5 insertions, 1 deletions
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index ec0ae490f0b..33c7c85dfe4 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -986,9 +986,12 @@ fib_find_node(struct trie *t, u32 key)  static struct node *trie_rebalance(struct trie *t, struct tnode *tn)  {  	int wasfull; -	t_key cindex, key = tn->key; +	t_key cindex, key;  	struct tnode *tp; +	preempt_disable(); +	key = tn->key; +  	while (tn != NULL && (tp = node_parent((struct node *)tn)) != NULL) {  		cindex = tkey_extract_bits(key, tp->pos, tp->bits);  		wasfull = tnode_full(tp, tnode_get_child(tp, cindex)); @@ -1007,6 +1010,7 @@ static struct node *trie_rebalance(struct trie *t, struct tnode *tn)  	if (IS_TNODE(tn))  		tn = (struct tnode *)resize(t, (struct tnode *)tn); +	preempt_enable();  	return (struct node *)tn;  }  |