Message ID | 1344372347.28967.154.camel@edumazet-glaptop |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Eric Dumazet <eric.dumazet@gmail.com> Date: Tue, 07 Aug 2012 22:45:47 +0200 > [PATCH v2 net-next] fib: use __fls() on non null argument > > __fls(x) is a bit faster than fls(x), granted we know x is non null. > > As Ben Hutchings pointed out, fls(x) = __fls(x) + 1 > > Signed-off-by: Eric Dumazet <edumazet@google.com> > Cc: Ben Hutchings <bhutchings@solarflare.com> Applied. This is, btw, the most expensive part of fib_trie on sparc64 since we really don't have a universal way to do this in a hardware instruction and therefore we end up with the branch-heavy software implementation :-/ So if anyone can come up with a way to eliminate this fls() entirely, you will be my hero. -- To unsubscribe from this list: send the line "unsubscribe netdev" 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/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index f0cdb30..f84a0e9 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -1550,7 +1550,8 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, * state.directly. */ if (pref_mismatch) { - int mp = KEYLENGTH - fls(pref_mismatch); + /* fls(x) = __fls(x) + 1 */ + int mp = KEYLENGTH - __fls(pref_mismatch) - 1; if (tkey_extract_bits(cn->key, mp, cn->pos - mp) != 0) goto backtrace;