OSDN Git Service

net/mlx5: Fix sleep while atomic in mlx5_eswitch_get_vepa
authorHuy Nguyen <huyn@mellanox.com>
Mon, 3 Feb 2020 22:32:18 +0000 (16:32 -0600)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 19 Feb 2020 03:01:18 +0000 (19:01 -0800)
rtnl_bridge_getlink is protected by rcu lock, so mlx5_eswitch_get_vepa
cannot take mutex lock. Two possible issues can happen:
1. User at the same time change vepa mode via RTM_SETLINK command.
2. User at the same time change the switchdev mode via devlink netlink
interface.

Case 1 cannot happen because rtnl executes one message in order.
Case 2 can happen but we do not expect user to change the switchdev mode
when changing vepa. Even if a user does it, so he will read a value
which is no longer valid.

Fixes: 8da202b24913 ("net/mlx5: E-Switch, Add support for VEPA in legacy mode.")
Signed-off-by: Huy Nguyen <huyn@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c

index 5acf60b..564d426 100644 (file)
@@ -2452,25 +2452,17 @@ out:
 
 int mlx5_eswitch_get_vepa(struct mlx5_eswitch *esw, u8 *setting)
 {
-       int err = 0;
-
        if (!esw)
                return -EOPNOTSUPP;
 
        if (!ESW_ALLOWED(esw))
                return -EPERM;
 
-       mutex_lock(&esw->state_lock);
-       if (esw->mode != MLX5_ESWITCH_LEGACY) {
-               err = -EOPNOTSUPP;
-               goto out;
-       }
+       if (esw->mode != MLX5_ESWITCH_LEGACY)
+               return -EOPNOTSUPP;
 
        *setting = esw->fdb_table.legacy.vepa_uplink_rule ? 1 : 0;
-
-out:
-       mutex_unlock(&esw->state_lock);
-       return err;
+       return 0;
 }
 
 int mlx5_eswitch_set_vport_trust(struct mlx5_eswitch *esw,