Blame SOURCES/0038-netdrv-net-mlx5e-Add-tc-flower-tracepoints.patch

d8f823
From c4bef68d1ee7d83b186a264f290c8fdbf47abdae Mon Sep 17 00:00:00 2001
d8f823
From: Alaa Hleihel <ahleihel@redhat.com>
d8f823
Date: Sun, 10 May 2020 14:52:04 -0400
d8f823
Subject: [PATCH 038/312] [netdrv] net/mlx5e: Add tc flower tracepoints
d8f823
d8f823
Message-id: <20200510145245.10054-42-ahleihel@redhat.com>
d8f823
Patchwork-id: 306582
d8f823
Patchwork-instance: patchwork
d8f823
O-Subject: [RHEL8.3 BZ 1789378 v2 41/82] net/mlx5e: Add tc flower tracepoints
d8f823
Bugzilla: 1789378
d8f823
RH-Acked-by: Kamal Heib <kheib@redhat.com>
d8f823
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
d8f823
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
d8f823
RH-Acked-by: Jonathan Toppins <jtoppins@redhat.com>
d8f823
d8f823
Bugzilla: http://bugzilla.redhat.com/1789378
d8f823
Upstream: v5.4-rc1
d8f823
Conflicts:
d8f823
 - Documentation/networking/device_drivers/mellanox/mlx5.rst
d8f823
   Drop changes to doc file that doesn't exist in RHEL-8 tree.
d8f823
d8f823
commit 7a978759b4e0e7a2ad3f10cbf9077915a85ec956
d8f823
Author: Dmytro Linkin <dmitrolin@mellanox.com>
d8f823
Date:   Thu Jun 27 10:55:02 2019 +0000
d8f823
d8f823
    net/mlx5e: Add tc flower tracepoints
d8f823
d8f823
    Implemented following tracepoints:
d8f823
    1. Configure flower (mlx5e_configure_flower)
d8f823
    2. Delete flower (mlx5e_delete_flower)
d8f823
    3. Stats flower (mlx5e_stats_flower)
d8f823
d8f823
    Usage example:
d8f823
     ># cd /sys/kernel/debug/tracing
d8f823
     ># echo mlx5:mlx5e_configure_flower >> set_event
d8f823
     ># cat trace
d8f823
        ...
d8f823
        tc-6535  [019] ...1  2672.404466: mlx5e_configure_flower: cookie=0000000067874a55 actions= REDIRECT
d8f823
d8f823
    Added corresponding documentation in
d8f823
        Documentation/networking/device-driver/mellanox/mlx5.rst
d8f823
d8f823
    Signed-off-by: Dmytro Linkin <dmitrolin@mellanox.com>
d8f823
    Reviewed-by: Vlad Buslov <vladbu@mellanox.com>
d8f823
    Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
d8f823
d8f823
Signed-off-by: Alaa Hleihel <ahleihel@redhat.com>
d8f823
Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
d8f823
---
d8f823
 drivers/net/ethernet/mellanox/mlx5/core/Makefile   |  2 +-
d8f823
 .../mellanox/mlx5/core/diag/en_tc_tracepoint.c     | 58 +++++++++++++++
d8f823
 .../mellanox/mlx5/core/diag/en_tc_tracepoint.h     | 83 ++++++++++++++++++++++
d8f823
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c    |  4 ++
d8f823
 4 files changed, 146 insertions(+), 1 deletion(-)
d8f823
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.c
d8f823
 create mode 100644 drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h
d8f823
d8f823
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Makefile b/drivers/net/ethernet/mellanox/mlx5/core/Makefile
d8f823
index bd2074d5eb87..3ac94d97cc24 100644
d8f823
--- a/drivers/net/ethernet/mellanox/mlx5/core/Makefile
d8f823
+++ b/drivers/net/ethernet/mellanox/mlx5/core/Makefile
d8f823
@@ -35,7 +35,7 @@ mlx5_core-$(CONFIG_MLX5_EN_RXNFC)    += en_fs_ethtool.o
d8f823
 mlx5_core-$(CONFIG_MLX5_CORE_EN_DCB) += en_dcbnl.o en/port_buffer.o
d8f823
 mlx5_core-$(CONFIG_MLX5_ESWITCH)     += en_rep.o en_tc.o en/tc_tun.o lib/port_tun.o lag_mp.o \
d8f823
 					lib/geneve.o en/tc_tun_vxlan.o en/tc_tun_gre.o \
d8f823
-					en/tc_tun_geneve.o
d8f823
+					en/tc_tun_geneve.o diag/en_tc_tracepoint.o
d8f823
 
d8f823
 #
d8f823
 # Core extra
