Commit 6d43a9f6 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

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: default avatarJakub Kicinski <kuba@kernel.org>
parents d0f9eca2 beb6e2e5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 {
+22 −28
Original line number Diff line number Diff line
@@ -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->lft.soft_packet_limit != XFRM_INF)
		mlx5e_ipsec_handle_limits(sa_entry);

	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);
	    !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);
		mlx5e_ipsec_update_esn_state(sa_entry, mode_param, &tmp);
		need_modify = true;
	}

	if (attrs->lft.soft_packet_limit != XFRM_INF)
		mlx5e_ipsec_handle_limits(sa_entry);

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;
}
+9 −14
Original line number Diff line number Diff line
@@ -1489,24 +1489,24 @@ static int esw_qos_node_enable_tc_arbitration(struct mlx5_esw_sched_node *node,
	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 @@ static u32 mlx5_esw_qos_lag_link_speed_get_locked(struct mlx5_core_dev *mdev)
}

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;