[PATCH v1 net-next 00/10] net: fib_rules: RTNL-less RTM_NEWRULE and RTM_DELRULE.
From: Kuniyuki Iwashima <kuniyu@google.com>
Date: 2026-06-29 18:12:30
RTM_NEWRULE and RTM_DELRULE acquire rtnl_net_lock(), but this is
only for fib_unmerge() in IPv4.
Since commit d954a67a7dfa ("ipv4: fib_rule: Move fib4_rules_exit()
to ->exit()."), RTM_DELRULE no longer needs RTNL.
fib_unmerge() is one-time event for each netns, so we only need
RTNL for the first IPv4 rule.
This series introduces per-fib_rules_ops mutex and drops RTNL
from fib_rules code except for the first IPv4 RTM_NEWRULE.
The script below creates 1K rules in parallel in 4K netns, and
it got 20x/30x faster for IPv4/IPv6.
#!/bin/bash
N=4096
F=rules.txt
for i in $(seq $N); do ip netns add ns-$i; done
printf 'rule add from all table %d\n' {1..1024} > $F
for v in 4 6; do
echo "=== IPv${v} ==="
time { for i in $(seq $N); do nsenter \
--net=/var/run/netns/ns-$i ip -$v -batch $F & done; wait; }
done
for i in $(seq $N); do ip netns del ns-$i; done
rm -f $F
Without this series:
# ./test.sh
=== IPv4 ===
real 0m22.752s
user 0m7.834s
sys 92m46.721s
=== IPv6 ===
real 0m35.181s
user 0m8.635s
sys 142m30.479s
With this series:
# ./test.sh
=== IPv4 ===
real 0m0.918s
user 0m5.675s
sys 2m7.024s
=== IPv6 ===
real 0m1.214s
user 0m7.917s
sys 4m19.489s
Kuniyuki Iwashima (10):
net: fib_rules: Make fib_rules_ops.delete() return void.
ipv4: fib_rules: Make the need for fib_unmerge() explicit.
ipv4: fib: Protect fib_new_table() with spinlock.
ipv4: fib: Drop RTNL annotation for net->ipv4.fib_table_hash[].
net: fib_rules: Add fib_rules_ops.lock.
net: fib_rules: Remove unnecessary EXPORT_SYMBOL.
net: fib_rules: Drop RTNL assertions.
net: fib_rules: Use dev_get_by_name_rcu().
net: fib_rules: Only hold RTNL for the first IPv4 RTM_NEWRULE.
ipv6: fib_rules: Convert fib6_rules_net_exit_rtnl() to ->exit().
include/net/fib_rules.h | 4 +-
include/net/ip_fib.h | 3 +-
include/net/netns/ipv4.h | 1 +
net/core/fib_rules.c | 82 +++++++++++++++++++++-------------------
net/ipv4/fib_frontend.c | 48 ++++++++++++++++-------
net/ipv4/fib_rules.c | 20 ++++++----
net/ipv4/fib_trie.c | 3 +-
net/ipv6/fib6_rules.c | 17 ++-------
8 files changed, 101 insertions(+), 77 deletions(-)
--
2.55.0.rc0.799.gd6f94ed593-goog