]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5: fw_tracer, Add support for unrecognized string
authorShay Drory <shayd@nvidia.com>
Tue, 17 Jan 2023 13:24:19 +0000 (15:24 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 19 Jan 2026 12:09:44 +0000 (13:09 +0100)
[ Upstream commit f7133135235dbd11e7cb5fe62fe5d05ce5e82eeb ]

In case FW is publishing a string which isn't found in the driver's
string DBs, keep the string as raw data.

Signed-off-by: Shay Drory <shayd@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Stable-dep-of: b35966042d20 ("net/mlx5: fw_tracer, Validate format string parameters")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c
drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.h

index efa2e0a8fa1d1284d30683bd417fcd813f98e007..d982b468dcc1d2e53d4b360b37c9162a0a061286 100644 (file)
@@ -460,6 +460,7 @@ static void poll_trace(struct mlx5_fw_tracer *tracer,
 
        tracer_event->event_id = MLX5_GET(tracer_event, trace, event_id);
        tracer_event->lost_event = MLX5_GET(tracer_event, trace, lost);
+       tracer_event->out = trace;
 
        switch (tracer_event->event_id) {
        case TRACER_EVENT_TYPE_TIMESTAMP:
@@ -582,6 +583,26 @@ void mlx5_tracer_print_trace(struct tracer_string_format *str_frmt,
        mlx5_tracer_clean_message(str_frmt);
 }
 
+static int mlx5_tracer_handle_raw_string(struct mlx5_fw_tracer *tracer,
+                                        struct tracer_event *tracer_event)
+{
+       struct tracer_string_format *cur_string;
+
+       cur_string = mlx5_tracer_message_insert(tracer, tracer_event);
+       if (!cur_string)
+               return -1;
+
+       cur_string->event_id = tracer_event->event_id;
+       cur_string->timestamp = tracer_event->string_event.timestamp;
+       cur_string->lost = tracer_event->lost_event;
+       cur_string->string = "0x%08x%08x";
+       cur_string->num_of_params = 2;
+       cur_string->params[0] = upper_32_bits(*tracer_event->out);
+       cur_string->params[1] = lower_32_bits(*tracer_event->out);
+       list_add_tail(&cur_string->list, &tracer->ready_strings_list);
+       return 0;
+}
+
 static int mlx5_tracer_handle_string_trace(struct mlx5_fw_tracer *tracer,
                                           struct tracer_event *tracer_event)
 {
@@ -590,7 +611,7 @@ static int mlx5_tracer_handle_string_trace(struct mlx5_fw_tracer *tracer,
        if (tracer_event->string_event.tdsn == 0) {
                cur_string = mlx5_tracer_get_string(tracer, tracer_event);
                if (!cur_string)
-                       return -1;
+                       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;
@@ -605,7 +626,7 @@ static int mlx5_tracer_handle_string_trace(struct mlx5_fw_tracer *tracer,
                if (!cur_string) {
                        pr_debug("%s Got string event for unknown string tmsn: %d\n",
                                 __func__, tracer_event->string_event.tmsn);
-                       return -1;
+                       return mlx5_tracer_handle_raw_string(tracer, tracer_event);
                }
                cur_string->last_param_num += 1;
                if (cur_string->last_param_num > TRACER_MAX_PARAMS) {
index 97252a85d65e6b1189814d744be8c7b10d40dd68..568efb1e2bd24e8ba6c10b39afcd58197efe2d5b 100644 (file)
@@ -158,6 +158,7 @@ struct tracer_event {
                struct tracer_string_event string_event;
                struct tracer_timestamp_event timestamp_event;
        };
+       u64 *out;
 };
 
 struct mlx5_ifc_tracer_event_bits {