Message ID | 20240718122017.b1051af4e7f7.I68eb9c0f02545b364b79a59f2110f2cf5682a8e2@changeid (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [RFC,1/2] net: bonding: correctly annotate RCU in bond_should_notify_peers() | expand |
Thu, Jul 18, 2024 at 09:20:16PM CEST, johannes@sipsolutions.net wrote: >From: Johannes Berg <johannes.berg@intel.com> > >RCU use in bond_should_notify_peers() looks wrong, since it does >rcu_dereference(), leaves the critical section, and uses the >pointer after that. > >Luckily, it's called either inside a nested RCU critical section >or with the RTNL held. > >Annotate it with rcu_dereference_rtnl() instead, and remove the >inner RCU critical section. > >Signed-off-by: Johannes Berg <johannes.berg@intel.com> Fixes 4cb4f97b7e361745281e843499ba58691112d2f8 perhaps? Patch looks okay. Reviewed-by: Jiri Pirko <jiri@nvidia.com>
On Fri, 2024-07-19 at 11:42 +0200, Jiri Pirko wrote: > Thu, Jul 18, 2024 at 09:20:16PM CEST, johannes@sipsolutions.net wrote: > > From: Johannes Berg <johannes.berg@intel.com> > > > > RCU use in bond_should_notify_peers() looks wrong, since it does > > rcu_dereference(), leaves the critical section, and uses the > > pointer after that. > > > > Luckily, it's called either inside a nested RCU critical section > > or with the RTNL held. > > > > Annotate it with rcu_dereference_rtnl() instead, and remove the > > inner RCU critical section. > > > > Signed-off-by: Johannes Berg <johannes.berg@intel.com> > > Fixes 4cb4f97b7e361745281e843499ba58691112d2f8 perhaps? > I don't really want to get into that discussion again :) Thanks for looking! johannes
Fri, Jul 19, 2024 at 06:31:18PM CEST, johannes@sipsolutions.net wrote: >On Fri, 2024-07-19 at 11:42 +0200, Jiri Pirko wrote: >> Thu, Jul 18, 2024 at 09:20:16PM CEST, johannes@sipsolutions.net wrote: >> > From: Johannes Berg <johannes.berg@intel.com> >> > >> > RCU use in bond_should_notify_peers() looks wrong, since it does >> > rcu_dereference(), leaves the critical section, and uses the >> > pointer after that. >> > >> > Luckily, it's called either inside a nested RCU critical section >> > or with the RTNL held. >> > >> > Annotate it with rcu_dereference_rtnl() instead, and remove the >> > inner RCU critical section. >> > >> > Signed-off-by: Johannes Berg <johannes.berg@intel.com> >> >> Fixes 4cb4f97b7e361745281e843499ba58691112d2f8 perhaps? >> > >I don't really want to get into that discussion again :) Which one? I have to be missing something... > >Thanks for looking! > >johannes
On Tue, 2024-07-23 at 16:22 +0200, Jiri Pirko wrote: > Fri, Jul 19, 2024 at 06:31:18PM CEST, johannes@sipsolutions.net wrote: > > On Fri, 2024-07-19 at 11:42 +0200, Jiri Pirko wrote: > > > Thu, Jul 18, 2024 at 09:20:16PM CEST, johannes@sipsolutions.net wrote: > > > > From: Johannes Berg <johannes.berg@intel.com> > > > > > > > > RCU use in bond_should_notify_peers() looks wrong, since it does > > > > rcu_dereference(), leaves the critical section, and uses the > > > > pointer after that. > > > > > > > > Luckily, it's called either inside a nested RCU critical section > > > > or with the RTNL held. > > > > > > > > Annotate it with rcu_dereference_rtnl() instead, and remove the > > > > inner RCU critical section. > > > > > > > > Signed-off-by: Johannes Berg <johannes.berg@intel.com> > > > > > > Fixes 4cb4f97b7e361745281e843499ba58691112d2f8 perhaps? > > > > > > > I don't really want to get into that discussion again :) > > Which one? I have to be missing something... > The one that we like to repeat all the time about whether a Fixes tag should be included or not, like in https://lore.kernel.org/netdev/20240705134221.2f4de205caa1.I28496dc0f2ced580282d1fb892048017c4491e21@changeid/ johannes
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index d19aabf5d4fb..2ed0da068490 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -1121,13 +1121,10 @@ static struct slave *bond_find_best_slave(struct bonding *bond) return bestslave; } +/* must be called in RCU critical section or with RTNL held */ static bool bond_should_notify_peers(struct bonding *bond) { - struct slave *slave; - - rcu_read_lock(); - slave = rcu_dereference(bond->curr_active_slave); - rcu_read_unlock(); + struct slave *slave = rcu_dereference_rtnl(bond->curr_active_slave); if (!slave || !bond->send_peer_notif || bond->send_peer_notif %