[NET] : Adds prefetches in route hash list traversals.
The actual code doesnt use a prefetch enabled macro like list_for_each_rcu(),
so manually
add prefetch() hints.
Signed-off-by: Eric Dumazet <dada1@xxxxxxxxxxxxx>
diff -Nru linux-2.6.13-rc3/net/ipv4/route.c linux-2.6.13-rc3-ed/net/ipv4/route.c
--- linux-2.6.13-rc3/net/ipv4/route.c 2005-07-13 06:46:46.000000000 +0200
+++ linux-2.6.13-rc3-ed/net/ipv4/route.c 2005-07-28 17:20:21.000000000
+0200
@@ -1148,6 +1148,7 @@
while ((rth = rcu_dereference(*rthp)) != NULL) {
struct rtable *rt;
+ prefetch(rth->u.rt_next);
if (rth->fl.fl4_dst != daddr ||
rth->fl.fl4_src != skeys[i] ||
rth->fl.fl4_tos != tos ||
@@ -1401,6 +1402,7 @@
rcu_read_lock();
for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
rth = rcu_dereference(rth->u.rt_next)) {
+ prefetch(rth->u.rt_next);
if (rth->fl.fl4_dst == daddr &&
rth->fl.fl4_src == skeys[i] &&
rth->rt_dst == daddr &&
@@ -2094,6 +2096,7 @@
rcu_read_lock();
for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
rth = rcu_dereference(rth->u.rt_next)) {
+ prefetch(rth->u.rt_next);
if (rth->fl.fl4_dst == daddr &&
rth->fl.fl4_src == saddr &&
rth->fl.iif == iif &&
@@ -2565,6 +2568,7 @@
rcu_read_lock_bh();
for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
rth = rcu_dereference(rth->u.rt_next)) {
+ prefetch(rth->u.rt_next);
if (rth->fl.fl4_dst == flp->fl4_dst &&
rth->fl.fl4_src == flp->fl4_src &&
rth->fl.iif == 0 &&
@@ -2819,6 +2823,7 @@
rcu_read_lock_bh();
for (rt = rcu_dereference(rt_hash_table[h].chain), idx = 0; rt;
rt = rcu_dereference(rt->u.rt_next), idx++) {
+ prefetch(rt->u.rt_next);
if (idx < s_idx)
continue;
skb->dst = dst_clone(&rt->u.dst);
|