net/mlx5e: Add tc flower tracepoints
Implemented following tracepoints: 1. Configure flower (mlx5e_configure_flower) 2. Delete flower (mlx5e_delete_flower) 3. Stats flower (mlx5e_stats_flower) Usage example: ># cd /sys/kernel/debug/tracing ># echo mlx5:mlx5e_configure_flower >> set_event ># cat trace ... tc-6535 [019] ...1 2672.404466: mlx5e_configure_flower: cookie=0000000067874a55 actions= REDIRECT Added corresponding documentation in Documentation/networking/device-driver/mellanox/mlx5.rst Signed-off-by: Dmytro Linkin <dmitrolin@mellanox.com> Reviewed-by: Vlad Buslov <vladbu@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
95435ad799
commit
7a978759b4
|
@ -12,6 +12,7 @@ Contents
|
|||
- `Enabling the driver and kconfig options`_
|
||||
- `Devlink info`_
|
||||
- `Devlink health reporters`_
|
||||
- `mlx5 tracepoints`_
|
||||
|
||||
Enabling the driver and kconfig options
|
||||
================================================
|
||||
|
@ -219,3 +220,34 @@ User commands examples:
|
|||
$ devlink health dump show pci/0000:82:00.1 reporter fw_fatal
|
||||
|
||||
NOTE: This command can run only on PF.
|
||||
|
||||
mlx5 tracepoints
|
||||
================
|
||||
|
||||
mlx5 driver provides internal trace points for tracking and debugging using
|
||||
kernel tracepoints interfaces (refer to Documentation/trace/ftrase.rst).
|
||||
|
||||
For the list of support mlx5 events check /sys/kernel/debug/tracing/events/mlx5/
|
||||
|
||||
tc and eswitch offloads tracepoints:
|
||||
|
||||
- mlx5e_configure_flower: trace flower filter actions and cookies offloaded to mlx5::
|
||||
|
||||
$ echo mlx5:mlx5e_configure_flower >> /sys/kernel/debug/tracing/set_event
|
||||
$ cat /sys/kernel/debug/tracing/trace
|
||||
...
|
||||
tc-6535 [019] ...1 2672.404466: mlx5e_configure_flower: cookie=0000000067874a55 actions= REDIRECT
|
||||
|
||||
- mlx5e_delete_flower: trace flower filter actions and cookies deleted from mlx5::
|
||||
|
||||
$ echo mlx5:mlx5e_delete_flower >> /sys/kernel/debug/tracing/set_event
|
||||
$ cat /sys/kernel/debug/tracing/trace
|
||||
...
|
||||
tc-6569 [010] .N.1 2686.379075: mlx5e_delete_flower: cookie=0000000067874a55 actions= NULL
|
||||
|
||||
- mlx5e_stats_flower: trace flower stats request::
|
||||
|
||||
$ echo mlx5:mlx5e_stats_flower >> /sys/kernel/debug/tracing/set_event
|
||||
$ cat /sys/kernel/debug/tracing/trace
|
||||
...
|
||||
tc-6546 [010] ...1 2679.704889: mlx5e_stats_flower: cookie=0000000060eb3d6a bytes=0 packets=0 lastused=4295560217
|
||||
|
|
|
@ -35,7 +35,7 @@ mlx5_core-$(CONFIG_MLX5_EN_RXNFC) += en_fs_ethtool.o
|
|||
mlx5_core-$(CONFIG_MLX5_CORE_EN_DCB) += en_dcbnl.o en/port_buffer.o
|
||||
mlx5_core-$(CONFIG_MLX5_ESWITCH) += en_rep.o en_tc.o en/tc_tun.o lib/port_tun.o lag_mp.o \
|
||||
lib/geneve.o en/tc_tun_vxlan.o en/tc_tun_gre.o \
|
||||
en/tc_tun_geneve.o
|
||||
en/tc_tun_geneve.o diag/en_tc_tracepoint.o
|
||||
|
||||
#
|
||||
# Core extra
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
|
||||
/* Copyright (c) 2019 Mellanox Technologies. */
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include "en_tc_tracepoint.h"
|
||||
|
||||
void put_ids_to_array(int *ids,
|
||||
const struct flow_action_entry *entries,
|
||||
unsigned int num)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
ids[i] = entries[i].id;
|
||||
}
|
||||
|
||||
#define NAME_SIZE 16
|
||||
|
||||
static const char FLOWACT2STR[NUM_FLOW_ACTIONS][NAME_SIZE] = {
|
||||
[FLOW_ACTION_ACCEPT] = "ACCEPT",
|
||||
[FLOW_ACTION_DROP] = "DROP",
|
||||
[FLOW_ACTION_TRAP] = "TRAP",
|
||||
[FLOW_ACTION_GOTO] = "GOTO",
|
||||
[FLOW_ACTION_REDIRECT] = "REDIRECT",
|
||||
[FLOW_ACTION_MIRRED] = "MIRRED",
|
||||
[FLOW_ACTION_VLAN_PUSH] = "VLAN_PUSH",
|
||||
[FLOW_ACTION_VLAN_POP] = "VLAN_POP",
|
||||
[FLOW_ACTION_VLAN_MANGLE] = "VLAN_MANGLE",
|
||||
[FLOW_ACTION_TUNNEL_ENCAP] = "TUNNEL_ENCAP",
|
||||
[FLOW_ACTION_TUNNEL_DECAP] = "TUNNEL_DECAP",
|
||||
[FLOW_ACTION_MANGLE] = "MANGLE",
|
||||
[FLOW_ACTION_ADD] = "ADD",
|
||||
[FLOW_ACTION_CSUM] = "CSUM",
|
||||
[FLOW_ACTION_MARK] = "MARK",
|
||||
[FLOW_ACTION_WAKE] = "WAKE",
|
||||
[FLOW_ACTION_QUEUE] = "QUEUE",
|
||||
[FLOW_ACTION_SAMPLE] = "SAMPLE",
|
||||
[FLOW_ACTION_POLICE] = "POLICE",
|
||||
[FLOW_ACTION_CT] = "CT",
|
||||
};
|
||||
|
||||
const char *parse_action(struct trace_seq *p,
|
||||
int *ids,
|
||||
unsigned int num)
|
||||
{
|
||||
const char *ret = trace_seq_buffer_ptr(p);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
if (ids[i] < NUM_FLOW_ACTIONS)
|
||||
trace_seq_printf(p, "%s ", FLOWACT2STR[ids[i]]);
|
||||
else
|
||||
trace_seq_printf(p, "UNKNOWN ");
|
||||
}
|
||||
|
||||
trace_seq_putc(p, 0);
|
||||
return ret;
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
|
||||
/* Copyright (c) 2019 Mellanox Technologies. */
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM mlx5
|
||||
|
||||
#if !defined(_MLX5_TC_TP_) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _MLX5_TC_TP_
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
#include <linux/trace_seq.h>
|
||||
#include <net/flow_offload.h>
|
||||
|
||||
#define __parse_action(ids, num) parse_action(p, ids, num)
|
||||
|
||||
void put_ids_to_array(int *ids,
|
||||
const struct flow_action_entry *entries,
|
||||
unsigned int num);
|
||||
|
||||
const char *parse_action(struct trace_seq *p,
|
||||
int *ids,
|
||||
unsigned int num);
|
||||
|
||||
DECLARE_EVENT_CLASS(mlx5e_flower_template,
|
||||
TP_PROTO(const struct flow_cls_offload *f),
|
||||
TP_ARGS(f),
|
||||
TP_STRUCT__entry(__field(void *, cookie)
|
||||
__field(unsigned int, num)
|
||||
__dynamic_array(int, ids, f->rule ?
|
||||
f->rule->action.num_entries : 0)
|
||||
),
|
||||
TP_fast_assign(__entry->cookie = (void *)f->cookie;
|
||||
__entry->num = (f->rule ?
|
||||
f->rule->action.num_entries : 0);
|
||||
if (__entry->num)
|
||||
put_ids_to_array(__get_dynamic_array(ids),
|
||||
f->rule->action.entries,
|
||||
f->rule->action.num_entries);
|
||||
),
|
||||
TP_printk("cookie=%p actions= %s\n",
|
||||
__entry->cookie, __entry->num ?
|
||||
__parse_action(__get_dynamic_array(ids),
|
||||
__entry->num) : "NULL"
|
||||
)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(mlx5e_flower_template, mlx5e_configure_flower,
|
||||
TP_PROTO(const struct flow_cls_offload *f),
|
||||
TP_ARGS(f)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(mlx5e_flower_template, mlx5e_delete_flower,
|
||||
TP_PROTO(const struct flow_cls_offload *f),
|
||||
TP_ARGS(f)
|
||||
);
|
||||
|
||||
TRACE_EVENT(mlx5e_stats_flower,
|
||||
TP_PROTO(const struct flow_cls_offload *f),
|
||||
TP_ARGS(f),
|
||||
TP_STRUCT__entry(__field(void *, cookie)
|
||||
__field(u64, bytes)
|
||||
__field(u64, packets)
|
||||
__field(u64, lastused)
|
||||
),
|
||||
TP_fast_assign(__entry->cookie = (void *)f->cookie;
|
||||
__entry->bytes = f->stats.bytes;
|
||||
__entry->packets = f->stats.pkts;
|
||||
__entry->lastused = f->stats.lastused;
|
||||
),
|
||||
TP_printk("cookie=%p bytes=%llu packets=%llu lastused=%llu\n",
|
||||
__entry->cookie, __entry->bytes,
|
||||
__entry->packets, __entry->lastused
|
||||
)
|
||||
);
|
||||
|
||||
#endif /* _MLX5_TC_TP_ */
|
||||
|
||||
/* This part must be outside protection */
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH ./diag
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE en_tc_tracepoint
|
||||
#include <trace/define_trace.h>
|
|
@ -56,6 +56,7 @@
|
|||
#include "en/tc_tun.h"
|
||||
#include "lib/devcom.h"
|
||||
#include "lib/geneve.h"
|
||||
#include "diag/en_tc_tracepoint.h"
|
||||
|
||||
struct mlx5_nic_flow_attr {
|
||||
u32 action;
|
||||
|
@ -3769,6 +3770,7 @@ int mlx5e_configure_flower(struct net_device *dev, struct mlx5e_priv *priv,
|
|||
goto out;
|
||||
}
|
||||
|
||||
trace_mlx5e_configure_flower(f);
|
||||
err = mlx5e_tc_add_flow(priv, f, flags, dev, &flow);
|
||||
if (err)
|
||||
goto out;
|
||||
|
@ -3818,6 +3820,7 @@ int mlx5e_delete_flower(struct net_device *dev, struct mlx5e_priv *priv,
|
|||
rhashtable_remove_fast(tc_ht, &flow->node, tc_ht_params);
|
||||
rcu_read_unlock();
|
||||
|
||||
trace_mlx5e_delete_flower(f);
|
||||
mlx5e_flow_put(priv, flow);
|
||||
|
||||
return 0;
|
||||
|
@ -3887,6 +3890,7 @@ no_peer_counter:
|
|||
mlx5_devcom_release_peer_data(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
|
||||
out:
|
||||
flow_stats_update(&f->stats, bytes, packets, lastuse);
|
||||
trace_mlx5e_stats_flower(f);
|
||||
errout:
|
||||
mlx5e_flow_put(priv, flow);
|
||||
return err;
|
||||
|
|
|
@ -138,6 +138,7 @@ enum flow_action_id {
|
|||
FLOW_ACTION_MPLS_PUSH,
|
||||
FLOW_ACTION_MPLS_POP,
|
||||
FLOW_ACTION_MPLS_MANGLE,
|
||||
NUM_FLOW_ACTIONS,
|
||||
};
|
||||
|
||||
/* This is mirroring enum pedit_header_type definition for easy mapping between
|
||||
|
|
Loading…
Reference in New Issue