mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
Merge branch 'report-netns-cookie-in-fib-lookup-tracepoints'
Ido Schimmel says:
====================
Report netns cookie in FIB lookup tracepoints
The fib:fib_table_lookup and fib6:fib6_table_lookup tracepoints do not
report the network namespace in which the lookup was performed, so
lookups performed in different namespaces cannot be told apart. The
recorded PID does not help either, as lookups in the receive path are
performed in softIRQ context.
This is a problem, for example, for netns-aware tracers [1] and
multi-ASIC systems where each ASIC and its ports reside in a separate
network namespace.
This patchset reports the network namespace cookie in both tracepoints,
as commit 27cb3de7f4 ("net: add net cookie for net device trace
events") did for the net device tracepoints. This allows filtering
lookups performed in a specific network namespace, for example:
# perf record -a -e fib:fib_table_lookup --filter 'net_cookie == 12'
The cookie of a given network namespace can be retrieved using "ip netns
cookie" [2].
Patch #1 reports the cookie in the IPv6 tracepoint, which is already
passed the network namespace.
Patch #2 passes the network namespace to fib_table_lookup() and from
there to the IPv4 tracepoint.
Patch #3 reports the cookie in the IPv4 tracepoint.
v1: https://lore.kernel.org/netdev/20261006155454.853588-1-idosch@nvidia.com/
[1] https://lore.kernel.org/netdev/c28ded3224734ca62187ed9a41f7ab39ceecb610.camel@fejes.dev/
[2] https://lore.kernel.org/netdev/20260923161756.2914560-1-idosch@nvidia.com/
====================
Link: https://patch.msgid.link/20261008133158.1438907-1-idosch@nvidia.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
commit
6607154049
|
|
@ -275,8 +275,9 @@ struct fib_dump_filter {
|
|||
struct net_device *dev;
|
||||
};
|
||||
|
||||
int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
|
||||
struct fib_result *res, int fib_flags);
|
||||
int fib_table_lookup(struct net *net, struct fib_table *tb,
|
||||
const struct flowi4 *flp, struct fib_result *res,
|
||||
int fib_flags);
|
||||
int fib_table_insert(struct net *, struct fib_table *, struct fib_config *,
|
||||
struct netlink_ext_ack *extack);
|
||||
int fib_table_delete(struct net *, struct fib_table *, struct fib_config *,
|
||||
|
|
@ -323,7 +324,8 @@ static inline int fib_lookup(struct net *net, const struct flowi4 *flp,
|
|||
|
||||
tb = fib_get_table(net, RT_TABLE_MAIN);
|
||||
if (tb)
|
||||
err = fib_table_lookup(tb, flp, res, flags | FIB_LOOKUP_NOREF);
|
||||
err = fib_table_lookup(net, tb, flp, res,
|
||||
flags | FIB_LOOKUP_NOREF);
|
||||
|
||||
if (err == -EAGAIN)
|
||||
err = -ENETUNREACH;
|
||||
|
|
@ -387,14 +389,14 @@ static inline int fib_lookup(struct net *net, struct flowi4 *flp,
|
|||
|
||||
tb = rcu_dereference_rtnl(net->ipv4.fib_main);
|
||||
if (tb)
|
||||
err = fib_table_lookup(tb, flp, res, flags);
|
||||
err = fib_table_lookup(net, tb, flp, res, flags);
|
||||
|
||||
if (err != -EAGAIN)
|
||||
goto out;
|
||||
|
||||
tb = rcu_dereference_rtnl(net->ipv4.fib_default);
|
||||
if (tb)
|
||||
err = fib_table_lookup(tb, flp, res, flags);
|
||||
err = fib_table_lookup(net, tb, flp, res, flags);
|
||||
|
||||
if (err == -EAGAIN)
|
||||
err = -ENETUNREACH;
|
||||
|
|
|
|||
|
|
@ -15,9 +15,10 @@
|
|||
TRACE_EVENT(fib_table_lookup,
|
||||
|
||||
TP_PROTO(u32 tb_id, const struct flowi4 *flp,
|
||||
const struct fib_nh_common *nhc, int err),
|
||||
const struct fib_nh_common *nhc, int err,
|
||||
const struct net *net),
|
||||
|
||||
TP_ARGS(tb_id, flp, nhc, err),
|
||||
TP_ARGS(tb_id, flp, nhc, err, net),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field( u32, tb_id )
|
||||
|
|
@ -35,6 +36,7 @@ TRACE_EVENT(fib_table_lookup,
|
|||
__field( u16, sport )
|
||||
__field( u16, dport )
|
||||
__array(char, name, IFNAMSIZ )
|
||||
__field( u64, net_cookie )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
|
|
@ -90,13 +92,16 @@ TRACE_EVENT(fib_table_lookup,
|
|||
in6 = (struct in6_addr *)__entry->gw6;
|
||||
*in6 = in6addr_any;
|
||||
}
|
||||
|
||||
__entry->net_cookie = net->net_cookie;
|
||||
),
|
||||
|
||||
TP_printk("table %u oif %d iif %d proto %u %pI4/%u -> %pI4/%u tos %d scope %d flags %x ==> dev %s gw %pI4/%pI6c err %d",
|
||||
TP_printk("table %u oif %d iif %d proto %u %pI4/%u -> %pI4/%u tos %d scope %d flags %x ==> dev %s gw %pI4/%pI6c err %d net_cookie %llu",
|
||||
__entry->tb_id, __entry->oif, __entry->iif, __entry->proto,
|
||||
__entry->src, __entry->sport, __entry->dst, __entry->dport,
|
||||
__entry->tos, __entry->scope, __entry->flags,
|
||||
__entry->name, __entry->gw4, __entry->gw6, __entry->err)
|
||||
__entry->name, __entry->gw4, __entry->gw6, __entry->err,
|
||||
__entry->net_cookie)
|
||||
);
|
||||
#endif /* _TRACE_FIB_H */
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ TRACE_EVENT(fib6_table_lookup,
|
|||
__field( u8, rt_type )
|
||||
__array( char, name, IFNAMSIZ )
|
||||
__array( __u8, gw, 16 )
|
||||
__field( u64, net_cookie )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
|
|
@ -76,13 +77,16 @@ TRACE_EVENT(fib6_table_lookup,
|
|||
in6 = (struct in6_addr *)__entry->gw;
|
||||
*in6 = res->nh->fib_nh_gw6;
|
||||
}
|
||||
|
||||
__entry->net_cookie = net->net_cookie;
|
||||
),
|
||||
|
||||
TP_printk("table %3u oif %d iif %d proto %u %pI6c/%u -> %pI6c/%u flowlabel %#x tos %d scope %d flags %x ==> dev %s gw %pI6c err %d",
|
||||
TP_printk("table %3u oif %d iif %d proto %u %pI6c/%u -> %pI6c/%u flowlabel %#x tos %d scope %d flags %x ==> dev %s gw %pI6c err %d net_cookie %llu",
|
||||
__entry->tb_id, __entry->oif, __entry->iif, __entry->proto,
|
||||
__entry->src, __entry->sport, __entry->dst, __entry->dport,
|
||||
__entry->flowlabel, __entry->tos, __entry->scope,
|
||||
__entry->flags, __entry->name, __entry->gw, __entry->err)
|
||||
__entry->flags, __entry->name, __entry->gw, __entry->err,
|
||||
__entry->net_cookie)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_FIB6_H */
|
||||
|
|
|
|||
|
|
@ -6413,7 +6413,7 @@ static int bpf_ipv4_fib_lookup(struct net *net, struct bpf_fib_lookup *params,
|
|||
if (unlikely(!tb))
|
||||
return BPF_FIB_LKUP_RET_NOT_FWDED;
|
||||
|
||||
err = fib_table_lookup(tb, &fl4, &res, FIB_LOOKUP_NOREF);
|
||||
err = fib_table_lookup(net, tb, &fl4, &res, FIB_LOOKUP_NOREF);
|
||||
} else {
|
||||
if (flags & BPF_FIB_LOOKUP_MARK)
|
||||
fl4.flowi4_mark = params->mark;
|
||||
|
|
|
|||
|
|
@ -157,7 +157,8 @@ struct net_device *__ip_dev_find(struct net *net, __be32 addr, bool devref)
|
|||
*/
|
||||
local = fib_get_table(net, RT_TABLE_LOCAL);
|
||||
if (local &&
|
||||
!fib_table_lookup(local, &fl4, &res, FIB_LOOKUP_NOREF) &&
|
||||
!fib_table_lookup(net, local, &fl4, &res,
|
||||
FIB_LOOKUP_NOREF) &&
|
||||
res.type == RTN_LOCAL)
|
||||
result = FIB_RES_DEV(res);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -243,7 +243,8 @@ static inline unsigned int __inet_dev_addr_type(struct net *net,
|
|||
table = fib_get_table(net, tb_id);
|
||||
if (table) {
|
||||
ret = RTN_UNICAST;
|
||||
if (!fib_table_lookup(table, &fl4, &res, FIB_LOOKUP_NOREF)) {
|
||||
if (!fib_table_lookup(net, table, &fl4, &res,
|
||||
FIB_LOOKUP_NOREF)) {
|
||||
struct fib_nh_common *nhc = fib_info_nhc(res.fi, 0);
|
||||
|
||||
if (!dev || dev == nhc->nhc_dev)
|
||||
|
|
@ -1400,7 +1401,8 @@ static void nl_fib_lookup(struct net *net, struct fib_result_nl *frn)
|
|||
local_bh_disable();
|
||||
|
||||
frn->tb_id = tb->tb_id;
|
||||
frn->err = fib_table_lookup(tb, &fl4, &res, FIB_LOOKUP_NOREF);
|
||||
frn->err = fib_table_lookup(net, tb, &fl4, &res,
|
||||
FIB_LOOKUP_NOREF);
|
||||
|
||||
if (!frn->err) {
|
||||
frn->prefixlen = res.prefixlen;
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ INDIRECT_CALLABLE_SCOPE int fib4_rule_action(struct fib_rule *rule,
|
|||
tb_id = fib_rule_get_table(rule, arg);
|
||||
tbl = fib_get_table(rule->fr_net, tb_id);
|
||||
if (tbl)
|
||||
err = fib_table_lookup(tbl, &flp->u.ip4,
|
||||
err = fib_table_lookup(rule->fr_net, tbl, &flp->u.ip4,
|
||||
(struct fib_result *)arg->result,
|
||||
arg->flags);
|
||||
|
||||
|
|
|
|||
|
|
@ -1224,7 +1224,7 @@ static int fib_check_nh_v4_gw(struct net *net, struct fib_nh *nh, u32 table,
|
|||
tbl = fib_get_table(net, table);
|
||||
|
||||
if (tbl)
|
||||
err = fib_table_lookup(tbl, &fl4, &res,
|
||||
err = fib_table_lookup(net, tbl, &fl4, &res,
|
||||
FIB_LOOKUP_IGNORE_LINKSTATE |
|
||||
FIB_LOOKUP_NOREF);
|
||||
|
||||
|
|
|
|||
|
|
@ -1415,8 +1415,9 @@ bool fib_lookup_good_nhc(const struct fib_nh_common *nhc, int fib_flags,
|
|||
}
|
||||
|
||||
/* should be called with rcu_read_lock */
|
||||
int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
|
||||
struct fib_result *res, int fib_flags)
|
||||
int fib_table_lookup(struct net *net, struct fib_table *tb,
|
||||
const struct flowi4 *flp, struct fib_result *res,
|
||||
int fib_flags)
|
||||
{
|
||||
struct trie *t = (struct trie *) tb->tb_data;
|
||||
#ifdef CONFIG_IP_FIB_TRIE_STATS
|
||||
|
|
@ -1433,7 +1434,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
|
|||
|
||||
n = get_child_rcu(pn, cindex);
|
||||
if (!n) {
|
||||
trace_fib_table_lookup(tb->tb_id, flp, NULL, -EAGAIN);
|
||||
trace_fib_table_lookup(tb->tb_id, flp, NULL, -EAGAIN, net);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
|
|
@ -1520,7 +1521,8 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
|
|||
*/
|
||||
if (IS_TRIE(pn)) {
|
||||
trace_fib_table_lookup(tb->tb_id, flp,
|
||||
NULL, -EAGAIN);
|
||||
NULL, -EAGAIN,
|
||||
net);
|
||||
return -EAGAIN;
|
||||
}
|
||||
#ifdef CONFIG_IP_FIB_TRIE_STATS
|
||||
|
|
@ -1567,7 +1569,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
|
|||
#ifdef CONFIG_IP_FIB_TRIE_STATS
|
||||
this_cpu_inc(stats->semantic_match_passed);
|
||||
#endif
|
||||
trace_fib_table_lookup(tb->tb_id, flp, NULL, err);
|
||||
trace_fib_table_lookup(tb->tb_id, flp, NULL, err, net);
|
||||
return err;
|
||||
}
|
||||
if (fi->fib_flags & RTNH_F_DEAD)
|
||||
|
|
@ -1608,7 +1610,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
|
|||
#ifdef CONFIG_IP_FIB_TRIE_STATS
|
||||
this_cpu_inc(stats->semantic_match_passed);
|
||||
#endif
|
||||
trace_fib_table_lookup(tb->tb_id, flp, nhc, err);
|
||||
trace_fib_table_lookup(tb->tb_id, flp, nhc, err, net);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user