Message ID | 20231013121029.353351-2-jiri@resnulli.us (mailing list archive) |
---|---|
State | Accepted |
Commit | 2034d90ae41ae93e30d492ebcf1f06f97a9cfba6 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | devlink: fix a deadlock when taking devlink instance lock while holding RTNL lock | expand |
On Fri, Oct 13, 2023 at 02:10:23PM +0200, Jiri Pirko wrote: > From: Jiri Pirko <jiri@nvidia.com> > > Make the net pointer stored in possible_net_t structure annotated as > an RCU pointer. Change the access helpers to treat it as such. > Introduce read_pnet_rcu() helper to allow caller to dereference > the net pointer under RCU read lock. > > Signed-off-by: Jiri Pirko <jiri@nvidia.com> Reviewed-by: Simon Horman <horms@kernel.org>
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index eb6cd43b1746..13b3a4e29fdb 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -368,21 +368,30 @@ static inline void put_net_track(struct net *net, netns_tracker *tracker) typedef struct { #ifdef CONFIG_NET_NS - struct net *net; + struct net __rcu *net; #endif } possible_net_t; static inline void write_pnet(possible_net_t *pnet, struct net *net) { #ifdef CONFIG_NET_NS - pnet->net = net; + rcu_assign_pointer(pnet->net, net); #endif } static inline struct net *read_pnet(const possible_net_t *pnet) { #ifdef CONFIG_NET_NS - return pnet->net; + return rcu_dereference_protected(pnet->net, true); +#else + return &init_net; +#endif +} + +static inline struct net *read_pnet_rcu(possible_net_t *pnet) +{ +#ifdef CONFIG_NET_NS + return rcu_dereference(pnet->net); #else return &init_net; #endif