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
>

Reply via email to