Commit ad0724b9 authored by David S. Miller's avatar David S. Miller
Browse files

Merge tag 'mlx5-fixes-2022-05-03' of git://git.kernel.org/pub/scm/linux/kernel/g


it/saeed/linux

Saeed Mahameed says:

====================
mlx5 fixes 2022-05-03

This series provides bug fixes to mlx5 driver.
Please pull and let me know if there is any problem.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 0a806ecc a042d7f5
Loading
Loading
Loading
Loading
+25 −6
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ static const char *const mlx5_rsc_sgmt_name[] = {
struct mlx5_rsc_dump {
	u32 pdn;
	u32 mkey;
	u32 number_of_menu_items;
	u16 fw_segment_type[MLX5_SGMT_TYPE_NUM];
};

@@ -50,21 +51,37 @@ static int mlx5_rsc_dump_sgmt_get_by_name(char *name)
	return -EINVAL;
}

static void mlx5_rsc_dump_read_menu_sgmt(struct mlx5_rsc_dump *rsc_dump, struct page *page)
#define MLX5_RSC_DUMP_MENU_HEADER_SIZE (MLX5_ST_SZ_BYTES(resource_dump_info_segment) + \
					MLX5_ST_SZ_BYTES(resource_dump_command_segment) + \
					MLX5_ST_SZ_BYTES(resource_dump_menu_segment))

static int mlx5_rsc_dump_read_menu_sgmt(struct mlx5_rsc_dump *rsc_dump, struct page *page,
					int read_size, int start_idx)
{
	void *data = page_address(page);
	enum mlx5_sgmt_type sgmt_idx;
	int num_of_items;
	char *sgmt_name;
	void *member;
	int size = 0;
	void *menu;
	int i;

	if (!start_idx) {
		menu = MLX5_ADDR_OF(menu_resource_dump_response, data, menu);
	num_of_items = MLX5_GET(resource_dump_menu_segment, menu, num_of_records);
		rsc_dump->number_of_menu_items = MLX5_GET(resource_dump_menu_segment, menu,
							  num_of_records);
		size = MLX5_RSC_DUMP_MENU_HEADER_SIZE;
		data += size;
	}
	num_of_items = rsc_dump->number_of_menu_items;

	for (i = 0; i < num_of_items; i++) {
		member = MLX5_ADDR_OF(resource_dump_menu_segment, menu, record[i]);
	for (i = 0; start_idx + i < num_of_items; i++) {
		size += MLX5_ST_SZ_BYTES(resource_dump_menu_record);
		if (size >= read_size)
			return start_idx + i;

		member = data + MLX5_ST_SZ_BYTES(resource_dump_menu_record) * i;
		sgmt_name =  MLX5_ADDR_OF(resource_dump_menu_record, member, segment_name);
		sgmt_idx = mlx5_rsc_dump_sgmt_get_by_name(sgmt_name);
		if (sgmt_idx == -EINVAL)
@@ -72,6 +89,7 @@ static void mlx5_rsc_dump_read_menu_sgmt(struct mlx5_rsc_dump *rsc_dump, struct
		rsc_dump->fw_segment_type[sgmt_idx] = MLX5_GET(resource_dump_menu_record,
							       member, segment_type);
	}
	return 0;
}

static int mlx5_rsc_dump_trigger(struct mlx5_core_dev *dev, struct mlx5_rsc_dump_cmd *cmd,
@@ -168,6 +186,7 @@ static int mlx5_rsc_dump_menu(struct mlx5_core_dev *dev)
	struct mlx5_rsc_dump_cmd *cmd = NULL;
	struct mlx5_rsc_key key = {};
	struct page *page;
	int start_idx = 0;
	int size;
	int err;

@@ -189,7 +208,7 @@ static int mlx5_rsc_dump_menu(struct mlx5_core_dev *dev)
		if (err < 0)
			goto destroy_cmd;

		mlx5_rsc_dump_read_menu_sgmt(dev->rsc_dump, page);
		start_idx = mlx5_rsc_dump_read_menu_sgmt(dev->rsc_dump, page, size, start_idx);

	} while (err > 0);

+2 −2
Original line number Diff line number Diff line
@@ -309,8 +309,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
		if (err)
			return err;

		err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer, port_buff_cell_sz,
					  xoff, &port_buffer, &update_buffer);
		err = update_buffer_lossy(max_mtu, curr_pfc_en, prio2buffer, xoff,
					  port_buff_cell_sz, &port_buffer, &update_buffer);
		if (err)
			return err;
	}
