mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-17 22:23:45 -04:00
Merge branch 'mlx5-misc-fixes-2026-03-16'
Tariq Toukan says: ==================== mlx5 misc fixes 2026-03-16 This patchset provides misc bug fixes from the team to the mlx5 core and Eth drivers. ==================== Link: https://patch.msgid.link/20260316094603.6999-1-tariqt@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -287,6 +287,7 @@ struct mlx5e_ipsec_sa_entry {
|
||||
struct mlx5e_ipsec_dwork *dwork;
|
||||
struct mlx5e_ipsec_limits limits;
|
||||
u32 rx_mapped_id;
|
||||
u8 ctx[MLX5_ST_SZ_BYTES(ipsec_aso)];
|
||||
};
|
||||
|
||||
struct mlx5_accel_pol_xfrm_attrs {
|
||||
|
||||
@@ -310,10 +310,11 @@ static void mlx5e_ipsec_aso_update(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
mlx5e_ipsec_aso_query(sa_entry, data);
|
||||
}
|
||||
|
||||
static void mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
u32 mode_param)
|
||||
static void
|
||||
mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
u32 mode_param,
|
||||
struct mlx5_accel_esp_xfrm_attrs *attrs)
|
||||
{
|
||||
struct mlx5_accel_esp_xfrm_attrs attrs = {};
|
||||
struct mlx5_wqe_aso_ctrl_seg data = {};
|
||||
|
||||
if (mode_param < MLX5E_IPSEC_ESN_SCOPE_MID) {
|
||||
@@ -323,18 +324,7 @@ static void mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
sa_entry->esn_state.overlap = 1;
|
||||
}
|
||||
|
||||
mlx5e_ipsec_build_accel_xfrm_attrs(sa_entry, &attrs);
|
||||
|
||||
/* It is safe to execute the modify below unlocked since the only flows
|
||||
* that could affect this HW object, are create, destroy and this work.
|
||||
*
|
||||
* Creation flow can't co-exist with this modify work, the destruction
|
||||
* flow would cancel this work, and this work is a single entity that
|
||||
* can't conflict with it self.
|
||||
*/
|
||||
spin_unlock_bh(&sa_entry->x->lock);
|
||||
mlx5_accel_esp_modify_xfrm(sa_entry, &attrs);
|
||||
spin_lock_bh(&sa_entry->x->lock);
|
||||
mlx5e_ipsec_build_accel_xfrm_attrs(sa_entry, attrs);
|
||||
|
||||
data.data_offset_condition_operand =
|
||||
MLX5_IPSEC_ASO_REMOVE_FLOW_PKT_CNT_OFFSET;
|
||||
@@ -370,20 +360,18 @@ static void mlx5e_ipsec_aso_update_soft(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
static void mlx5e_ipsec_handle_limits(struct mlx5e_ipsec_sa_entry *sa_entry)
|
||||
{
|
||||
struct mlx5_accel_esp_xfrm_attrs *attrs = &sa_entry->attrs;
|
||||
struct mlx5e_ipsec *ipsec = sa_entry->ipsec;
|
||||
struct mlx5e_ipsec_aso *aso = ipsec->aso;
|
||||
bool soft_arm, hard_arm;
|
||||
u64 hard_cnt;
|
||||
|
||||
lockdep_assert_held(&sa_entry->x->lock);
|
||||
|
||||
soft_arm = !MLX5_GET(ipsec_aso, aso->ctx, soft_lft_arm);
|
||||
hard_arm = !MLX5_GET(ipsec_aso, aso->ctx, hard_lft_arm);
|
||||
soft_arm = !MLX5_GET(ipsec_aso, sa_entry->ctx, soft_lft_arm);
|
||||
hard_arm = !MLX5_GET(ipsec_aso, sa_entry->ctx, hard_lft_arm);
|
||||
if (!soft_arm && !hard_arm)
|
||||
/* It is not lifetime event */
|
||||
return;
|
||||
|
||||
hard_cnt = MLX5_GET(ipsec_aso, aso->ctx, remove_flow_pkt_cnt);
|
||||
hard_cnt = MLX5_GET(ipsec_aso, sa_entry->ctx, remove_flow_pkt_cnt);
|
||||
if (!hard_cnt || hard_arm) {
|
||||
/* It is possible to see packet counter equal to zero without
|
||||
* hard limit event armed. Such situation can be if packet
|
||||
@@ -453,11 +441,11 @@ static void mlx5e_ipsec_handle_event(struct work_struct *_work)
|
||||
struct mlx5e_ipsec_work *work =
|
||||
container_of(_work, struct mlx5e_ipsec_work, work);
|
||||
struct mlx5e_ipsec_sa_entry *sa_entry = work->data;
|
||||
struct mlx5_accel_esp_xfrm_attrs tmp = {};
|
||||
struct mlx5_accel_esp_xfrm_attrs *attrs;
|
||||
struct mlx5e_ipsec_aso *aso;
|
||||
bool need_modify = false;
|
||||
int ret;
|
||||
|
||||
aso = sa_entry->ipsec->aso;
|
||||
attrs = &sa_entry->attrs;
|
||||
|
||||
spin_lock_bh(&sa_entry->x->lock);
|
||||
@@ -465,18 +453,22 @@ static void mlx5e_ipsec_handle_event(struct work_struct *_work)
|
||||
if (ret)
|
||||
goto unlock;
|
||||
|
||||
if (attrs->replay_esn.trigger &&
|
||||
!MLX5_GET(ipsec_aso, aso->ctx, esn_event_arm)) {
|
||||
u32 mode_param = MLX5_GET(ipsec_aso, aso->ctx, mode_parameter);
|
||||
|
||||
mlx5e_ipsec_update_esn_state(sa_entry, mode_param);
|
||||
}
|
||||
|
||||
if (attrs->lft.soft_packet_limit != XFRM_INF)
|
||||
mlx5e_ipsec_handle_limits(sa_entry);
|
||||
|
||||
if (attrs->replay_esn.trigger &&
|
||||
!MLX5_GET(ipsec_aso, sa_entry->ctx, esn_event_arm)) {
|
||||
u32 mode_param = MLX5_GET(ipsec_aso, sa_entry->ctx,
|
||||
mode_parameter);
|
||||
|
||||
mlx5e_ipsec_update_esn_state(sa_entry, mode_param, &tmp);
|
||||
need_modify = true;
|
||||
}
|
||||
|
||||
unlock:
|
||||
spin_unlock_bh(&sa_entry->x->lock);
|
||||
if (need_modify)
|
||||
mlx5_accel_esp_modify_xfrm(sa_entry, &tmp);
|
||||
kfree(work);
|
||||
}
|
||||
|
||||
@@ -629,6 +621,8 @@ int mlx5e_ipsec_aso_query(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
/* We are in atomic context */
|
||||
udelay(10);
|
||||
} while (ret && time_is_after_jiffies(expires));
|
||||
if (!ret)
|
||||
memcpy(sa_entry->ctx, aso->ctx, MLX5_ST_SZ_BYTES(ipsec_aso));
|
||||
spin_unlock_bh(&aso->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1489,24 +1489,24 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static u32 mlx5_esw_qos_lag_link_speed_get_locked(struct mlx5_core_dev *mdev)
|
||||
static u32 mlx5_esw_qos_lag_link_speed_get(struct mlx5_core_dev *mdev,
|
||||
bool take_rtnl)
|
||||
{
|
||||
struct ethtool_link_ksettings lksettings;
|
||||
struct net_device *slave, *master;
|
||||
u32 speed = SPEED_UNKNOWN;
|
||||
|
||||
/* Lock ensures a stable reference to master and slave netdevice
|
||||
* while port speed of master is queried.
|
||||
*/
|
||||
ASSERT_RTNL();
|
||||
|
||||
slave = mlx5_uplink_netdev_get(mdev);
|
||||
if (!slave)
|
||||
goto out;
|
||||
|
||||
if (take_rtnl)
|
||||
rtnl_lock();
|
||||
master = netdev_master_upper_dev_get(slave);
|
||||
if (master && !__ethtool_get_link_ksettings(master, &lksettings))
|
||||
speed = lksettings.base.speed;
|
||||
if (take_rtnl)
|
||||
rtnl_unlock();
|
||||
|
||||
out:
|
||||
mlx5_uplink_netdev_put(mdev, slave);
|
||||
@@ -1514,20 +1514,15 @@ out:
|
||||
}
|
||||
|
||||
static int mlx5_esw_qos_max_link_speed_get(struct mlx5_core_dev *mdev, u32 *link_speed_max,
|
||||
bool hold_rtnl_lock, struct netlink_ext_ack *extack)
|
||||
bool take_rtnl,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!mlx5_lag_is_active(mdev))
|
||||
goto skip_lag;
|
||||
|
||||
if (hold_rtnl_lock)
|
||||
rtnl_lock();
|
||||
|
||||
*link_speed_max = mlx5_esw_qos_lag_link_speed_get_locked(mdev);
|
||||
|
||||
if (hold_rtnl_lock)
|
||||
rtnl_unlock();
|
||||
*link_speed_max = mlx5_esw_qos_lag_link_speed_get(mdev, take_rtnl);
|
||||
|
||||
if (*link_speed_max != (u32)SPEED_UNKNOWN)
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user