mirror of https://gitee.com/openkylin/linux.git
net/mlx5: Check device capability for maximum flow counters
Added check for the maximal number of flow counters attached
to rule (FTE).
Fixes: bd5251dbf1
('net/mlx5_core: Introduce flow steering destination of type counter')
Signed-off-by: Raed Salem <raeds@mellanox.com>
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
99d3cd27f7
commit
16f1c5bb3e
|
@ -293,6 +293,9 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
|
|||
}
|
||||
|
||||
if (fte->action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
|
||||
int max_list_size = BIT(MLX5_CAP_FLOWTABLE_TYPE(dev,
|
||||
log_max_flow_counter,
|
||||
ft->type));
|
||||
int list_size = 0;
|
||||
|
||||
list_for_each_entry(dst, &fte->node.children, node.list) {
|
||||
|
@ -305,12 +308,17 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
|
|||
in_dests += MLX5_ST_SZ_BYTES(dest_format_struct);
|
||||
list_size++;
|
||||
}
|
||||
if (list_size > max_list_size) {
|
||||
err = -EINVAL;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
MLX5_SET(flow_context, in_flow_context, flow_counter_list_size,
|
||||
list_size);
|
||||
}
|
||||
|
||||
err = mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
|
||||
err_out:
|
||||
kvfree(in);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -52,6 +52,7 @@ enum fs_flow_table_type {
|
|||
FS_FT_FDB = 0X4,
|
||||
FS_FT_SNIFFER_RX = 0X5,
|
||||
FS_FT_SNIFFER_TX = 0X6,
|
||||
FS_FT_MAX_TYPE = FS_FT_SNIFFER_TX,
|
||||
};
|
||||
|
||||
enum fs_flow_table_op_mod {
|
||||
|
@ -260,4 +261,14 @@ void mlx5_cleanup_fs(struct mlx5_core_dev *dev);
|
|||
#define fs_for_each_dst(pos, fte) \
|
||||
fs_list_for_each_entry(pos, &(fte)->node.children)
|
||||
|
||||
#define MLX5_CAP_FLOWTABLE_TYPE(mdev, cap, type) ( \
|
||||
(type == FS_FT_NIC_RX) ? MLX5_CAP_FLOWTABLE_NIC_RX(mdev, cap) : \
|
||||
(type == FS_FT_ESW_EGRESS_ACL) ? MLX5_CAP_ESW_EGRESS_ACL(mdev, cap) : \
|
||||
(type == FS_FT_ESW_INGRESS_ACL) ? MLX5_CAP_ESW_INGRESS_ACL(mdev, cap) : \
|
||||
(type == FS_FT_FDB) ? MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, cap) : \
|
||||
(type == FS_FT_SNIFFER_RX) ? MLX5_CAP_FLOWTABLE_SNIFFER_RX(mdev, cap) : \
|
||||
(type == FS_FT_SNIFFER_TX) ? MLX5_CAP_FLOWTABLE_SNIFFER_TX(mdev, cap) : \
|
||||
(BUILD_BUG_ON_ZERO(FS_FT_SNIFFER_TX != FS_FT_MAX_TYPE))\
|
||||
)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -327,7 +327,8 @@ struct mlx5_ifc_flow_table_prop_layout_bits {
|
|||
u8 reserved_at_80[0x18];
|
||||
u8 log_max_destination[0x8];
|
||||
|
||||
u8 reserved_at_a0[0x18];
|
||||
u8 log_max_flow_counter[0x8];
|
||||
u8 reserved_at_a8[0x10];
|
||||
u8 log_max_flow[0x8];
|
||||
|
||||
u8 reserved_at_c0[0x40];
|
||||
|
|
Loading…
Reference in New Issue