mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 15:03:52 +08:00
Merge branch 'mlx5-misc-fixes-2025-03-10'
Tariq Toukan says: ==================== mlx5 misc fixes 2025-03-10 This patchset provides misc bug fixes from the team to the mlx5 core and Eth drivers. ==================== Link: https://patch.msgid.link/1741644104-97767-1-git-send-email-tariqt@nvidia.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
@@ -48,15 +48,10 @@ mlx5_esw_bridge_lag_rep_get(struct net_device *dev, struct mlx5_eswitch *esw)
|
||||
struct list_head *iter;
|
||||
|
||||
netdev_for_each_lower_dev(dev, lower, iter) {
|
||||
struct mlx5_core_dev *mdev;
|
||||
struct mlx5e_priv *priv;
|
||||
|
||||
if (!mlx5e_eswitch_rep(lower))
|
||||
continue;
|
||||
|
||||
priv = netdev_priv(lower);
|
||||
mdev = priv->mdev;
|
||||
if (mlx5_lag_is_shared_fdb(mdev) && mlx5_esw_bridge_dev_same_esw(lower, esw))
|
||||
if (mlx5_esw_bridge_dev_same_esw(lower, esw))
|
||||
return lower;
|
||||
}
|
||||
|
||||
@@ -125,7 +120,7 @@ static bool mlx5_esw_bridge_is_local(struct net_device *dev, struct net_device *
|
||||
priv = netdev_priv(rep);
|
||||
mdev = priv->mdev;
|
||||
if (netif_is_lag_master(dev))
|
||||
return mlx5_lag_is_shared_fdb(mdev) && mlx5_lag_is_master(mdev);
|
||||
return mlx5_lag_is_master(mdev);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -455,6 +450,9 @@ static int mlx5_esw_bridge_switchdev_event(struct notifier_block *nb,
|
||||
if (!rep)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (netif_is_lag_master(dev) && !mlx5_lag_is_shared_fdb(esw->dev))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
switch (event) {
|
||||
case SWITCHDEV_FDB_ADD_TO_BRIDGE:
|
||||
fdb_info = container_of(info,
|
||||
|
||||
@@ -5132,11 +5132,9 @@ static int mlx5e_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
u8 mode, setting;
|
||||
int err;
|
||||
|
||||
err = mlx5_eswitch_get_vepa(mdev->priv.eswitch, &setting);
|
||||
if (err)
|
||||
return err;
|
||||
if (mlx5_eswitch_get_vepa(mdev->priv.eswitch, &setting))
|
||||
return -EOPNOTSUPP;
|
||||
mode = setting ? BRIDGE_MODE_VEPA : BRIDGE_MODE_VEB;
|
||||
return ndo_dflt_bridge_getlink(skb, pid, seq, dev,
|
||||
mode,
|
||||
|
||||
@@ -871,8 +871,8 @@ static void comp_irq_release_sf(struct mlx5_core_dev *dev, u16 vecidx)
|
||||
|
||||
static int comp_irq_request_sf(struct mlx5_core_dev *dev, u16 vecidx)
|
||||
{
|
||||
struct mlx5_irq_pool *pool = mlx5_irq_table_get_comp_irq_pool(dev);
|
||||
struct mlx5_eq_table *table = dev->priv.eq_table;
|
||||
struct mlx5_irq_pool *pool = mlx5_irq_pool_get(dev);
|
||||
struct irq_affinity_desc af_desc = {};
|
||||
struct mlx5_irq *irq;
|
||||
|
||||
|
||||
@@ -175,7 +175,7 @@ unlock:
|
||||
|
||||
void mlx5_irq_affinity_irq_release(struct mlx5_core_dev *dev, struct mlx5_irq *irq)
|
||||
{
|
||||
struct mlx5_irq_pool *pool = mlx5_irq_pool_get(dev);
|
||||
struct mlx5_irq_pool *pool = mlx5_irq_get_pool(irq);
|
||||
int cpu;
|
||||
|
||||
cpu = cpumask_first(mlx5_irq_get_affinity_mask(irq));
|
||||
|
||||
@@ -951,7 +951,7 @@ void mlx5_disable_lag(struct mlx5_lag *ldev)
|
||||
mlx5_eswitch_reload_ib_reps(ldev->pf[i].dev->priv.eswitch);
|
||||
}
|
||||
|
||||
static bool mlx5_shared_fdb_supported(struct mlx5_lag *ldev)
|
||||
bool mlx5_lag_shared_fdb_supported(struct mlx5_lag *ldev)
|
||||
{
|
||||
int idx = mlx5_lag_get_dev_index_by_seq(ldev, MLX5_LAG_P1);
|
||||
struct mlx5_core_dev *dev;
|
||||
@@ -1038,7 +1038,7 @@ static void mlx5_do_bond(struct mlx5_lag *ldev)
|
||||
}
|
||||
|
||||
if (do_bond && !__mlx5_lag_is_active(ldev)) {
|
||||
bool shared_fdb = mlx5_shared_fdb_supported(ldev);
|
||||
bool shared_fdb = mlx5_lag_shared_fdb_supported(ldev);
|
||||
|
||||
roce_lag = mlx5_lag_is_roce_lag(ldev);
|
||||
|
||||
|
||||
@@ -92,6 +92,7 @@ mlx5_lag_is_ready(struct mlx5_lag *ldev)
|
||||
return test_bit(MLX5_LAG_FLAG_NDEVS_READY, &ldev->state_flags);
|
||||
}
|
||||
|
||||
bool mlx5_lag_shared_fdb_supported(struct mlx5_lag *ldev);
|
||||
bool mlx5_lag_check_prereq(struct mlx5_lag *ldev);
|
||||
void mlx5_modify_lag(struct mlx5_lag *ldev,
|
||||
struct lag_tracker *tracker);
|
||||
|
||||
@@ -83,7 +83,8 @@ static int enable_mpesw(struct mlx5_lag *ldev)
|
||||
if (mlx5_eswitch_mode(dev0) != MLX5_ESWITCH_OFFLOADS ||
|
||||
!MLX5_CAP_PORT_SELECTION(dev0, port_select_flow_table) ||
|
||||
!MLX5_CAP_GEN(dev0, create_lag_when_not_master_up) ||
|
||||
!mlx5_lag_check_prereq(ldev))
|
||||
!mlx5_lag_check_prereq(ldev) ||
|
||||
!mlx5_lag_shared_fdb_supported(ldev))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = mlx5_mpesw_metadata_set(ldev);
|
||||
|
||||
@@ -10,12 +10,15 @@
|
||||
|
||||
struct mlx5_irq;
|
||||
struct cpu_rmap;
|
||||
struct mlx5_irq_pool;
|
||||
|
||||
int mlx5_irq_table_init(struct mlx5_core_dev *dev);
|
||||
void mlx5_irq_table_cleanup(struct mlx5_core_dev *dev);
|
||||
int mlx5_irq_table_create(struct mlx5_core_dev *dev);
|
||||
void mlx5_irq_table_destroy(struct mlx5_core_dev *dev);
|
||||
void mlx5_irq_table_free_irqs(struct mlx5_core_dev *dev);
|
||||
struct mlx5_irq_pool *
|
||||
mlx5_irq_table_get_comp_irq_pool(struct mlx5_core_dev *dev);
|
||||
int mlx5_irq_table_get_num_comp(struct mlx5_irq_table *table);
|
||||
int mlx5_irq_table_get_sfs_vec(struct mlx5_irq_table *table);
|
||||
struct mlx5_irq_table *mlx5_irq_table_get(struct mlx5_core_dev *dev);
|
||||
@@ -38,7 +41,6 @@ struct cpumask *mlx5_irq_get_affinity_mask(struct mlx5_irq *irq);
|
||||
int mlx5_irq_get_index(struct mlx5_irq *irq);
|
||||
int mlx5_irq_get_irq(const struct mlx5_irq *irq);
|
||||
|
||||
struct mlx5_irq_pool;
|
||||
#ifdef CONFIG_MLX5_SF
|
||||
struct mlx5_irq *mlx5_irq_affinity_irq_request_auto(struct mlx5_core_dev *dev,
|
||||
struct cpumask *used_cpus, u16 vecidx);
|
||||
|
||||
@@ -378,6 +378,11 @@ int mlx5_irq_get_index(struct mlx5_irq *irq)
|
||||
return irq->map.index;
|
||||
}
|
||||
|
||||
struct mlx5_irq_pool *mlx5_irq_get_pool(struct mlx5_irq *irq)
|
||||
{
|
||||
return irq->pool;
|
||||
}
|
||||
|
||||
/* irq_pool API */
|
||||
|
||||
/* requesting an irq from a given pool according to given index */
|
||||
@@ -405,18 +410,20 @@ static struct mlx5_irq_pool *sf_ctrl_irq_pool_get(struct mlx5_irq_table *irq_tab
|
||||
return irq_table->sf_ctrl_pool;
|
||||
}
|
||||
|
||||
static struct mlx5_irq_pool *sf_irq_pool_get(struct mlx5_irq_table *irq_table)
|
||||
static struct mlx5_irq_pool *
|
||||
sf_comp_irq_pool_get(struct mlx5_irq_table *irq_table)
|
||||
{
|
||||
return irq_table->sf_comp_pool;
|
||||
}
|
||||
|
||||
struct mlx5_irq_pool *mlx5_irq_pool_get(struct mlx5_core_dev *dev)
|
||||
struct mlx5_irq_pool *
|
||||
mlx5_irq_table_get_comp_irq_pool(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_irq_table *irq_table = mlx5_irq_table_get(dev);
|
||||
struct mlx5_irq_pool *pool = NULL;
|
||||
|
||||
if (mlx5_core_is_sf(dev))
|
||||
pool = sf_irq_pool_get(irq_table);
|
||||
pool = sf_comp_irq_pool_get(irq_table);
|
||||
|
||||
/* In some configs, there won't be a pool of SFs IRQs. Hence, returning
|
||||
* the PF IRQs pool in case the SF pool doesn't exist.
|
||||
|
||||
@@ -28,7 +28,6 @@ struct mlx5_irq_pool {
|
||||
struct mlx5_core_dev *dev;
|
||||
};
|
||||
|
||||
struct mlx5_irq_pool *mlx5_irq_pool_get(struct mlx5_core_dev *dev);
|
||||
static inline bool mlx5_irq_pool_is_sf_pool(struct mlx5_irq_pool *pool)
|
||||
{
|
||||
return !strncmp("mlx5_sf", pool->name, strlen("mlx5_sf"));
|
||||
@@ -40,5 +39,6 @@ struct mlx5_irq *mlx5_irq_alloc(struct mlx5_irq_pool *pool, int i,
|
||||
int mlx5_irq_get_locked(struct mlx5_irq *irq);
|
||||
int mlx5_irq_read_locked(struct mlx5_irq *irq);
|
||||
int mlx5_irq_put(struct mlx5_irq *irq);
|
||||
struct mlx5_irq_pool *mlx5_irq_get_pool(struct mlx5_irq *irq);
|
||||
|
||||
#endif /* __PCI_IRQ_H__ */
|
||||
|
||||
@@ -24,8 +24,8 @@ struct mlx5hws_bwc_matcher {
|
||||
struct mlx5hws_matcher *matcher;
|
||||
struct mlx5hws_match_template *mt;
|
||||
struct mlx5hws_action_template *at[MLX5HWS_BWC_MATCHER_ATTACH_AT_NUM];
|
||||
u32 priority;
|
||||
u8 num_of_at;
|
||||
u16 priority;
|
||||
u8 size_log;
|
||||
atomic_t num_of_rules;
|
||||
struct list_head *rules;
|
||||
|
||||
@@ -210,6 +210,10 @@ struct mlx5dr_ste_ctx {
|
||||
void (*set_encap_l3)(u8 *hw_ste_p, u8 *frst_s_action,
|
||||
u8 *scnd_d_action, u32 reformat_id,
|
||||
int size);
|
||||
void (*set_insert_hdr)(u8 *hw_ste_p, u8 *d_action, u32 reformat_id,
|
||||
u8 anchor, u8 offset, int size);
|
||||
void (*set_remove_hdr)(u8 *hw_ste_p, u8 *s_action, u8 anchor,
|
||||
u8 offset, int size);
|
||||
/* Send */
|
||||
void (*prepare_for_postsend)(u8 *hw_ste_p, u32 ste_size);
|
||||
};
|
||||
|
||||
@@ -266,10 +266,10 @@ void dr_ste_v1_set_encap(u8 *hw_ste_p, u8 *d_action, u32 reformat_id, int size)
|
||||
dr_ste_v1_set_reparse(hw_ste_p);
|
||||
}
|
||||
|
||||
static void dr_ste_v1_set_insert_hdr(u8 *hw_ste_p, u8 *d_action,
|
||||
u32 reformat_id,
|
||||
u8 anchor, u8 offset,
|
||||
int size)
|
||||
void dr_ste_v1_set_insert_hdr(u8 *hw_ste_p, u8 *d_action,
|
||||
u32 reformat_id,
|
||||
u8 anchor, u8 offset,
|
||||
int size)
|
||||
{
|
||||
MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action,
|
||||
action_id, DR_STE_V1_ACTION_ID_INSERT_POINTER);
|
||||
@@ -286,9 +286,9 @@ static void dr_ste_v1_set_insert_hdr(u8 *hw_ste_p, u8 *d_action,
|
||||
dr_ste_v1_set_reparse(hw_ste_p);
|
||||
}
|
||||
|
||||
static void dr_ste_v1_set_remove_hdr(u8 *hw_ste_p, u8 *s_action,
|
||||
u8 anchor, u8 offset,
|
||||
int size)
|
||||
void dr_ste_v1_set_remove_hdr(u8 *hw_ste_p, u8 *s_action,
|
||||
u8 anchor, u8 offset,
|
||||
int size)
|
||||
{
|
||||
MLX5_SET(ste_single_action_remove_header_size_v1, s_action,
|
||||
action_id, DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE);
|
||||
@@ -584,11 +584,11 @@ void dr_ste_v1_set_actions_tx(struct mlx5dr_ste_ctx *ste_ctx,
|
||||
action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action);
|
||||
action_sz = DR_STE_ACTION_TRIPLE_SZ;
|
||||
}
|
||||
dr_ste_v1_set_insert_hdr(last_ste, action,
|
||||
attr->reformat.id,
|
||||
attr->reformat.param_0,
|
||||
attr->reformat.param_1,
|
||||
attr->reformat.size);
|
||||
ste_ctx->set_insert_hdr(last_ste, action,
|
||||
attr->reformat.id,
|
||||
attr->reformat.param_0,
|
||||
attr->reformat.param_1,
|
||||
attr->reformat.size);
|
||||
action_sz -= DR_STE_ACTION_DOUBLE_SZ;
|
||||
action += DR_STE_ACTION_DOUBLE_SZ;
|
||||
} else if (action_type_set[DR_ACTION_TYP_REMOVE_HDR]) {
|
||||
@@ -597,10 +597,10 @@ void dr_ste_v1_set_actions_tx(struct mlx5dr_ste_ctx *ste_ctx,
|
||||
action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action);
|
||||
action_sz = DR_STE_ACTION_TRIPLE_SZ;
|
||||
}
|
||||
dr_ste_v1_set_remove_hdr(last_ste, action,
|
||||
attr->reformat.param_0,
|
||||
attr->reformat.param_1,
|
||||
attr->reformat.size);
|
||||
ste_ctx->set_remove_hdr(last_ste, action,
|
||||
attr->reformat.param_0,
|
||||
attr->reformat.param_1,
|
||||
attr->reformat.size);
|
||||
action_sz -= DR_STE_ACTION_SINGLE_SZ;
|
||||
action += DR_STE_ACTION_SINGLE_SZ;
|
||||
}
|
||||
@@ -792,11 +792,11 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_ste_ctx *ste_ctx,
|
||||
action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action);
|
||||
action_sz = DR_STE_ACTION_TRIPLE_SZ;
|
||||
}
|
||||
dr_ste_v1_set_insert_hdr(last_ste, action,
|
||||
attr->reformat.id,
|
||||
attr->reformat.param_0,
|
||||
attr->reformat.param_1,
|
||||
attr->reformat.size);
|
||||
ste_ctx->set_insert_hdr(last_ste, action,
|
||||
attr->reformat.id,
|
||||
attr->reformat.param_0,
|
||||
attr->reformat.param_1,
|
||||
attr->reformat.size);
|
||||
action_sz -= DR_STE_ACTION_DOUBLE_SZ;
|
||||
action += DR_STE_ACTION_DOUBLE_SZ;
|
||||
allow_modify_hdr = false;
|
||||
@@ -808,10 +808,10 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_ste_ctx *ste_ctx,
|
||||
allow_modify_hdr = true;
|
||||
allow_ctr = true;
|
||||
}
|
||||
dr_ste_v1_set_remove_hdr(last_ste, action,
|
||||
attr->reformat.param_0,
|
||||
attr->reformat.param_1,
|
||||
attr->reformat.size);
|
||||
ste_ctx->set_remove_hdr(last_ste, action,
|
||||
attr->reformat.param_0,
|
||||
attr->reformat.param_1,
|
||||
attr->reformat.size);
|
||||
action_sz -= DR_STE_ACTION_SINGLE_SZ;
|
||||
action += DR_STE_ACTION_SINGLE_SZ;
|
||||
}
|
||||
@@ -2200,6 +2200,8 @@ static struct mlx5dr_ste_ctx ste_ctx_v1 = {
|
||||
.set_pop_vlan = &dr_ste_v1_set_pop_vlan,
|
||||
.set_rx_decap = &dr_ste_v1_set_rx_decap,
|
||||
.set_encap_l3 = &dr_ste_v1_set_encap_l3,
|
||||
.set_insert_hdr = &dr_ste_v1_set_insert_hdr,
|
||||
.set_remove_hdr = &dr_ste_v1_set_remove_hdr,
|
||||
/* Send */
|
||||
.prepare_for_postsend = &dr_ste_v1_prepare_for_postsend,
|
||||
};
|
||||
|
||||
@@ -156,6 +156,10 @@ void dr_ste_v1_set_pop_vlan(u8 *hw_ste_p, u8 *s_action, u8 vlans_num);
|
||||
void dr_ste_v1_set_encap_l3(u8 *hw_ste_p, u8 *frst_s_action, u8 *scnd_d_action,
|
||||
u32 reformat_id, int size);
|
||||
void dr_ste_v1_set_rx_decap(u8 *hw_ste_p, u8 *s_action);
|
||||
void dr_ste_v1_set_insert_hdr(u8 *hw_ste_p, u8 *d_action, u32 reformat_id,
|
||||
u8 anchor, u8 offset, int size);
|
||||
void dr_ste_v1_set_remove_hdr(u8 *hw_ste_p, u8 *s_action, u8 anchor,
|
||||
u8 offset, int size);
|
||||
void dr_ste_v1_set_actions_tx(struct mlx5dr_ste_ctx *ste_ctx, struct mlx5dr_domain *dmn,
|
||||
u8 *action_type_set, u32 actions_caps, u8 *last_ste,
|
||||
struct mlx5dr_ste_actions_attr *attr, u32 *added_stes);
|
||||
|
||||
@@ -69,6 +69,8 @@ static struct mlx5dr_ste_ctx ste_ctx_v2 = {
|
||||
.set_pop_vlan = &dr_ste_v1_set_pop_vlan,
|
||||
.set_rx_decap = &dr_ste_v1_set_rx_decap,
|
||||
.set_encap_l3 = &dr_ste_v1_set_encap_l3,
|
||||
.set_insert_hdr = &dr_ste_v1_set_insert_hdr,
|
||||
.set_remove_hdr = &dr_ste_v1_set_remove_hdr,
|
||||
/* Send */
|
||||
.prepare_for_postsend = &dr_ste_v1_prepare_for_postsend,
|
||||
};
|
||||
|
||||
@@ -79,6 +79,46 @@ static void dr_ste_v3_set_rx_decap(u8 *hw_ste_p, u8 *s_action)
|
||||
dr_ste_v1_set_reparse(hw_ste_p);
|
||||
}
|
||||
|
||||
static void dr_ste_v3_set_insert_hdr(u8 *hw_ste_p, u8 *d_action,
|
||||
u32 reformat_id, u8 anchor,
|
||||
u8 offset, int size)
|
||||
{
|
||||
MLX5_SET(ste_double_action_insert_with_ptr_v3, d_action,
|
||||
action_id, DR_STE_V1_ACTION_ID_INSERT_POINTER);
|
||||
MLX5_SET(ste_double_action_insert_with_ptr_v3, d_action,
|
||||
start_anchor, anchor);
|
||||
|
||||
/* The hardware expects here size and offset in words (2 byte) */
|
||||
MLX5_SET(ste_double_action_insert_with_ptr_v3, d_action,
|
||||
size, size / 2);
|
||||
MLX5_SET(ste_double_action_insert_with_ptr_v3, d_action,
|
||||
start_offset, offset / 2);
|
||||
|
||||
MLX5_SET(ste_double_action_insert_with_ptr_v3, d_action,
|
||||
pointer, reformat_id);
|
||||
MLX5_SET(ste_double_action_insert_with_ptr_v3, d_action,
|
||||
attributes, DR_STE_V1_ACTION_INSERT_PTR_ATTR_NONE);
|
||||
|
||||
dr_ste_v1_set_reparse(hw_ste_p);
|
||||
}
|
||||
|
||||
static void dr_ste_v3_set_remove_hdr(u8 *hw_ste_p, u8 *s_action,
|
||||
u8 anchor, u8 offset, int size)
|
||||
{
|
||||
MLX5_SET(ste_single_action_remove_header_size_v3, s_action,
|
||||
action_id, DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE);
|
||||
MLX5_SET(ste_single_action_remove_header_size_v3, s_action,
|
||||
start_anchor, anchor);
|
||||
|
||||
/* The hardware expects here size and offset in words (2 byte) */
|
||||
MLX5_SET(ste_single_action_remove_header_size_v3, s_action,
|
||||
remove_size, size / 2);
|
||||
MLX5_SET(ste_single_action_remove_header_size_v3, s_action,
|
||||
start_offset, offset / 2);
|
||||
|
||||
dr_ste_v1_set_reparse(hw_ste_p);
|
||||
}
|
||||
|
||||
static int
|
||||
dr_ste_v3_set_action_decap_l3_list(void *data, u32 data_sz,
|
||||
u8 *hw_action, u32 hw_action_sz,
|
||||
@@ -211,6 +251,8 @@ static struct mlx5dr_ste_ctx ste_ctx_v3 = {
|
||||
.set_pop_vlan = &dr_ste_v3_set_pop_vlan,
|
||||
.set_rx_decap = &dr_ste_v3_set_rx_decap,
|
||||
.set_encap_l3 = &dr_ste_v3_set_encap_l3,
|
||||
.set_insert_hdr = &dr_ste_v3_set_insert_hdr,
|
||||
.set_remove_hdr = &dr_ste_v3_set_remove_hdr,
|
||||
/* Send */
|
||||
.prepare_for_postsend = &dr_ste_v1_prepare_for_postsend,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user