d8f823
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.c b/drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.c
d8f823
new file mode 100644
d8f823
index 000000000000..c5dc6c50fa87
d8f823
--- /dev/null
d8f823
+++ b/drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.c
d8f823
@@ -0,0 +1,58 @@
d8f823
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
d8f823
+/* Copyright (c) 2019 Mellanox Technologies. */
d8f823
+
d8f823
+#define CREATE_TRACE_POINTS
d8f823
+#include "en_tc_tracepoint.h"
d8f823
+
d8f823
+void put_ids_to_array(int *ids,
d8f823
+		      const struct flow_action_entry *entries,
d8f823
+		      unsigned int num)
d8f823
+{
d8f823
+	unsigned int i;
d8f823
+
d8f823
+	for (i = 0; i < num; i++)
d8f823
+		ids[i] = entries[i].id;
d8f823
+}
d8f823
+
d8f823
+#define NAME_SIZE 16
d8f823
+
d8f823
+static const char FLOWACT2STR[NUM_FLOW_ACTIONS][NAME_SIZE] = {
d8f823
+	[FLOW_ACTION_ACCEPT]	= "ACCEPT",
d8f823
+	[FLOW_ACTION_DROP]	= "DROP",
d8f823
+	[FLOW_ACTION_TRAP]	= "TRAP",
d8f823
+	[FLOW_ACTION_GOTO]	= "GOTO",
d8f823
+	[FLOW_ACTION_REDIRECT]	= "REDIRECT",
d8f823
+	[FLOW_ACTION_MIRRED]	= "MIRRED",
d8f823
+	[FLOW_ACTION_VLAN_PUSH]	= "VLAN_PUSH",
d8f823
+	[FLOW_ACTION_VLAN_POP]	= "VLAN_POP",
d8f823
+	[FLOW_ACTION_VLAN_MANGLE]	= "VLAN_MANGLE",
d8f823
+	[FLOW_ACTION_TUNNEL_ENCAP]	= "TUNNEL_ENCAP",
d8f823
+	[FLOW_ACTION_TUNNEL_DECAP]	= "TUNNEL_DECAP",
d8f823
+	[FLOW_ACTION_MANGLE]	= "MANGLE",
d8f823
+	[FLOW_ACTION_ADD]	= "ADD",
d8f823
+	[FLOW_ACTION_CSUM]	= "CSUM",
d8f823
+	[FLOW_ACTION_MARK]	= "MARK",
d8f823
+	[FLOW_ACTION_WAKE]	= "WAKE",
d8f823
+	[FLOW_ACTION_QUEUE]	= "QUEUE",
d8f823
+	[FLOW_ACTION_SAMPLE]	= "SAMPLE",
d8f823
+	[FLOW_ACTION_POLICE]	= "POLICE",
d8f823
+	[FLOW_ACTION_CT]	= "CT",
d8f823
+};
d8f823
+
d8f823
+const char *parse_action(struct trace_seq *p,
d8f823
+			 int *ids,
d8f823
+			 unsigned int num)
d8f823
+{
d8f823
+	const char *ret = trace_seq_buffer_ptr(p);
d8f823
+	unsigned int i;
d8f823
+
d8f823
+	for (i = 0; i < num; i++) {
d8f823
+		if (ids[i] < NUM_FLOW_ACTIONS)
d8f823
+			trace_seq_printf(p, "%s ", FLOWACT2STR[ids[i]]);
d8f823
+		else
d8f823
+			trace_seq_printf(p, "UNKNOWN ");
d8f823
+	}
d8f823
+
d8f823
+	trace_seq_putc(p, 0);
d8f823
+	return ret;
d8f823
+}
d8f823
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h b/drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h
d8f823
new file mode 100644
d8f823
index 000000000000..a362100fe6d3
d8f823
--- /dev/null
d8f823
+++ b/drivers/net/ethernet/mellanox/mlx5/core/diag/en_tc_tracepoint.h
d8f823
@@ -0,0 +1,83 @@
d8f823
+/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
d8f823
+/* Copyright (c) 2019 Mellanox Technologies. */
d8f823
+
d8f823
+#undef TRACE_SYSTEM
d8f823
+#define TRACE_SYSTEM mlx5
d8f823
+
d8f823
+#if !defined(_MLX5_TC_TP_) || defined(TRACE_HEADER_MULTI_READ)
d8f823
+#define _MLX5_TC_TP_
d8f823
+
d8f823
+#include <linux/tracepoint.h>
d8f823
+#include <linux/trace_seq.h>
d8f823
+#include <net/flow_offload.h>
d8f823
+
d8f823
+#define __parse_action(ids, num) parse_action(p, ids, num)
d8f823
+
d8f823
+void put_ids_to_array(int *ids,
d8f823
+		      const struct flow_action_entry *entries,
d8f823
+		      unsigned int num);
d8f823
+
d8f823
+const char *parse_action(struct trace_seq *p,
d8f823
+			 int *ids,
d8f823
+			 unsigned int num);
d8f823
+
d8f823
+DECLARE_EVENT_CLASS(mlx5e_flower_template,
d8f823
+		    TP_PROTO(const struct flow_cls_offload *f),
d8f823
+		    TP_ARGS(f),
d8f823
+		    TP_STRUCT__entry(__field(void *, cookie)
d8f823
+				     __field(unsigned int, num)
d8f823
+				     __dynamic_array(int, ids, f->rule ?
d8f823
+					     f->rule->action.num_entries : 0)
d8f823
+				     ),
d8f823
+		    TP_fast_assign(__entry->cookie = (void *)f->cookie;
d8f823
+			__entry->num = (f->rule ?
d8f823
+				f->rule->action.num_entries : 0);
d8f823
+			if (__entry->num)
d8f823
+				put_ids_to_array(__get_dynamic_array(ids),
d8f823
+						 f->rule->action.entries,
d8f823
+						 f->rule->action.num_entries);
d8f823
+			),
d8f823
+		    TP_printk("cookie=%p actions= %s\n",
d8f823
+			      __entry->cookie, __entry->num ?
d8f823
+				      __parse_action(__get_dynamic_array(ids),
d8f823
+						     __entry->num) : "NULL"
d8f823
+			      )
d8f823
+);
d8f823
+
d8f823
+DEFINE_EVENT(mlx5e_flower_template, mlx5e_configure_flower,
d8f823
+	     TP_PROTO(const struct flow_cls_offload *f),
d8f823
+	     TP_ARGS(f)
d8f823
+	     );
d8f823
+
d8f823
+DEFINE_EVENT(mlx5e_flower_template, mlx5e_delete_flower,
d8f823
+	     TP_PROTO(const struct flow_cls_offload *f),
d8f823
+	     TP_ARGS(f)
d8f823
+	     );
d8f823
+
d8f823
+TRACE_EVENT(mlx5e_stats_flower,
d8f823
+	    TP_PROTO(const struct flow_cls_offload *f),
d8f823
+	    TP_ARGS(f),
d8f823
+	    TP_STRUCT__entry(__field(void *, cookie)
d8f823
+			     __field(u64, bytes)
d8f823
+			     __field(u64, packets)
d8f823
+			     __field(u64, lastused)
d8f823
+			     ),
d8f823
+	    TP_fast_assign(__entry->cookie = (void *)f->cookie;
d8f823
+		__entry->bytes = f->stats.bytes;
d8f823
+		__entry->packets = f->stats.pkts;
d8f823
+		__entry->lastused = f->stats.lastused;
d8f823
+		),
d8f823
+	    TP_printk("cookie=%p bytes=%llu packets=%llu lastused=%llu\n",
d8f823
+		      __entry->cookie, __entry->bytes,
d8f823
+		      __entry->packets, __entry->lastused
d8f823
+		      )
d8f823
+);
d8f823
+
d8f823
+#endif /* _MLX5_TC_TP_ */
d8f823
+
d8f823
+/* This part must be outside protection */
d8f823
+#undef TRACE_INCLUDE_PATH
d8f823
+#define TRACE_INCLUDE_PATH ./diag
d8f823
+#undef TRACE_INCLUDE_FILE
d8f823
+#define TRACE_INCLUDE_FILE en_tc_tracepoint
d8f823
+#include <trace/define_trace.h>
d8f823
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
d8f823
index d7d2151d1ef3..8d0cf434d16c 100644
d8f823
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
d8f823
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
d8f823
@@ -56,6 +56,7 @@
d8f823
 #include "en/tc_tun.h"