+1 −2
Original line number Diff line number Diff line
@@ -145,8 +145,7 @@ mlx5e_tc_act_post_parse(struct mlx5e_tc_act_parse_state *parse_state,

	flow_action_for_each(i, act, flow_action) {
		tc_act = mlx5e_tc_act_get(act->id, ns_type);
		if (!tc_act || !tc_act->post_parse ||
		    !tc_act->can_offload(parse_state, act, i, attr))
		if (!tc_act || !tc_act->post_parse)
			continue;

		err = tc_act->post_parse(parse_state, priv, attr);
+32 −2
Original line number Diff line number Diff line
@@ -45,12 +45,41 @@ tc_act_parse_ct(struct mlx5e_tc_act_parse_state *parse_state,
	if (mlx5e_is_eswitch_flow(parse_state->flow))
		attr->esw_attr->split_count = attr->esw_attr->out_count;

	if (!clear_action) {
	if (clear_action) {
		parse_state->ct_clear = true;
	} else {
		attr->flags |= MLX5_ATTR_FLAG_CT;
		flow_flag_set(parse_state->flow, CT);
		parse_state->ct = true;
	}
	parse_state->ct_clear = clear_action;

	return 0;
}

static int
tc_act_post_parse_ct(struct mlx5e_tc_act_parse_state *parse_state,
		     struct mlx5e_priv *priv,
		     struct mlx5_flow_attr *attr)
{
	struct mlx5e_tc_mod_hdr_acts *mod_acts = &attr->parse_attr->mod_hdr_acts;
	int err;

	/* If ct action exist, we can ignore previous ct_clear actions */
	if (parse_state->ct)
		return 0;

	if (parse_state->ct_clear) {
		err = mlx5_tc_ct_set_ct_clear_regs(parse_state->ct_priv, mod_acts);
		if (err) {
			NL_SET_ERR_MSG_MOD(parse_state->extack,
					   "Failed to set registers for ct clear");
			return err;
		}
		attr->action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;

		/* Prevent handling of additional, redundant clear actions */
		parse_state->ct_clear = false;
	}

	return 0;
}
@@ -70,5 +99,6 @@ struct mlx5e_tc_act mlx5e_tc_act_ct = {
	.can_offload = tc_act_can_offload_ct,
	.parse_action = tc_act_parse_ct,
	.is_multi_table_act = tc_act_is_multi_table_act_ct,
	.post_parse = tc_act_post_parse_ct,
};
+10 −14
Original line number Diff line number Diff line
@@ -582,6 +582,12 @@ mlx5_tc_ct_entry_set_registers(struct mlx5_tc_ct_priv *ct_priv,
	return 0;
}

int mlx5_tc_ct_set_ct_clear_regs(struct mlx5_tc_ct_priv *priv,
				 struct mlx5e_tc_mod_hdr_acts *mod_acts)
{
		return mlx5_tc_ct_entry_set_registers(priv, mod_acts, 0, 0, 0, 0);
}

static int
mlx5_tc_ct_parse_mangle_to_mod_act(struct flow_action_entry *act,
				   char *modact)
@@ -1410,9 +1416,6 @@ mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
			const struct flow_action_entry *act,
			struct netlink_ext_ack *extack)
{
	bool clear_action = act->ct.action & TCA_CT_ACT_CLEAR;
	int err;

	if (!priv) {
		NL_SET_ERR_MSG_MOD(extack,
				   "offload of ct action isn't available");
@@ -1423,17 +1426,6 @@ mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv,
	attr->ct_attr.ct_action = act->ct.action;
	attr->ct_attr.nf_ft = act->ct.flow_table;

	if (!clear_action)
		goto out;

	err = mlx5_tc_ct_entry_set_registers(priv, mod_acts, 0, 0, 0, 0);
	if (err) {
		NL_SET_ERR_MSG_MOD(extack, "Failed to set registers for ct clear");
		return err;
	}
	attr->action |= MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;

out:
	return 0;
}

@@ -1749,6 +1741,8 @@ mlx5_tc_ct_flush_ft_entry(void *ptr, void *arg)
static void
mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft)
{
	struct mlx5e_priv *priv;

	if (!refcount_dec_and_test(&ft->refcount))
		return;

@@ -1758,6 +1752,8 @@ mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft)
	rhashtable_free_and_destroy(&ft->ct_entries_ht,
				    mlx5_tc_ct_flush_ft_entry,
				    ct_priv);
	priv = netdev_priv(ct_priv->netdev);
	flush_workqueue(priv->wq);
	mlx5_tc_ct_free_pre_ct_tables(ft);
	mapping_remove(ct_priv->zone_mapping, ft->zone_restore_id);
	kfree(ft);
Loading