mirror of https://gitee.com/openkylin/linux.git
net/mlx4_core: Protect port type setting by mutex
We need to protect set_port_type() for concurrency, as the sysfs code could call it from mutliple contexts in parallel. The port_mutex is not enough because we need to protect from concurrent modification of 'info' and stopping of the port sensing work. Signed-off-by: Amir Vadai <amirv@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6e80669998
commit
0a98455666
|
@ -901,9 +901,12 @@ static ssize_t set_port_type(struct device *dev,
|
||||||
struct mlx4_priv *priv = mlx4_priv(mdev);
|
struct mlx4_priv *priv = mlx4_priv(mdev);
|
||||||
enum mlx4_port_type types[MLX4_MAX_PORTS];
|
enum mlx4_port_type types[MLX4_MAX_PORTS];
|
||||||
enum mlx4_port_type new_types[MLX4_MAX_PORTS];
|
enum mlx4_port_type new_types[MLX4_MAX_PORTS];
|
||||||
|
static DEFINE_MUTEX(set_port_type_mutex);
|
||||||
int i;
|
int i;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
mutex_lock(&set_port_type_mutex);
|
||||||
|
|
||||||
if (!strcmp(buf, "ib\n"))
|
if (!strcmp(buf, "ib\n"))
|
||||||
info->tmp_type = MLX4_PORT_TYPE_IB;
|
info->tmp_type = MLX4_PORT_TYPE_IB;
|
||||||
else if (!strcmp(buf, "eth\n"))
|
else if (!strcmp(buf, "eth\n"))
|
||||||
|
@ -912,7 +915,8 @@ static ssize_t set_port_type(struct device *dev,
|
||||||
info->tmp_type = MLX4_PORT_TYPE_AUTO;
|
info->tmp_type = MLX4_PORT_TYPE_AUTO;
|
||||||
else {
|
else {
|
||||||
mlx4_err(mdev, "%s is not supported port type\n", buf);
|
mlx4_err(mdev, "%s is not supported port type\n", buf);
|
||||||
return -EINVAL;
|
err = -EINVAL;
|
||||||
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
mlx4_stop_sense(mdev);
|
mlx4_stop_sense(mdev);
|
||||||
|
@ -958,6 +962,9 @@ static ssize_t set_port_type(struct device *dev,
|
||||||
out:
|
out:
|
||||||
mlx4_start_sense(mdev);
|
mlx4_start_sense(mdev);
|
||||||
mutex_unlock(&priv->port_mutex);
|
mutex_unlock(&priv->port_mutex);
|
||||||
|
err_out:
|
||||||
|
mutex_unlock(&set_port_type_mutex);
|
||||||
|
|
||||||
return err ? err : count;
|
return err ? err : count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue