Commit 78a47532 authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge branch 'mlx5-misc-fixes-2025-12-09'

Tariq Toukan says:

====================
mlx5 misc fixes 2025-12-09

This patchset provides misc bug fixes from the team to the mlx5 core and
Eth drivers.
====================

Link: https://patch.msgid.link/1765284977-1363052-1-git-send-email-tariqt@nvidia.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 71e6b15d 4198a14c
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -197,6 +197,11 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
	struct pci_dev *pdev = dev->pdev;
	int ret = 0;

	if (mlx5_fw_reset_in_progress(dev)) {
		NL_SET_ERR_MSG_MOD(extack, "Can't reload during firmware reset");
		return -EBUSY;
	}

	if (mlx5_dev_is_lightweight(dev)) {
		if (action != DEVLINK_RELOAD_ACTION_DRIVER_REINIT)
			return -EOPNOTSUPP;
+84 −13
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#include "lib/eq.h"
#include "fw_tracer.h"
#include "fw_tracer_tracepoint.h"
#include <linux/ctype.h>

static int mlx5_query_mtrc_caps(struct mlx5_fw_tracer *tracer)
{
@@ -358,6 +359,47 @@ static const char *VAL_PARM = "%llx";
static const char *REPLACE_64_VAL_PARM	= "%x%x";
static const char *PARAM_CHAR		= "%";

static bool mlx5_is_valid_spec(const char *str)
{
	/* Parse format specifiers to find the actual type.
	 * Structure: %[flags][width][.precision][length]type
	 * Skip flags, width, precision & length.
	 */
	while (isdigit(*str) || *str == '#' || *str == '.' || *str == 'l')
		str++;

	/* Check if it's a valid integer/hex specifier or %%:
	 * Valid formats: %x, %d, %i, %u, etc.
	 */
	if (*str != 'x' && *str != 'X' && *str != 'd' && *str != 'i' &&
	    *str != 'u' && *str != 'c' && *str != '%')
		return false;

	return true;
}

static bool mlx5_tracer_validate_params(const char *str)
{
	const char *substr = str;

	if (!str)
		return false;

	substr = strstr(substr, PARAM_CHAR);
	while (substr) {
		if (!mlx5_is_valid_spec(substr + 1))
			return false;

		if (*(substr + 1) == '%')
			substr = strstr(substr + 2, PARAM_CHAR);
		else
			substr = strstr(substr + 1, PARAM_CHAR);

	}

	return true;
}

static int mlx5_tracer_message_hash(u32 message_id)
{
	return jhash_1word(message_id, 0) & (MESSAGE_HASH_SIZE - 1);
@@ -419,6 +461,10 @@ static int mlx5_tracer_get_num_of_params(char *str)
	char *substr, *pstr = str;
	int num_of_params = 0;

	/* Validate that all parameters are valid before processing */
	if (!mlx5_tracer_validate_params(str))
		return -EINVAL;

	/* replace %llx with %x%x */
	substr = strstr(pstr, VAL_PARM);
	while (substr) {
@@ -427,11 +473,15 @@ static int mlx5_tracer_get_num_of_params(char *str)
		substr = strstr(pstr, VAL_PARM);
	}

	/* count all the % characters */
	/* count all the % characters, but skip %% (escaped percent) */
	substr = strstr(str, PARAM_CHAR);
	while (substr) {
		if (*(substr + 1) != '%') {
			num_of_params += 1;
			str = substr + 1;
		} else {
			str = substr + 2;
		}
		substr = strstr(str, PARAM_CHAR);
	}

@@ -570,6 +620,9 @@ void mlx5_tracer_print_trace(struct tracer_string_format *str_frmt,
{
	char	tmp[512];

	if (str_frmt->invalid_string)
		snprintf(tmp, sizeof(tmp), "BAD_FORMAT: %s", str_frmt->string);
	else
		snprintf(tmp, sizeof(tmp), str_frmt->string,
			 str_frmt->params[0],
			 str_frmt->params[1],
@@ -609,6 +662,13 @@ static int mlx5_tracer_handle_raw_string(struct mlx5_fw_tracer *tracer,
	return 0;
}

static void mlx5_tracer_handle_bad_format_string(struct mlx5_fw_tracer *tracer,
						 struct tracer_string_format *cur_string)
{
	cur_string->invalid_string = true;
	list_add_tail(&cur_string->list, &tracer->ready_strings_list);
}

static int mlx5_tracer_handle_string_trace(struct mlx5_fw_tracer *tracer,
					   struct tracer_event *tracer_event)
{
@@ -619,12 +679,18 @@ static int mlx5_tracer_handle_string_trace(struct mlx5_fw_tracer *tracer,
		if (!cur_string)
			return mlx5_tracer_handle_raw_string(tracer, tracer_event);

		cur_string->num_of_params = mlx5_tracer_get_num_of_params(cur_string->string);
		cur_string->last_param_num = 0;
		cur_string->event_id = tracer_event->event_id;
		cur_string->tmsn = tracer_event->string_event.tmsn;
		cur_string->timestamp = tracer_event->string_event.timestamp;
		cur_string->lost = tracer_event->lost_event;
		cur_string->last_param_num = 0;
		cur_string->num_of_params = mlx5_tracer_get_num_of_params(cur_string->string);
		if (cur_string->num_of_params < 0) {
			pr_debug("%s Invalid format string parameters\n",
				 __func__);
			mlx5_tracer_handle_bad_format_string(tracer, cur_string);
			return 0;
		}
		if (cur_string->num_of_params == 0) /* trace with no params */
			list_add_tail(&cur_string->list, &tracer->ready_strings_list);
	} else {
@@ -634,6 +700,11 @@ static int mlx5_tracer_handle_string_trace(struct mlx5_fw_tracer *tracer,
				 __func__, tracer_event->string_event.tmsn);
			return mlx5_tracer_handle_raw_string(tracer, tracer_event);
		}
		if (cur_string->num_of_params < 0) {
			pr_debug("%s string parameter of invalid string, dumping\n",
				 __func__);
			return 0;
		}
		cur_string->last_param_num += 1;
		if (cur_string->last_param_num > TRACER_MAX_PARAMS) {
			pr_debug("%s Number of params exceeds the max (%d)\n",
+1 −0
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ struct tracer_string_format {
	struct list_head list;
	u32 timestamp;
	bool lost;
	bool invalid_string;
};

enum mlx5_fw_tracer_ownership_state {
+1 −1
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ struct page_pool;
#define MLX5E_METADATA_ETHER_TYPE (0x8CE4)
#define MLX5E_METADATA_ETHER_LEN 8

#define MLX5E_ETH_HARD_MTU (ETH_HLEN + PSP_ENCAP_HLEN + PSP_TRL_SIZE + VLAN_HLEN + ETH_FCS_LEN)
#define MLX5E_ETH_HARD_MTU (ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN)

#define MLX5E_HW2SW_MTU(params, hwmtu) ((hwmtu) - ((params)->hard_mtu))
#define MLX5E_SW2HW_MTU(params, swmtu) ((swmtu) + ((params)->hard_mtu))
+5 −3
Original line number Diff line number Diff line
@@ -342,9 +342,8 @@ static void mlx5e_ipsec_init_macs(struct mlx5e_ipsec_sa_entry *sa_entry,
		rt_dst_entry = &rt->dst;
		break;
	case AF_INET6:
		rt_dst_entry = ipv6_stub->ipv6_dst_lookup_flow(
			dev_net(netdev), NULL, &fl6, NULL);
		if (IS_ERR(rt_dst_entry))
		if (!IS_ENABLED(CONFIG_IPV6) ||
		    ip6_dst_lookup(dev_net(netdev), NULL, &rt_dst_entry, &fl6))
			goto neigh;
		break;
	default:
@@ -359,6 +358,9 @@ static void mlx5e_ipsec_init_macs(struct mlx5e_ipsec_sa_entry *sa_entry,

	neigh_ha_snapshot(addr, n, netdev);
	ether_addr_copy(dst, addr);
	if (attrs->dir == XFRM_DEV_OFFLOAD_OUT &&
	    is_zero_ether_addr(addr))
		neigh_event_send(n, NULL);
	dst_release(rt_dst_entry);
	neigh_release(n);
	return;
Loading