Ido Schimmel wrote: > From: Ido Schimmel <ido...@nvidia.com> > > While insertion of 16k nexthops all using the same netdev ('dummy10') > takes less than a second, deletion takes about 130 seconds: > > # time -p ip -b nexthop.batch > real 0.29 > user 0.01 > sys 0.15 > > # time -p ip link set dev dummy10 down > real 131.03 > user 0.06 > sys 0.52
snip... > Since nexthops are always deleted under RTNL, synchronize_net() can be > used instead. It will call synchronize_rcu_expedited() which only blocks > for several microseconds as opposed to multiple milliseconds like > synchronize_rcu(). > > With this patch deletion of 16k nexthops takes less than a second: > > # time -p ip link set dev dummy10 down > real 0.12 > user 0.00 > sys 0.04 That's a nice result! Well done! I can't really speak to whether or not there is any horrible side effect of using synchronize_rcu_expedited(), but FWIW: Reviewed-by: Jesse Brandeburg <jesse.brandeb...@intel.com> > > Tested with fib_nexthops.sh which includes torture tests that prompted > the initial change: > > # ./fib_nexthops.sh > ... > Tests passed: 134 > Tests failed: 0 > > Fixes: 90f33bffa382 ("nexthops: don't modify published nexthop groups") > Signed-off-by: Ido Schimmel <ido...@nvidia.com> Nice fix, good commit message, thanks! > --- > net/ipv4/nexthop.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c > index 8c0f17c6863c..0dc43ad28eb9 100644 > --- a/net/ipv4/nexthop.c > +++ b/net/ipv4/nexthop.c > @@ -845,7 +845,7 @@ static void remove_nexthop_from_groups(struct net *net, > struct nexthop *nh, > remove_nh_grp_entry(net, nhge, nlinfo); > > /* make sure all see the newly published array before releasing rtnl */ > - synchronize_rcu(); > + synchronize_net(); > } > > static void remove_nexthop_group(struct nexthop *nh, struct nl_info *nlinfo)