d8f823
 #include "lib/devcom.h"
d8f823
 #include "lib/geneve.h"
d8f823
+#include "diag/en_tc_tracepoint.h"
d8f823
 
d8f823
 struct mlx5_nic_flow_attr {
d8f823
 	u32 action;
d8f823
@@ -3810,6 +3811,7 @@ int mlx5e_configure_flower(struct net_device *dev, struct mlx5e_priv *priv,
d8f823
 		goto out;
d8f823
 	}
d8f823
 
d8f823
+	trace_mlx5e_configure_flower(f);
d8f823
 	err = mlx5e_tc_add_flow(priv, f, flags, dev, &flow);
d8f823
 	if (err)
d8f823
 		goto out;
d8f823
@@ -3859,6 +3861,7 @@ int mlx5e_delete_flower(struct net_device *dev, struct mlx5e_priv *priv,
d8f823
 	rhashtable_remove_fast(tc_ht, &flow->node, tc_ht_params);
d8f823
 	rcu_read_unlock();
d8f823
 
d8f823
+	trace_mlx5e_delete_flower(f);
d8f823
 	mlx5e_flow_put(priv, flow);
d8f823
 
d8f823
 	return 0;
d8f823
@@ -3928,6 +3931,7 @@ int mlx5e_stats_flower(struct net_device *dev, struct mlx5e_priv *priv,
d8f823
 	mlx5_devcom_release_peer_data(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
d8f823
 out:
d8f823
 	flow_stats_update(&f->stats, bytes, packets, lastuse);
d8f823
+	trace_mlx5e_stats_flower(f);
d8f823
 errout:
d8f823
 	mlx5e_flow_put(priv, flow);
d8f823
 	return err;
d8f823
-- 
d8f823
2.13.6
d8f823