ipv6: let trace_fib6_table_lookup() dereference the fib table
authorPaolo Abeni <pabeni@redhat.com>
Thu, 19 Oct 2017 07:31:43 +0000 (09:31 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 21 Oct 2017 01:23:38 +0000 (02:23 +0100)
The perf traces for ipv6 routing code show a relevant cost around
trace_fib6_table_lookup(), even if no trace is enabled. This is
due to the fib6_table de-referencing currently performed by the
caller.

Let's the tracing code pay this overhead, passing to the trace
helper the table pointer. This gives small but measurable
performance improvement under UDP flood.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Acked-by: David Ahern <dsa@cumulusnetworks.com>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/trace/events/fib6.h
net/ipv6/route.c

index d60096cddb2a6e0e40961c5a078c14c8f848e529..b34bed17abc70517b12caf47b6fd673a62da28f8 100644 (file)
@@ -12,9 +12,9 @@
 TRACE_EVENT(fib6_table_lookup,
 
        TP_PROTO(const struct net *net, const struct rt6_info *rt,
-                u32 tb_id, const struct flowi6 *flp),
+                struct fib6_table *table, const struct flowi6 *flp),
 
-       TP_ARGS(net, rt, tb_id, flp),
+       TP_ARGS(net, rt, table, flp),
 
        TP_STRUCT__entry(
                __field(        u32,    tb_id           )
@@ -34,7 +34,7 @@ TRACE_EVENT(fib6_table_lookup,
        TP_fast_assign(
                struct in6_addr *in6;
 
-               __entry->tb_id = tb_id;
+               __entry->tb_id = table->tb6_id;
                __entry->oif = flp->flowi6_oif;
                __entry->iif = flp->flowi6_iif;
                __entry->tos = ip6_tclass(flp->flowlabel);
index 074fac966018be8a3943ccc438045f77718f98a1..46c59a53c53f3b84ceae19f42675ce3a1b05bdce 100644 (file)
@@ -945,7 +945,7 @@ restart:
 
        rcu_read_unlock();
 
-       trace_fib6_table_lookup(net, rt, table->tb6_id, fl6);
+       trace_fib6_table_lookup(net, rt, table, fl6);
 
        return rt;
 
@@ -1682,7 +1682,7 @@ redo_rt6_select:
        if (rt == net->ipv6.ip6_null_entry) {
                rcu_read_unlock();
                dst_hold(&rt->dst);
-               trace_fib6_table_lookup(net, rt, table->tb6_id, fl6);
+               trace_fib6_table_lookup(net, rt, table, fl6);
                return rt;
        } else if (rt->rt6i_flags & RTF_CACHE) {
                if (ip6_hold_safe(net, &rt, true)) {
@@ -1690,7 +1690,7 @@ redo_rt6_select:
                        rt6_dst_from_metrics_check(rt);
                }
                rcu_read_unlock();
-               trace_fib6_table_lookup(net, rt, table->tb6_id, fl6);
+               trace_fib6_table_lookup(net, rt, table, fl6);
                return rt;
        } else if (unlikely((fl6->flowi6_flags & FLOWI_FLAG_KNOWN_NH) &&
                            !(rt->rt6i_flags & RTF_GATEWAY))) {
@@ -1726,7 +1726,7 @@ redo_rt6_select:
                }
 
 uncached_rt_out:
-               trace_fib6_table_lookup(net, uncached_rt, table->tb6_id, fl6);
+               trace_fib6_table_lookup(net, uncached_rt, table, fl6);
                return uncached_rt;
 
        } else {
@@ -1754,7 +1754,7 @@ uncached_rt_out:
                }
                local_bh_enable();
                rcu_read_unlock();
-               trace_fib6_table_lookup(net, pcpu_rt, table->tb6_id, fl6);
+               trace_fib6_table_lookup(net, pcpu_rt, table, fl6);
                return pcpu_rt;
        }
 }
@@ -2195,7 +2195,7 @@ out:
 
        rcu_read_unlock();
 
-       trace_fib6_table_lookup(net, rt, table->tb6_id, fl6);
+       trace_fib6_table_lookup(net, rt, table, fl6);
        return rt;
 };