Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16f1c5bb authored by Raed Salem's avatar Raed Salem Committed by Saeed Mahameed
Browse files

net/mlx5: Check device capability for maximum flow counters



Added check for the maximal number of flow counters attached
to rule (FTE).

Fixes: bd5251db ('net/mlx5_core: Introduce flow steering destination of type counter')
Signed-off-by: default avatarRaed Salem <raeds@mellanox.com>
Reviewed-by: default avatarMaor Gottlieb <maorg@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent 99d3cd27
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -293,6 +293,9 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
	}
	}


	if (fte->action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
	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;
		int list_size = 0;


		list_for_each_entry(dst, &fte->node.children, node.list) {
		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);
			in_dests += MLX5_ST_SZ_BYTES(dest_format_struct);
			list_size++;
			list_size++;
		}
		}
		if (list_size > max_list_size) {
			err = -EINVAL;
			goto err_out;
		}


		MLX5_SET(flow_context, in_flow_context, flow_counter_list_size,
		MLX5_SET(flow_context, in_flow_context, flow_counter_list_size,
			 list_size);
			 list_size);
	}
	}


	err = mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
	err = mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
err_out:
	kvfree(in);
	kvfree(in);
	return err;
	return err;
}
}
+11 −0
Original line number Original line Diff line number Diff line
@@ -52,6 +52,7 @@ enum fs_flow_table_type {
	FS_FT_FDB             = 0X4,
	FS_FT_FDB             = 0X4,
	FS_FT_SNIFFER_RX	= 0X5,
	FS_FT_SNIFFER_RX	= 0X5,
	FS_FT_SNIFFER_TX	= 0X6,
	FS_FT_SNIFFER_TX	= 0X6,
	FS_FT_MAX_TYPE = FS_FT_SNIFFER_TX,
};
};


enum fs_flow_table_op_mod {
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)			\
#define fs_for_each_dst(pos, fte)			\
	fs_list_for_each_entry(pos, &(fte)->node.children)
	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
#endif
+2 −1
Original line number Original line Diff line number Diff line
@@ -327,7 +327,8 @@ struct mlx5_ifc_flow_table_prop_layout_bits {
	u8         reserved_at_80[0x18];
	u8         reserved_at_80[0x18];
	u8         log_max_destination[0x8];
	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         log_max_flow[0x8];


	u8         reserved_at_c0[0x40];
	u8         reserved_at_c0[0x40];