Message ID | 20211202022635.2864113-1-eric.dumazet@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 213f5f8f31f10aa1e83187ae20fb7fa4e626b724 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] ipv4: convert fib_num_tclassid_users to atomic_t | expand |
On 12/1/21 7:26 PM, Eric Dumazet wrote: > From: Eric Dumazet <edumazet@google.com> > > Before commit faa041a40b9f ("ipv4: Create cleanup helper for fib_nh") > changes to net->ipv4.fib_num_tclassid_users were protected by RTNL. > > After the change, this is no longer the case, as free_fib_info_rcu() > runs after rcu grace period, without rtnl being held. > > Fixes: faa041a40b9f ("ipv4: Create cleanup helper for fib_nh") > Signed-off-by: Eric Dumazet <edumazet@google.com> > Cc: David Ahern <dsahern@kernel.org> > --- > include/net/ip_fib.h | 2 +- > include/net/netns/ipv4.h | 2 +- > net/ipv4/fib_frontend.c | 2 +- > net/ipv4/fib_rules.c | 4 ++-- > net/ipv4/fib_semantics.c | 4 ++-- > 5 files changed, 7 insertions(+), 7 deletions(-) > Thanks, Eric. Was this found by syzbot or code inspection? Reviewed-by: David Ahern <dsahern@kernel.org>
On Wed, Dec 1, 2021 at 6:42 PM David Ahern <dsahern@gmail.com> wrote: > > On 12/1/21 7:26 PM, Eric Dumazet wrote: > > From: Eric Dumazet <edumazet@google.com> > > > > Before commit faa041a40b9f ("ipv4: Create cleanup helper for fib_nh") > > changes to net->ipv4.fib_num_tclassid_users were protected by RTNL. > > > > After the change, this is no longer the case, as free_fib_info_rcu() > > runs after rcu grace period, without rtnl being held. > > > > Fixes: faa041a40b9f ("ipv4: Create cleanup helper for fib_nh") > > Signed-off-by: Eric Dumazet <edumazet@google.com> > > Cc: David Ahern <dsahern@kernel.org> > > --- > > include/net/ip_fib.h | 2 +- > > include/net/netns/ipv4.h | 2 +- > > net/ipv4/fib_frontend.c | 2 +- > > net/ipv4/fib_rules.c | 4 ++-- > > net/ipv4/fib_semantics.c | 4 ++-- > > 5 files changed, 7 insertions(+), 7 deletions(-) > > > > Thanks, Eric. Was this found by syzbot or code inspection? > Code inspection, while plumbing my dev_hold_track() and dev_put_track() helpers. > Reviewed-by: David Ahern <dsahern@kernel.org> > >
Hello: This patch was applied to netdev/net.git (master) by David S. Miller <davem@davemloft.net>: On Wed, 1 Dec 2021 18:26:35 -0800 you wrote: > From: Eric Dumazet <edumazet@google.com> > > Before commit faa041a40b9f ("ipv4: Create cleanup helper for fib_nh") > changes to net->ipv4.fib_num_tclassid_users were protected by RTNL. > > After the change, this is no longer the case, as free_fib_info_rcu() > runs after rcu grace period, without rtnl being held. > > [...] Here is the summary with links: - [net] ipv4: convert fib_num_tclassid_users to atomic_t https://git.kernel.org/netdev/net/c/213f5f8f31f1 You are awesome, thank you!
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index ab5348e57db1a627cbce2dededb2e9b754d1f2cd..3417ba2d27ad6a1b5612a8855d2788f10d9fdf25 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h @@ -438,7 +438,7 @@ int fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst, #ifdef CONFIG_IP_ROUTE_CLASSID static inline int fib_num_tclassid_users(struct net *net) { - return net->ipv4.fib_num_tclassid_users; + return atomic_read(&net->ipv4.fib_num_tclassid_users); } #else static inline int fib_num_tclassid_users(struct net *net) diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 2f65701a43c953bd3a9a9e3d491882cb7bb11859..6c5b2efc4f17d0d17be750d0c1a2e1d169ec063e 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h @@ -65,7 +65,7 @@ struct netns_ipv4 { bool fib_has_custom_local_routes; bool fib_offload_disabled; #ifdef CONFIG_IP_ROUTE_CLASSID - int fib_num_tclassid_users; + atomic_t fib_num_tclassid_users; #endif struct hlist_head *fib_table_hash; struct sock *fibnl; diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 9fe13e4f5d08a5cf9cd9ff15033b9f6e0dc9e492..4d61ddd8a0ecfc4cc47b4802eb5a573beb84ee44 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -1582,7 +1582,7 @@ static int __net_init fib_net_init(struct net *net) int error; #ifdef CONFIG_IP_ROUTE_CLASSID - net->ipv4.fib_num_tclassid_users = 0; + atomic_set(&net->ipv4.fib_num_tclassid_users, 0); #endif error = ip_fib_net_init(net); if (error < 0) diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c index 364ad3446b2f3c056ea5dafea1542e4d3306ddb6..d279cb8ac1584487885f66819634b421c01bf819 100644 --- a/net/ipv4/fib_rules.c +++ b/net/ipv4/fib_rules.c @@ -264,7 +264,7 @@ static int fib4_rule_configure(struct fib_rule *rule, struct sk_buff *skb, if (tb[FRA_FLOW]) { rule4->tclassid = nla_get_u32(tb[FRA_FLOW]); if (rule4->tclassid) - net->ipv4.fib_num_tclassid_users++; + atomic_inc(&net->ipv4.fib_num_tclassid_users); } #endif @@ -296,7 +296,7 @@ static int fib4_rule_delete(struct fib_rule *rule) #ifdef CONFIG_IP_ROUTE_CLASSID if (((struct fib4_rule *)rule)->tclassid) - net->ipv4.fib_num_tclassid_users--; + atomic_dec(&net->ipv4.fib_num_tclassid_users); #endif net->ipv4.fib_has_custom_rules = true; diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 3364cb9c67e018fea2b2e370046de5252581b996..fde7797b580694bb3924c5c6e9560cf04fd67387 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c @@ -220,7 +220,7 @@ void fib_nh_release(struct net *net, struct fib_nh *fib_nh) { #ifdef CONFIG_IP_ROUTE_CLASSID if (fib_nh->nh_tclassid) - net->ipv4.fib_num_tclassid_users--; + atomic_dec(&net->ipv4.fib_num_tclassid_users); #endif fib_nh_common_release(&fib_nh->nh_common); } @@ -632,7 +632,7 @@ int fib_nh_init(struct net *net, struct fib_nh *nh, #ifdef CONFIG_IP_ROUTE_CLASSID nh->nh_tclassid = cfg->fc_flow; if (nh->nh_tclassid) - net->ipv4.fib_num_tclassid_users++; + atomic_inc(&net->ipv4.fib_num_tclassid_users); #endif #ifdef CONFIG_IP_ROUTE_MULTIPATH nh->fib_nh_weight = nh_weight;