mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-14 05:35:21 -04:00
Merge branch 'mlx5-misc-fixes-2025-06-10'
Mark Bloch says: ==================== mlx5 misc fixes 2025-06-10 This patchset includes misc fixes from the team for the mlx5 core and Ethernet drivers. ==================== Link: https://patch.msgid.link/20250610151514.1094735-1-mbloch@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -43,7 +43,6 @@
|
||||
#include "en/fs_ethtool.h"
|
||||
|
||||
#define LANES_UNKNOWN 0
|
||||
#define MAX_LANES 8
|
||||
|
||||
void mlx5e_ethtool_get_drvinfo(struct mlx5e_priv *priv,
|
||||
struct ethtool_drvinfo *drvinfo)
|
||||
@@ -1098,10 +1097,8 @@ static void get_link_properties(struct net_device *netdev,
|
||||
speed = info->speed;
|
||||
lanes = info->lanes;
|
||||
duplex = DUPLEX_FULL;
|
||||
} else if (data_rate_oper) {
|
||||
} else if (data_rate_oper)
|
||||
speed = 100 * data_rate_oper;
|
||||
lanes = MAX_LANES;
|
||||
}
|
||||
|
||||
out:
|
||||
link_ksettings->base.duplex = duplex;
|
||||
|
||||
@@ -2028,9 +2028,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool mlx5_flow_has_geneve_opt(struct mlx5e_tc_flow *flow)
|
||||
static bool mlx5_flow_has_geneve_opt(struct mlx5_flow_spec *spec)
|
||||
{
|
||||
struct mlx5_flow_spec *spec = &flow->attr->parse_attr->spec;
|
||||
void *headers_v = MLX5_ADDR_OF(fte_match_param,
|
||||
spec->match_value,
|
||||
misc_parameters_3);
|
||||
@@ -2069,7 +2068,7 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
|
||||
}
|
||||
complete_all(&flow->del_hw_done);
|
||||
|
||||
if (mlx5_flow_has_geneve_opt(flow))
|
||||
if (mlx5_flow_has_geneve_opt(&attr->parse_attr->spec))
|
||||
mlx5_geneve_tlv_option_del(priv->mdev->geneve);
|
||||
|
||||
if (flow->decap_route)
|
||||
@@ -2574,12 +2573,13 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv,
|
||||
|
||||
err = mlx5e_tc_tun_parse(filter_dev, priv, tmp_spec, f, match_level);
|
||||
if (err) {
|
||||
kvfree(tmp_spec);
|
||||
NL_SET_ERR_MSG_MOD(extack, "Failed to parse tunnel attributes");
|
||||
netdev_warn(priv->netdev, "Failed to parse tunnel attributes");
|
||||
return err;
|
||||
} else {
|
||||
err = mlx5e_tc_set_attr_rx_tun(flow, tmp_spec);
|
||||
}
|
||||
err = mlx5e_tc_set_attr_rx_tun(flow, tmp_spec);
|
||||
if (mlx5_flow_has_geneve_opt(tmp_spec))
|
||||
mlx5_geneve_tlv_option_del(priv->mdev->geneve);
|
||||
kvfree(tmp_spec);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -1295,12 +1295,15 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
|
||||
ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_ECPF, enabled_events);
|
||||
if (ret)
|
||||
goto ecpf_err;
|
||||
if (mlx5_core_ec_sriov_enabled(esw->dev)) {
|
||||
ret = mlx5_eswitch_load_ec_vf_vports(esw, esw->esw_funcs.num_ec_vfs,
|
||||
enabled_events);
|
||||
if (ret)
|
||||
goto ec_vf_err;
|
||||
}
|
||||
}
|
||||
|
||||
/* Enable ECVF vports */
|
||||
if (mlx5_core_ec_sriov_enabled(esw->dev)) {
|
||||
ret = mlx5_eswitch_load_ec_vf_vports(esw,
|
||||
esw->esw_funcs.num_ec_vfs,
|
||||
enabled_events);
|
||||
if (ret)
|
||||
goto ec_vf_err;
|
||||
}
|
||||
|
||||
/* Enable VF vports */
|
||||
@@ -1331,9 +1334,11 @@ void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw)
|
||||
{
|
||||
mlx5_eswitch_unload_vf_vports(esw, esw->esw_funcs.num_vfs);
|
||||
|
||||
if (mlx5_core_ec_sriov_enabled(esw->dev))
|
||||
mlx5_eswitch_unload_ec_vf_vports(esw,
|
||||
esw->esw_funcs.num_ec_vfs);
|
||||
|
||||
if (mlx5_ecpf_vport_exists(esw->dev)) {
|
||||
if (mlx5_core_ec_sriov_enabled(esw->dev))
|
||||
mlx5_eswitch_unload_ec_vf_vports(esw, esw->esw_funcs.num_vfs);
|
||||
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
|
||||
}
|
||||
|
||||
|
||||
@@ -2228,6 +2228,7 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft,
|
||||
struct mlx5_flow_handle *rule;
|
||||
struct match_list *iter;
|
||||
bool take_write = false;
|
||||
bool try_again = false;
|
||||
struct fs_fte *fte;
|
||||
u64 version = 0;
|
||||
int err;
|
||||
@@ -2292,6 +2293,7 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft,
|
||||
nested_down_write_ref_node(&g->node, FS_LOCK_PARENT);
|
||||
|
||||
if (!g->node.active) {
|
||||
try_again = true;
|
||||
up_write_ref_node(&g->node, false);
|
||||
continue;
|
||||
}
|
||||
@@ -2313,7 +2315,8 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft,
|
||||
tree_put_node(&fte->node, false);
|
||||
return rule;
|
||||
}
|
||||
rule = ERR_PTR(-ENOENT);
|
||||
err = try_again ? -EAGAIN : -ENOENT;
|
||||
rule = ERR_PTR(err);
|
||||
out:
|
||||
kmem_cache_free(steering->ftes_cache, fte);
|
||||
return rule;
|
||||
|
||||
@@ -291,7 +291,7 @@ static void free_4k(struct mlx5_core_dev *dev, u64 addr, u32 function)
|
||||
static int alloc_system_page(struct mlx5_core_dev *dev, u32 function)
|
||||
{
|
||||
struct device *device = mlx5_core_dma_dev(dev);
|
||||
int nid = dev_to_node(device);
|
||||
int nid = dev->priv.numa_node;
|
||||
struct page *page;
|
||||
u64 zero_addr = 1;
|
||||
u64 addr;
|
||||
|
||||
@@ -1370,8 +1370,8 @@ mlx5hws_action_create_dest_array(struct mlx5hws_context *ctx,
|
||||
struct mlx5hws_cmd_set_fte_attr fte_attr = {0};
|
||||
struct mlx5hws_cmd_forward_tbl *fw_island;
|
||||
struct mlx5hws_action *action;
|
||||
u32 i /*, packet_reformat_id*/;
|
||||
int ret;
|
||||
int ret, last_dest_idx = -1;
|
||||
u32 i;
|
||||
|
||||
if (num_dest <= 1) {
|
||||
mlx5hws_err(ctx, "Action must have multiple dests\n");
|
||||
@@ -1401,11 +1401,8 @@ mlx5hws_action_create_dest_array(struct mlx5hws_context *ctx,
|
||||
dest_list[i].destination_id = dests[i].dest->dest_obj.obj_id;
|
||||
fte_attr.action_flags |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
|
||||
fte_attr.ignore_flow_level = ignore_flow_level;
|
||||
/* ToDo: In SW steering we have a handling of 'go to WIRE'
|
||||
* destination here by upper layer setting 'is_wire_ft' flag
|
||||
* if the destination is wire.
|
||||
* This is because uplink should be last dest in the list.
|
||||
*/
|
||||
if (dests[i].is_wire_ft)
|
||||
last_dest_idx = i;
|
||||
break;
|
||||
case MLX5HWS_ACTION_TYP_VPORT:
|
||||
dest_list[i].destination_type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
|
||||
@@ -1429,6 +1426,9 @@ mlx5hws_action_create_dest_array(struct mlx5hws_context *ctx,
|
||||
}
|
||||
}
|
||||
|
||||
if (last_dest_idx != -1)
|
||||
swap(dest_list[last_dest_idx], dest_list[num_dest - 1]);
|
||||
|
||||
fte_attr.dests_num = num_dest;
|
||||
fte_attr.dests = dest_list;
|
||||
|
||||
|
||||
@@ -785,6 +785,9 @@ hws_definer_conv_outer(struct mlx5hws_definer_conv_data *cd,
|
||||
HWS_SET_HDR(fc, match_param, IP_PROTOCOL_O,
|
||||
outer_headers.ip_protocol,
|
||||
eth_l3_outer.protocol_next_header);
|
||||
HWS_SET_HDR(fc, match_param, IP_VERSION_O,
|
||||
outer_headers.ip_version,
|
||||
eth_l3_outer.ip_version);
|
||||
HWS_SET_HDR(fc, match_param, IP_TTL_O,
|
||||
outer_headers.ttl_hoplimit,
|
||||
eth_l3_outer.time_to_live_hop_limit);
|
||||
|
||||
@@ -966,6 +966,9 @@ static int mlx5_fs_fte_get_hws_actions(struct mlx5_flow_root_namespace *ns,
|
||||
switch (attr->type) {
|
||||
case MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE:
|
||||
dest_action = mlx5_fs_get_dest_action_ft(fs_ctx, dst);
|
||||
if (dst->dest_attr.ft->flags &
|
||||
MLX5_FLOW_TABLE_UPLINK_VPORT)
|
||||
dest_actions[num_dest_actions].is_wire_ft = true;
|
||||
break;
|
||||
case MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM:
|
||||
dest_action = mlx5_fs_get_dest_action_table_num(fs_ctx,
|
||||
@@ -1357,6 +1360,7 @@ mlx5_cmd_hws_packet_reformat_alloc(struct mlx5_flow_root_namespace *ns,
|
||||
pkt_reformat->fs_hws_action.pr_data = pr_data;
|
||||
}
|
||||
|
||||
mutex_init(&pkt_reformat->fs_hws_action.lock);
|
||||
pkt_reformat->owner = MLX5_FLOW_RESOURCE_OWNER_HWS;
|
||||
pkt_reformat->fs_hws_action.hws_action = hws_action;
|
||||
return 0;
|
||||
@@ -1503,7 +1507,6 @@ static int mlx5_cmd_hws_modify_header_alloc(struct mlx5_flow_root_namespace *ns,
|
||||
err = -ENOMEM;
|
||||
goto release_mh;
|
||||
}
|
||||
mutex_init(&modify_hdr->fs_hws_action.lock);
|
||||
modify_hdr->fs_hws_action.mh_data = mh_data;
|
||||
modify_hdr->fs_hws_action.fs_pool = pool;
|
||||
modify_hdr->owner = MLX5_FLOW_RESOURCE_OWNER_SW;
|
||||
|
||||
@@ -213,6 +213,7 @@ struct mlx5hws_action_dest_attr {
|
||||
struct mlx5hws_action *dest;
|
||||
/* Optional reformat action */
|
||||
struct mlx5hws_action *reformat;
|
||||
bool is_wire_ft;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user