net/mlx5: Don't store reserved part in FTEs and FGs
The current code stores fte_match_param in the software representation of FTEs and FGs. fte_match_param contains a large reserved area at the bottom of the struct. Since downstream patches are going to hash this part, we would like to avoid doing so on a reserved part. Signed-off-by: Matan Barak <matanb@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
Родитель
8ebabaa02f
Коммит
667cb65ae5
|
@ -263,7 +263,7 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
|
||||||
MLX5_SET(flow_context, in_flow_context, modify_header_id, fte->modify_id);
|
MLX5_SET(flow_context, in_flow_context, modify_header_id, fte->modify_id);
|
||||||
in_match_value = MLX5_ADDR_OF(flow_context, in_flow_context,
|
in_match_value = MLX5_ADDR_OF(flow_context, in_flow_context,
|
||||||
match_value);
|
match_value);
|
||||||
memcpy(in_match_value, &fte->val, MLX5_ST_SZ_BYTES(fte_match_param));
|
memcpy(in_match_value, &fte->val, sizeof(fte->val));
|
||||||
|
|
||||||
in_dests = MLX5_ADDR_OF(flow_context, in_flow_context, destination);
|
in_dests = MLX5_ADDR_OF(flow_context, in_flow_context, destination);
|
||||||
if (fte->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
|
if (fte->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
|
||||||
|
|
|
@ -371,21 +371,14 @@ static void del_rule(struct fs_node *node)
|
||||||
struct mlx5_flow_table *ft;
|
struct mlx5_flow_table *ft;
|
||||||
struct mlx5_flow_group *fg;
|
struct mlx5_flow_group *fg;
|
||||||
struct fs_fte *fte;
|
struct fs_fte *fte;
|
||||||
u32 *match_value;
|
|
||||||
int modify_mask;
|
int modify_mask;
|
||||||
struct mlx5_core_dev *dev = get_dev(node);
|
struct mlx5_core_dev *dev = get_dev(node);
|
||||||
int match_len = MLX5_ST_SZ_BYTES(fte_match_param);
|
|
||||||
int err;
|
int err;
|
||||||
bool update_fte = false;
|
bool update_fte = false;
|
||||||
|
|
||||||
match_value = kvzalloc(match_len, GFP_KERNEL);
|
|
||||||
if (!match_value)
|
|
||||||
return;
|
|
||||||
|
|
||||||
fs_get_obj(rule, node);
|
fs_get_obj(rule, node);
|
||||||
fs_get_obj(fte, rule->node.parent);
|
fs_get_obj(fte, rule->node.parent);
|
||||||
fs_get_obj(fg, fte->node.parent);
|
fs_get_obj(fg, fte->node.parent);
|
||||||
memcpy(match_value, fte->val, sizeof(fte->val));
|
|
||||||
fs_get_obj(ft, fg->node.parent);
|
fs_get_obj(ft, fg->node.parent);
|
||||||
list_del(&rule->node.list);
|
list_del(&rule->node.list);
|
||||||
if (rule->sw_action == MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO) {
|
if (rule->sw_action == MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO) {
|
||||||
|
@ -415,7 +408,6 @@ out:
|
||||||
"%s can't del rule fg id=%d fte_index=%d\n",
|
"%s can't del rule fg id=%d fte_index=%d\n",
|
||||||
__func__, fg->id, fte->index);
|
__func__, fg->id, fte->index);
|
||||||
}
|
}
|
||||||
kvfree(match_value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void del_fte(struct fs_node *node)
|
static void del_fte(struct fs_node *node)
|
||||||
|
|
|
@ -144,10 +144,22 @@ struct mlx5_fc {
|
||||||
struct mlx5_fc_cache cache ____cacheline_aligned_in_smp;
|
struct mlx5_fc_cache cache ____cacheline_aligned_in_smp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MLX5_FTE_MATCH_PARAM_RESERVED reserved_at_600
|
||||||
|
/* Calculate the fte_match_param length and without the reserved length.
|
||||||
|
* Make sure the reserved field is the last.
|
||||||
|
*/
|
||||||
|
#define MLX5_ST_SZ_DW_MATCH_PARAM \
|
||||||
|
((MLX5_BYTE_OFF(fte_match_param, MLX5_FTE_MATCH_PARAM_RESERVED) / sizeof(u32)) + \
|
||||||
|
BUILD_BUG_ON_ZERO(MLX5_ST_SZ_BYTES(fte_match_param) != \
|
||||||
|
MLX5_FLD_SZ_BYTES(fte_match_param, \
|
||||||
|
MLX5_FTE_MATCH_PARAM_RESERVED) +\
|
||||||
|
MLX5_BYTE_OFF(fte_match_param, \
|
||||||
|
MLX5_FTE_MATCH_PARAM_RESERVED)))
|
||||||
|
|
||||||
/* Type of children is mlx5_flow_rule */
|
/* Type of children is mlx5_flow_rule */
|
||||||
struct fs_fte {
|
struct fs_fte {
|
||||||
struct fs_node node;
|
struct fs_node node;
|
||||||
u32 val[MLX5_ST_SZ_DW(fte_match_param)];
|
u32 val[MLX5_ST_SZ_DW_MATCH_PARAM];
|
||||||
u32 dests_size;
|
u32 dests_size;
|
||||||
u32 flow_tag;
|
u32 flow_tag;
|
||||||
u32 index;
|
u32 index;
|
||||||
|
@ -175,7 +187,7 @@ struct mlx5_flow_namespace {
|
||||||
|
|
||||||
struct mlx5_flow_group_mask {
|
struct mlx5_flow_group_mask {
|
||||||
u8 match_criteria_enable;
|
u8 match_criteria_enable;
|
||||||
u32 match_criteria[MLX5_ST_SZ_DW(fte_match_param)];
|
u32 match_criteria[MLX5_ST_SZ_DW_MATCH_PARAM];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Type of children is fs_fte */
|
/* Type of children is fs_fte */
|
||||||
|
|
|
@ -48,7 +48,7 @@
|
||||||
/* helper macros */
|
/* helper macros */
|
||||||
#define __mlx5_nullp(typ) ((struct mlx5_ifc_##typ##_bits *)0)
|
#define __mlx5_nullp(typ) ((struct mlx5_ifc_##typ##_bits *)0)
|
||||||
#define __mlx5_bit_sz(typ, fld) sizeof(__mlx5_nullp(typ)->fld)
|
#define __mlx5_bit_sz(typ, fld) sizeof(__mlx5_nullp(typ)->fld)
|
||||||
#define __mlx5_bit_off(typ, fld) ((unsigned)(unsigned long)(&(__mlx5_nullp(typ)->fld)))
|
#define __mlx5_bit_off(typ, fld) (offsetof(struct mlx5_ifc_##typ##_bits, fld))
|
||||||
#define __mlx5_dw_off(typ, fld) (__mlx5_bit_off(typ, fld) / 32)
|
#define __mlx5_dw_off(typ, fld) (__mlx5_bit_off(typ, fld) / 32)
|
||||||
#define __mlx5_64_off(typ, fld) (__mlx5_bit_off(typ, fld) / 64)
|
#define __mlx5_64_off(typ, fld) (__mlx5_bit_off(typ, fld) / 64)
|
||||||
#define __mlx5_dw_bit_off(typ, fld) (32 - __mlx5_bit_sz(typ, fld) - (__mlx5_bit_off(typ, fld) & 0x1f))
|
#define __mlx5_dw_bit_off(typ, fld) (32 - __mlx5_bit_sz(typ, fld) - (__mlx5_bit_off(typ, fld) & 0x1f))
|
||||||
|
|
Загрузка…
Ссылка в новой задаче