aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/trace.h
diff options
context:
space:
mode:
authorTuong Lien <tuong.t.lien@dektech.com.au>2018-12-18 21:17:56 -0500
committerDavid S. Miller <davem@davemloft.net>2018-12-19 14:49:24 -0500
commitb4b9771bcbbd5839b0f77aba55e2f85989ed6779 (patch)
tree4ff4e950e174540191a45b5b2cbfc5ef649f6baa /net/tipc/trace.h
parent4a54877ee767fe70a6966352c788fc5f405aa3c6 (diff)
tipc: enable tracepoints in tipc
As for the sake of debugging/tracing, the commit enables tracepoints in TIPC along with some general trace_events as shown below. It also defines some 'tipc_*_dump()' functions that allow to dump TIPC object data whenever needed, that is, for general debug purposes, ie. not just for the trace_events. The following trace_events are now available: - trace_tipc_skb_dump(): allows to trace and dump TIPC msg & skb data, e.g. message type, user, droppable, skb truesize, cloned skb, etc. - trace_tipc_list_dump(): allows to trace and dump any TIPC buffers or queues, e.g. TIPC link transmq, socket receive queue, etc. - trace_tipc_sk_dump(): allows to trace and dump TIPC socket data, e.g. sk state, sk type, connection type, rmem_alloc, socket queues, etc. - trace_tipc_link_dump(): allows to trace and dump TIPC link data, e.g. link state, silent_intv_cnt, gap, bc_gap, link queues, etc. - trace_tipc_node_dump(): allows to trace and dump TIPC node data, e.g. node state, active links, capabilities, link entries, etc. How to use: Put the trace functions at any places where we want to dump TIPC data or events. Note: a) The dump functions will generate raw data only, that is, to offload the trace event's processing, it can require a tool or script to parse the data but this should be simple. b) The trace_tipc_*_dump() should be reserved for a failure cases only (e.g. the retransmission failure case) or where we do not expect to happen too often, then we can consider enabling these events by default since they will almost not take any effects under normal conditions, but once the rare condition or failure occurs, we get the dumped data fully for post-analysis. For other trace purposes, we can reuse these trace classes as template but different events. c) A trace_event is only effective when we enable it. To enable the TIPC trace_events, echo 1 to 'enable' files in the events/tipc/ directory in the 'debugfs' file system. Normally, they are located at: /sys/kernel/debug/tracing/events/tipc/ For example: To enable the tipc_link_dump event: echo 1 > /sys/kernel/debug/tracing/events/tipc/tipc_link_dump/enable To enable all the TIPC trace_events: echo 1 > /sys/kernel/debug/tracing/events/tipc/enable To collect the trace data: cat trace or cat trace_pipe > /trace.out & To disable all the TIPC trace_events: echo 0 > /sys/kernel/debug/tracing/events/tipc/enable To clear the trace buffer: echo > trace d) Like the other trace_events, the feature like 'filter' or 'trigger' is also usable for the tipc trace_events. For more details, have a look at: Documentation/trace/ftrace.txt MAINTAINERS | add two new files 'trace.h' & 'trace.c' in tipc Acked-by: Ying Xue <ying.xue@windriver.com> Tested-by: Ying Xue <ying.xue@windriver.com> Acked-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: Tuong Lien <tuong.t.lien@dektech.com.au> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/trace.h')
-rw-r--r--net/tipc/trace.h231
1 files changed, 231 insertions, 0 deletions
diff --git a/net/tipc/trace.h b/net/tipc/trace.h
new file mode 100644
index 000000000000..4c74927df685
--- /dev/null
+++ b/net/tipc/trace.h
@@ -0,0 +1,231 @@
1/*
2 * net/tipc/trace.h: TIPC tracepoints
3 *
4 * Copyright (c) 2018, Ericsson AB
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the names of the copyright holders nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * Alternatively, this software may be distributed under the terms of the
20 * GNU General Public License ("GPL") version 2 as published by the Free
21 * Software Foundation.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "ASIS"
24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 */
35
36#undef TRACE_SYSTEM
37#define TRACE_SYSTEM tipc
38
39#if !defined(_TIPC_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
40#define _TIPC_TRACE_H
41
42#include <linux/tracepoint.h>
43#include "core.h"
44#include "link.h"
45#include "socket.h"
46#include "node.h"
47
48#define SKB_LMIN (100)
49#define SKB_LMAX (SKB_LMIN * 2)
50#define LIST_LMIN (SKB_LMIN * 3)
51#define LIST_LMAX (SKB_LMIN * 11)
52#define SK_LMIN (SKB_LMIN * 2)
53#define SK_LMAX (SKB_LMIN * 11)
54#define LINK_LMIN (SKB_LMIN)
55#define LINK_LMAX (SKB_LMIN * 16)
56#define NODE_LMIN (SKB_LMIN)
57#define NODE_LMAX (SKB_LMIN * 11)
58
59#ifndef __TIPC_TRACE_ENUM
60#define __TIPC_TRACE_ENUM
61enum {
62 TIPC_DUMP_NONE = 0,
63
64 TIPC_DUMP_TRANSMQ = 1,
65 TIPC_DUMP_BACKLOGQ = (1 << 1),
66 TIPC_DUMP_DEFERDQ = (1 << 2),
67 TIPC_DUMP_INPUTQ = (1 << 3),
68 TIPC_DUMP_WAKEUP = (1 << 4),
69
70 TIPC_DUMP_SK_SNDQ = (1 << 8),
71 TIPC_DUMP_SK_RCVQ = (1 << 9),
72 TIPC_DUMP_SK_BKLGQ = (1 << 10),
73 TIPC_DUMP_ALL = 0xffffu
74};
75#endif
76
77int tipc_skb_dump(struct sk_buff *skb, bool more, char *buf);
78int tipc_list_dump(struct sk_buff_head *list, bool more, char *buf);
79int tipc_sk_dump(struct sock *sk, u16 dqueues, char *buf);
80int tipc_link_dump(struct tipc_link *l, u16 dqueues, char *buf);
81int tipc_node_dump(struct tipc_node *n, bool more, char *buf);
82
83DECLARE_EVENT_CLASS(tipc_skb_class,
84
85 TP_PROTO(struct sk_buff *skb, bool more, const char *header),
86
87 TP_ARGS(skb, more, header),
88
89 TP_STRUCT__entry(
90 __string(header, header)
91 __dynamic_array(char, buf, (more) ? SKB_LMAX : SKB_LMIN)
92 ),
93
94 TP_fast_assign(
95 __assign_str(header, header);
96 tipc_skb_dump(skb, more, __get_str(buf));
97 ),
98
99 TP_printk("%s\n%s", __get_str(header), __get_str(buf))
100)
101
102#define DEFINE_SKB_EVENT(name) \
103DEFINE_EVENT(tipc_skb_class, name, \
104 TP_PROTO(struct sk_buff *skb, bool more, const char *header), \
105 TP_ARGS(skb, more, header))
106DEFINE_SKB_EVENT(tipc_skb_dump);
107
108DECLARE_EVENT_CLASS(tipc_list_class,
109
110 TP_PROTO(struct sk_buff_head *list, bool more, const char *header),
111
112 TP_ARGS(list, more, header),
113
114 TP_STRUCT__entry(
115 __string(header, header)
116 __dynamic_array(char, buf, (more) ? LIST_LMAX : LIST_LMIN)
117 ),
118
119 TP_fast_assign(
120 __assign_str(header, header);
121 tipc_list_dump(list, more, __get_str(buf));
122 ),
123
124 TP_printk("%s\n%s", __get_str(header), __get_str(buf))
125);
126
127#define DEFINE_LIST_EVENT(name) \
128DEFINE_EVENT(tipc_list_class, name, \
129 TP_PROTO(struct sk_buff_head *list, bool more, const char *header), \
130 TP_ARGS(list, more, header))
131DEFINE_LIST_EVENT(tipc_list_dump);
132
133DECLARE_EVENT_CLASS(tipc_sk_class,
134
135 TP_PROTO(struct sock *sk, struct sk_buff *skb, u16 dqueues,
136 const char *header),
137
138 TP_ARGS(sk, skb, dqueues, header),
139
140 TP_STRUCT__entry(
141 __string(header, header)
142 __field(u32, portid)
143 __dynamic_array(char, buf, (dqueues) ? SK_LMAX : SK_LMIN)
144 __dynamic_array(char, skb_buf, (skb) ? SKB_LMIN : 1)
145 ),
146
147 TP_fast_assign(
148 __assign_str(header, header);
149 __entry->portid = tipc_sock_get_portid(sk);
150 tipc_sk_dump(sk, dqueues, __get_str(buf));
151 if (skb)
152 tipc_skb_dump(skb, false, __get_str(skb_buf));
153 else
154 *(__get_str(skb_buf)) = '\0';
155 ),
156
157 TP_printk("<%u> %s\n%s%s", __entry->portid, __get_str(header),
158 __get_str(skb_buf), __get_str(buf))
159);
160
161#define DEFINE_SK_EVENT(name) \
162DEFINE_EVENT(tipc_sk_class, name, \
163 TP_PROTO(struct sock *sk, struct sk_buff *skb, u16 dqueues, \
164 const char *header), \
165 TP_ARGS(sk, skb, dqueues, header))
166DEFINE_SK_EVENT(tipc_sk_dump);
167
168DECLARE_EVENT_CLASS(tipc_link_class,
169
170 TP_PROTO(struct tipc_link *l, u16 dqueues, const char *header),
171
172 TP_ARGS(l, dqueues, header),
173
174 TP_STRUCT__entry(
175 __string(header, header)
176 __array(char, name, TIPC_MAX_LINK_NAME)
177 __dynamic_array(char, buf, (dqueues) ? LINK_LMAX : LINK_LMIN)
178 ),
179
180 TP_fast_assign(
181 __assign_str(header, header);
182 tipc_link_name_ext(l, __entry->name);
183 tipc_link_dump(l, dqueues, __get_str(buf));
184 ),
185
186 TP_printk("<%s> %s\n%s", __entry->name, __get_str(header),
187 __get_str(buf))
188);
189
190#define DEFINE_LINK_EVENT(name) \
191DEFINE_EVENT(tipc_link_class, name, \
192 TP_PROTO(struct tipc_link *l, u16 dqueues, const char *header), \
193 TP_ARGS(l, dqueues, header))
194DEFINE_LINK_EVENT(tipc_link_dump);
195
196DECLARE_EVENT_CLASS(tipc_node_class,
197
198 TP_PROTO(struct tipc_node *n, bool more, const char *header),
199
200 TP_ARGS(n, more, header),
201
202 TP_STRUCT__entry(
203 __string(header, header)
204 __field(u32, addr)
205 __dynamic_array(char, buf, (more) ? NODE_LMAX : NODE_LMIN)
206 ),
207
208 TP_fast_assign(
209 __assign_str(header, header);
210 __entry->addr = tipc_node_get_addr(n);
211 tipc_node_dump(n, more, __get_str(buf));
212 ),
213
214 TP_printk("<%x> %s\n%s", __entry->addr, __get_str(header),
215 __get_str(buf))
216);
217
218#define DEFINE_NODE_EVENT(name) \
219DEFINE_EVENT(tipc_node_class, name, \
220 TP_PROTO(struct tipc_node *n, bool more, const char *header), \
221 TP_ARGS(n, more, header))
222DEFINE_NODE_EVENT(tipc_node_dump);
223
224#endif /* _TIPC_TRACE_H */
225
226/* This part must be outside protection */
227#undef TRACE_INCLUDE_PATH
228#define TRACE_INCLUDE_PATH .
229#undef TRACE_INCLUDE_FILE
230#define TRACE_INCLUDE_FILE trace
231#include <trace/define_trace.h>