Tue, Oct 08, 2019 at 03:56:14PM CEST, liuhang...@gmail.com wrote: >Before reading the team port list, we need to acquire the RCU read lock. >Also change list_for_each_entry() to list_for_each_entry_rcu(). > >Fixes: 9ed68ca0d90b ("team: add ethtool get_link_ksettings") >Reported-by: Paolo Abeni <pab...@redhat.com> >Signed-off-by: Hangbin Liu <liuhang...@gmail.com> >Acked-by: Paolo Abeni <pab...@redhat.com>
It is not strictly needed a since rtnl is taken, but similar list iteration in team is designed to work without rtnl dependency. Acked-by: Jiri Pirko <j...@mellanox.com> Thanks! >--- > drivers/net/team/team.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > >diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c >index e8089def5a46..cb1d5fe60c31 100644 >--- a/drivers/net/team/team.c >+++ b/drivers/net/team/team.c >@@ -2066,7 +2066,8 @@ static int team_ethtool_get_link_ksettings(struct >net_device *dev, > cmd->base.duplex = DUPLEX_UNKNOWN; > cmd->base.port = PORT_OTHER; > >- list_for_each_entry(port, &team->port_list, list) { >+ rcu_read_lock(); >+ list_for_each_entry_rcu(port, &team->port_list, list) { > if (team_port_txable(port)) { > if (port->state.speed != SPEED_UNKNOWN) > speed += port->state.speed; >@@ -2075,6 +2076,8 @@ static int team_ethtool_get_link_ksettings(struct >net_device *dev, > cmd->base.duplex = port->state.duplex; > } > } >+ rcu_read_unlock(); >+ > cmd->base.speed = speed ? : SPEED_UNKNOWN; > > return 0; >-- >2.19.2 >