ipv4: Do not pass netns to fib_table_lookup()

Commit c436a624f8 ("ipv4: Pass netns to fib_table_lookup()") added the
network namespace as an argument of fib_table_lookup() so that it could
be passed to the fib_table_lookup tracepoint. However, the function is
called in the data path and the namespace is only needed when the
tracepoint is enabled, so the additional argument is unnecessary
overhead.

Instead, pass the namespace that is now stored in the FIB table to the
tracepoint. This way, the namespace is only read when the tracepoint is
enabled. Revert the signature of fib_table_lookup() and its callers to
what they were before the above commit. The tracepoint itself is
unchanged.

No functional changes intended.

Suggested-by: Paolo Abeni <pabeni@redhat.com>
Link: https://lore.kernel.org/netdev/43857d08-c4f4-44ce-a0b3-0e7fcc56bf90@redhat.com/
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Tested-by: Björn Töpel <bjorn@kernel.org>
Reviewed-by: Björn Töpel <bjorn@kernel.org>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://patch.msgid.link/20261014082612.1280756-3-idosch@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Ido Schimmel 2026-10-14 11:26:12 +03:00 committed by Jakub Kicinski
parent 1b82d5ce3b
commit a25a51258a
7 changed files with 20 additions and 23 deletions

View File

@ -276,9 +276,8 @@ struct fib_dump_filter {
struct net_device *dev;
};
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_lookup(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 *,
@ -325,8 +324,7 @@ 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(net, tb, flp, res,
flags | FIB_LOOKUP_NOREF);
err = fib_table_lookup(tb, flp, res, flags | FIB_LOOKUP_NOREF);
if (err == -EAGAIN)
err = -ENETUNREACH;
@ -390,14 +388,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(net, tb, flp, res, flags);
err = fib_table_lookup(tb, flp, res, flags);
if (err != -EAGAIN)
goto out;
tb = rcu_dereference_rtnl(net->ipv4.fib_default);
if (tb)
err = fib_table_lookup(net, tb, flp, res, flags);
err = fib_table_lookup(tb, flp, res, flags);
if (err == -EAGAIN)
err = -ENETUNREACH;

View File

@ -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(net, tb, &fl4, &res, FIB_LOOKUP_NOREF);
err = fib_table_lookup(tb, &fl4, &res, FIB_LOOKUP_NOREF);
} else {
if (flags & BPF_FIB_LOOKUP_MARK)
fl4.flowi4_mark = params->mark;

View File

@ -157,8 +157,7 @@ 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(net, local, &fl4, &res,
FIB_LOOKUP_NOREF) &&
!fib_table_lookup(local, &fl4, &res, FIB_LOOKUP_NOREF) &&
res.type == RTN_LOCAL)
result = FIB_RES_DEV(res);
} else {

View File

@ -243,8 +243,7 @@ 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(net, table, &fl4, &res,
FIB_LOOKUP_NOREF)) {
if (!fib_table_lookup(table, &fl4, &res, FIB_LOOKUP_NOREF)) {
struct fib_nh_common *nhc = fib_info_nhc(res.fi, 0);
if (!dev || dev == nhc->nhc_dev)
@ -1401,8 +1400,7 @@ 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(net, tb, &fl4, &res,
FIB_LOOKUP_NOREF);
frn->err = fib_table_lookup(tb, &fl4, &res, FIB_LOOKUP_NOREF);
if (!frn->err) {
frn->prefixlen = res.prefixlen;

View File

@ -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(rule->fr_net, tbl, &flp->u.ip4,
err = fib_table_lookup(tbl, &flp->u.ip4,
(struct fib_result *)arg->result,
arg->flags);

View File

@ -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(net, tbl, &fl4, &res,
err = fib_table_lookup(tbl, &fl4, &res,
FIB_LOOKUP_IGNORE_LINKSTATE |
FIB_LOOKUP_NOREF);

View File

@ -1415,9 +1415,8 @@ 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 net *net, struct fib_table *tb,
const struct flowi4 *flp, struct fib_result *res,
int fib_flags)
int fib_table_lookup(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
@ -1434,7 +1433,8 @@ int fib_table_lookup(struct net *net, struct fib_table *tb,
n = get_child_rcu(pn, cindex);
if (!n) {
trace_fib_table_lookup(tb->tb_id, flp, NULL, -EAGAIN, net);
trace_fib_table_lookup(tb->tb_id, flp, NULL, -EAGAIN,
tb->tb_net);
return -EAGAIN;
}
@ -1522,7 +1522,7 @@ int fib_table_lookup(struct net *net, struct fib_table *tb,
if (IS_TRIE(pn)) {
trace_fib_table_lookup(tb->tb_id, flp,
NULL, -EAGAIN,
net);
tb->tb_net);
return -EAGAIN;
}
#ifdef CONFIG_IP_FIB_TRIE_STATS
@ -1569,7 +1569,8 @@ int fib_table_lookup(struct net *net, struct fib_table *tb,
#ifdef CONFIG_IP_FIB_TRIE_STATS
this_cpu_inc(stats->semantic_match_passed);
#endif
trace_fib_table_lookup(tb->tb_id, flp, NULL, err, net);
trace_fib_table_lookup(tb->tb_id, flp, NULL, err,
tb->tb_net);
return err;
}
if (fi->fib_flags & RTNH_F_DEAD)
@ -1610,7 +1611,8 @@ int fib_table_lookup(struct net *net, struct fib_table *tb,
#ifdef CONFIG_IP_FIB_TRIE_STATS
this_cpu_inc(stats->semantic_match_passed);
#endif
trace_fib_table_lookup(tb->tb_id, flp, nhc, err, net);
trace_fib_table_lookup(tb->tb_id, flp, nhc, err,
tb->tb_net);
return err;
}