mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
fib_trie: use fls() instead of open coded loop
fib_table_lookup() might use fls() to speedup an open coded loop. Noticed while doing a profile analysis. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a0a4a85a15
commit
874ffa8f72
@ -1384,8 +1384,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi *flp,
|
||||
t_key cindex = 0;
|
||||
int current_prefix_length = KEYLENGTH;
|
||||
struct tnode *cn;
|
||||
t_key node_prefix, key_prefix, pref_mismatch;
|
||||
int mp;
|
||||
t_key pref_mismatch;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
@ -1500,10 +1499,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi *flp,
|
||||
* matching prefix.
|
||||
*/
|
||||
|
||||
node_prefix = mask_pfx(cn->key, cn->pos);
|
||||
key_prefix = mask_pfx(key, cn->pos);
|
||||
pref_mismatch = key_prefix^node_prefix;
|
||||
mp = 0;
|
||||
pref_mismatch = mask_pfx(cn->key ^ key, cn->pos);
|
||||
|
||||
/*
|
||||
* In short: If skipped bits in this node do not match
|
||||
@ -1511,13 +1507,9 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi *flp,
|
||||
* state.directly.
|
||||
*/
|
||||
if (pref_mismatch) {
|
||||
while (!(pref_mismatch & (1<<(KEYLENGTH-1)))) {
|
||||
mp++;
|
||||
pref_mismatch = pref_mismatch << 1;
|
||||
}
|
||||
key_prefix = tkey_extract_bits(cn->key, mp, cn->pos-mp);
|
||||
int mp = KEYLENGTH - fls(pref_mismatch);
|
||||
|
||||
if (key_prefix != 0)
|
||||
if (tkey_extract_bits(cn->key, mp, cn->pos - mp) != 0)
|
||||
goto backtrace;
|
||||
|
||||
if (current_prefix_length >= cn->pos)
|
||||
|
Loading…
Reference in New Issue
Block a user