[PATCH net-next 4/8] net: psample: add tracepoint

From: Adrian Moreno
Date: Wed Apr 24 2024 - 09:56:01 EST


Currently there are no widely-available tools to dump the metadata and
group information when a packet is sampled, making it difficult to
troubleshoot related issues.

This makes psample use the event tracing framework to log the sampling
of a packet so that it's easier to quickly identify the source
(i.e: group) and context (i.e: metadata) of a packet being sampled.

This patch creates some checkpatch splats, but the style of the
tracepoint definition mimics that of other modules so it seems
acceptable.

Signed-off-by: Adrian Moreno <amorenoz@xxxxxxxxxx>
---
net/psample/psample.c | 9 +++++++
net/psample/trace.h | 62 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 71 insertions(+)
create mode 100644 net/psample/trace.h

diff --git a/net/psample/psample.c b/net/psample/psample.c
index 476aaad7a885..92db8ffa2ba2 100644
--- a/net/psample/psample.c
+++ b/net/psample/psample.c
@@ -18,6 +18,12 @@
#include <net/ip_tunnels.h>
#include <net/dst_metadata.h>

+#ifndef __CHECKER__
+#define CREATE_TRACE_POINTS
+#endif
+
+#include "trace.h"
+
#define PSAMPLE_MAX_PACKET_SIZE 0xffff

static LIST_HEAD(psample_groups_list);
@@ -470,6 +476,9 @@ void psample_sample_packet(struct psample_group *group, struct sk_buff *skb,
void *data;
int ret;

+ if (trace_psample_sample_packet_enabled())
+ trace_psample_sample_packet(group, skb, sample_rate, md);
+
meta_len = (in_ifindex ? nla_total_size(sizeof(u16)) : 0) +
(out_ifindex ? nla_total_size(sizeof(u16)) : 0) +
(md->out_tc_valid ? nla_total_size(sizeof(u16)) : 0) +
diff --git a/net/psample/trace.h b/net/psample/trace.h
new file mode 100644
index 000000000000..2d32a846989b
--- /dev/null
+++ b/net/psample/trace.h
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM psample
+
+#if !defined(_TRACE_PSAMPLE_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_PSAMPLE__H
+
+#include <linux/skbuff.h>
+#include <linux/tracepoint.h>
+#include <net/psample.h>
+
+TRACE_EVENT(psample_sample_packet,
+
+ TP_PROTO(struct psample_group *group, struct sk_buff *skb,
+ u32 sample_rate, const struct psample_metadata *md),
+
+ TP_ARGS(group, skb, sample_rate, md),
+
+ TP_STRUCT__entry(
+ __field(u32, group_num)
+ __field(u32, refcount)
+ __field(u32, seq)
+ __field(void *, skbaddr)
+ __field(unsigned int, len)
+ __field(unsigned int, data_len)
+ __field(u32, sample_rate)
+ __field(int, in_ifindex)
+ __field(int, out_ifindex)
+ __field(const void *, user_cookie)
+ __field(u32, user_cookie_len)
+ ),
+
+ TP_fast_assign(
+ __entry->group_num = group->group_num;
+ __entry->refcount = group->refcount;
+ __entry->seq = group->seq;
+ __entry->skbaddr = skb;
+ __entry->len = skb->len;
+ __entry->data_len = skb->data_len;
+ __entry->sample_rate = sample_rate;
+ __entry->in_ifindex = md->in_ifindex;
+ __entry->out_ifindex = md->out_ifindex;
+ __entry->user_cookie = &md->user_cookie[0];
+ __entry->user_cookie_len = md->user_cookie_len;
+ ),
+
+ TP_printk("group_num=%u refcount=%u seq=%u skbaddr=%p len=%u data_len=%u sample_rate=%u in_ifindex=%d out_ifindex=%d user_cookie=%p user_cookie_len=%u",
+ __entry->group_num, __entry->refcount, __entry->seq,
+ __entry->skbaddr, __entry->len, __entry->data_len,
+ __entry->sample_rate, __entry->in_ifindex,
+ __entry->out_ifindex, __entry->user_cookie,
+ __entry->user_cookie_len)
+);
+
+#endif /* _TRACE_PSAMPLE_H */
+
+/* This part must be outside protection */
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH ../../net/psample
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE trace
+#include <trace/define_trace.h>
--
2.44.0