net/mlx4_core: Prevent VF from changing port configuration
Added wrapper to the ACCESS_REG command for handling guest HW
registers access, preventing write operations, but do allow reads.
This will prevent SRIOV guests to change port PTYS configuration,
such as speed/advertised link modes.
Fixes: adbc7ac5c1
('net/mlx4_core: Introduce ACCESS_REG CMD [...]')
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d75b1ade56
commit
6e80669998
3 changed files with 35 additions and 2 deletions
|
@ -1345,7 +1345,7 @@ static struct mlx4_cmd_info cmd_info[] = {
|
||||||
.out_is_imm = false,
|
.out_is_imm = false,
|
||||||
.encode_slave_id = false,
|
.encode_slave_id = false,
|
||||||
.verify = NULL,
|
.verify = NULL,
|
||||||
.wrapper = NULL,
|
.wrapper = mlx4_ACCESS_REG_wrapper,
|
||||||
},
|
},
|
||||||
/* Native multicast commands are not available for guests */
|
/* Native multicast commands are not available for guests */
|
||||||
{
|
{
|
||||||
|
|
|
@ -2220,7 +2220,7 @@ static int mlx4_ACCESS_REG(struct mlx4_dev *dev, u16 reg_id,
|
||||||
memcpy(inbuf->reg_data, reg_data, reg_len);
|
memcpy(inbuf->reg_data, reg_data, reg_len);
|
||||||
err = mlx4_cmd_box(dev, inbox->dma, outbox->dma, 0, 0,
|
err = mlx4_cmd_box(dev, inbox->dma, outbox->dma, 0, 0,
|
||||||
MLX4_CMD_ACCESS_REG, MLX4_CMD_TIME_CLASS_C,
|
MLX4_CMD_ACCESS_REG, MLX4_CMD_TIME_CLASS_C,
|
||||||
MLX4_CMD_NATIVE);
|
MLX4_CMD_WRAPPED);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -2263,3 +2263,31 @@ int mlx4_ACCESS_PTYS_REG(struct mlx4_dev *dev,
|
||||||
method, sizeof(*ptys_reg), ptys_reg);
|
method, sizeof(*ptys_reg), ptys_reg);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mlx4_ACCESS_PTYS_REG);
|
EXPORT_SYMBOL_GPL(mlx4_ACCESS_PTYS_REG);
|
||||||
|
|
||||||
|
int mlx4_ACCESS_REG_wrapper(struct mlx4_dev *dev, int slave,
|
||||||
|
struct mlx4_vhcr *vhcr,
|
||||||
|
struct mlx4_cmd_mailbox *inbox,
|
||||||
|
struct mlx4_cmd_mailbox *outbox,
|
||||||
|
struct mlx4_cmd_info *cmd)
|
||||||
|
{
|
||||||
|
struct mlx4_access_reg *inbuf = inbox->buf;
|
||||||
|
u8 method = inbuf->method & MLX4_ACCESS_REG_METHOD_MASK;
|
||||||
|
u16 reg_id = be16_to_cpu(inbuf->reg_id);
|
||||||
|
|
||||||
|
if (slave != mlx4_master_func_num(dev) &&
|
||||||
|
method == MLX4_ACCESS_REG_WRITE)
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
|
if (reg_id == MLX4_REG_ID_PTYS) {
|
||||||
|
struct mlx4_ptys_reg *ptys_reg =
|
||||||
|
(struct mlx4_ptys_reg *)inbuf->reg_data;
|
||||||
|
|
||||||
|
ptys_reg->local_port =
|
||||||
|
mlx4_slave_convert_port(dev, slave,
|
||||||
|
ptys_reg->local_port);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mlx4_cmd_box(dev, inbox->dma, outbox->dma, vhcr->in_modifier,
|
||||||
|
0, MLX4_CMD_ACCESS_REG, MLX4_CMD_TIME_CLASS_C,
|
||||||
|
MLX4_CMD_NATIVE);
|
||||||
|
}
|
||||||
|
|
|
@ -1273,6 +1273,11 @@ int mlx4_QP_FLOW_STEERING_DETACH_wrapper(struct mlx4_dev *dev, int slave,
|
||||||
struct mlx4_cmd_mailbox *inbox,
|
struct mlx4_cmd_mailbox *inbox,
|
||||||
struct mlx4_cmd_mailbox *outbox,
|
struct mlx4_cmd_mailbox *outbox,
|
||||||
struct mlx4_cmd_info *cmd);
|
struct mlx4_cmd_info *cmd);
|
||||||
|
int mlx4_ACCESS_REG_wrapper(struct mlx4_dev *dev, int slave,
|
||||||
|
struct mlx4_vhcr *vhcr,
|
||||||
|
struct mlx4_cmd_mailbox *inbox,
|
||||||
|
struct mlx4_cmd_mailbox *outbox,
|
||||||
|
struct mlx4_cmd_info *cmd);
|
||||||
|
|
||||||
int mlx4_get_mgm_entry_size(struct mlx4_dev *dev);
|
int mlx4_get_mgm_entry_size(struct mlx4_dev *dev);
|
||||||
int mlx4_get_qp_per_mgm(struct mlx4_dev *dev);
|
int mlx4_get_qp_per_mgm(struct mlx4_dev *dev);
|
||||||
|
|
Loading…
Add table
Reference in a new issue