diff options
author | Alexander Duyck <alexander.h.duyck@redhat.com> | 2015-01-22 18:51:08 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-01-25 17:47:15 -0500 |
commit | b3832117b4b61374fac08692f1b1a620088342dd (patch) | |
tree | 836e0e535f9fb38c60808b21851923ff3d2744e2 | |
parent | bc579ae5f902e7a17d4a02ca32779c90604d57b9 (diff) |
fib_trie: Use index & (~0ul << n->bits) instead of index >> n->bits
In doing performance testing and analysis of the changes I recently found
that by shifting the index I had created an unnecessary dependency.
I have updated the code so that we instead shift a mask by bits and then
just test against that as that should save us about 2 CPU cycles since we
can generate the mask while the key and pos are being processed.
Signed-off-by: Alexander Duyck <alexander.h.duyck@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/ipv4/fib_trie.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 281e5e00025f..dea2f80e08c3 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -961,12 +961,12 @@ static struct tnode *fib_find_node(struct trie *t, u32 key) | |||
961 | * prefix plus zeros for the bits in the cindex. The index | 961 | * prefix plus zeros for the bits in the cindex. The index |
962 | * is the difference between the key and this value. From | 962 | * is the difference between the key and this value. From |
963 | * this we can actually derive several pieces of data. | 963 | * this we can actually derive several pieces of data. |
964 | * if !(index >> bits) | 964 | * if (index & (~0ul << bits)) |
965 | * we know the value is cindex | ||
966 | * else | ||
967 | * we have a mismatch in skip bits and failed | 965 | * we have a mismatch in skip bits and failed |
966 | * else | ||
967 | * we know the value is cindex | ||
968 | */ | 968 | */ |
969 | if (index >> n->bits) | 969 | if (index & (~0ul << n->bits)) |
970 | return NULL; | 970 | return NULL; |
971 | 971 | ||
972 | /* we have found a leaf. Prefixes have already been compared */ | 972 | /* we have found a leaf. Prefixes have already been compared */ |
@@ -1301,12 +1301,12 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, | |||
1301 | * prefix plus zeros for the "bits" in the prefix. The index | 1301 | * prefix plus zeros for the "bits" in the prefix. The index |
1302 | * is the difference between the key and this value. From | 1302 | * is the difference between the key and this value. From |
1303 | * this we can actually derive several pieces of data. | 1303 | * this we can actually derive several pieces of data. |
1304 | * if !(index >> bits) | 1304 | * if (index & (~0ul << bits)) |
1305 | * we know the value is child index | ||
1306 | * else | ||
1307 | * we have a mismatch in skip bits and failed | 1305 | * we have a mismatch in skip bits and failed |
1306 | * else | ||
1307 | * we know the value is cindex | ||
1308 | */ | 1308 | */ |
1309 | if (index >> n->bits) | 1309 | if (index & (~0ul << n->bits)) |
1310 | break; | 1310 | break; |
1311 | 1311 | ||
1312 | /* we have found a leaf. Prefixes have already been compared */ | 1312 | /* we have found a leaf. Prefixes have already been compared */ |