aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/link.c
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/link.c
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/link.c')
-rw-r--r--net/tipc/link.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 9e265eb89726..668dab529021 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -43,6 +43,7 @@
43#include "discover.h" 43#include "discover.h"
44#include "netlink.h" 44#include "netlink.h"
45#include "monitor.h" 45#include "monitor.h"
46#include "trace.h"
46 47
47#include <linux/pkt_sched.h> 48#include <linux/pkt_sched.h>
48 49
@@ -2222,3 +2223,122 @@ void tipc_link_set_abort_limit(struct tipc_link *l, u32 limit)
2222{ 2223{
2223 l->abort_limit = limit; 2224 l->abort_limit = limit;
2224} 2225}
2226
2227char *tipc_link_name_ext(struct tipc_link *l, char *buf)
2228{
2229 if (!l)
2230 scnprintf(buf, TIPC_MAX_LINK_NAME, "null");
2231 else if (link_is_bc_sndlink(l))
2232 scnprintf(buf, TIPC_MAX_LINK_NAME, "broadcast-sender");
2233 else if (link_is_bc_rcvlink(l))
2234 scnprintf(buf, TIPC_MAX_LINK_NAME,
2235 "broadcast-receiver, peer %x", l->addr);
2236 else
2237 memcpy(buf, l->name, TIPC_MAX_LINK_NAME);
2238
2239 return buf;
2240}
2241
2242/**
2243 * tipc_link_dump - dump TIPC link data
2244 * @l: tipc link to be dumped
2245 * @dqueues: bitmask to decide if any link queue to be dumped?
2246 * - TIPC_DUMP_NONE: don't dump link queues
2247 * - TIPC_DUMP_TRANSMQ: dump link transmq queue
2248 * - TIPC_DUMP_BACKLOGQ: dump link backlog queue
2249 * - TIPC_DUMP_DEFERDQ: dump link deferd queue
2250 * - TIPC_DUMP_INPUTQ: dump link input queue
2251 * - TIPC_DUMP_WAKEUP: dump link wakeup queue
2252 * - TIPC_DUMP_ALL: dump all the link queues above
2253 * @buf: returned buffer of dump data in format
2254 */
2255int tipc_link_dump(struct tipc_link *l, u16 dqueues, char *buf)
2256{
2257 int i = 0;
2258 size_t sz = (dqueues) ? LINK_LMAX : LINK_LMIN;
2259 struct sk_buff_head *list;
2260 struct sk_buff *hskb, *tskb;
2261 u32 len;
2262
2263 if (!l) {
2264 i += scnprintf(buf, sz, "link data: (null)\n");
2265 return i;
2266 }
2267
2268 i += scnprintf(buf, sz, "link data: %x", l->addr);
2269 i += scnprintf(buf + i, sz - i, " %x", l->state);
2270 i += scnprintf(buf + i, sz - i, " %u", l->in_session);
2271 i += scnprintf(buf + i, sz - i, " %u", l->session);
2272 i += scnprintf(buf + i, sz - i, " %u", l->peer_session);
2273 i += scnprintf(buf + i, sz - i, " %u", l->snd_nxt);
2274 i += scnprintf(buf + i, sz - i, " %u", l->rcv_nxt);
2275 i += scnprintf(buf + i, sz - i, " %u", l->snd_nxt_state);
2276 i += scnprintf(buf + i, sz - i, " %u", l->rcv_nxt_state);
2277 i += scnprintf(buf + i, sz - i, " %x", l->peer_caps);
2278 i += scnprintf(buf + i, sz - i, " %u", l->silent_intv_cnt);
2279 i += scnprintf(buf + i, sz - i, " %u", l->rst_cnt);
2280 i += scnprintf(buf + i, sz - i, " %u", l->prev_from);
2281 i += scnprintf(buf + i, sz - i, " %u", l->stale_cnt);
2282 i += scnprintf(buf + i, sz - i, " %u", l->acked);
2283
2284 list = &l->transmq;
2285 len = skb_queue_len(list);
2286 hskb = skb_peek(list);
2287 tskb = skb_peek_tail(list);
2288 i += scnprintf(buf + i, sz - i, " | %u %u %u", len,
2289 (hskb) ? msg_seqno(buf_msg(hskb)) : 0,
2290 (tskb) ? msg_seqno(buf_msg(tskb)) : 0);
2291
2292 list = &l->deferdq;
2293 len = skb_queue_len(list);
2294 hskb = skb_peek(list);
2295 tskb = skb_peek_tail(list);
2296 i += scnprintf(buf + i, sz - i, " | %u %u %u", len,
2297 (hskb) ? msg_seqno(buf_msg(hskb)) : 0,
2298 (tskb) ? msg_seqno(buf_msg(tskb)) : 0);
2299
2300 list = &l->backlogq;
2301 len = skb_queue_len(list);
2302 hskb = skb_peek(list);
2303 tskb = skb_peek_tail(list);
2304 i += scnprintf(buf + i, sz - i, " | %u %u %u", len,
2305 (hskb) ? msg_seqno(buf_msg(hskb)) : 0,
2306 (tskb) ? msg_seqno(buf_msg(tskb)) : 0);
2307
2308 list = l->inputq;
2309 len = skb_queue_len(list);
2310 hskb = skb_peek(list);
2311 tskb = skb_peek_tail(list);
2312 i += scnprintf(buf + i, sz - i, " | %u %u %u\n", len,
2313 (hskb) ? msg_seqno(buf_msg(hskb)) : 0,
2314 (tskb) ? msg_seqno(buf_msg(tskb)) : 0);
2315
2316 if (dqueues & TIPC_DUMP_TRANSMQ) {
2317 i += scnprintf(buf + i, sz - i, "transmq: ");
2318 i += tipc_list_dump(&l->transmq, false, buf + i);
2319 }
2320 if (dqueues & TIPC_DUMP_BACKLOGQ) {
2321 i += scnprintf(buf + i, sz - i,
2322 "backlogq: <%u %u %u %u %u>, ",
2323 l->backlog[TIPC_LOW_IMPORTANCE].len,
2324 l->backlog[TIPC_MEDIUM_IMPORTANCE].len,
2325 l->backlog[TIPC_HIGH_IMPORTANCE].len,
2326 l->backlog[TIPC_CRITICAL_IMPORTANCE].len,
2327 l->backlog[TIPC_SYSTEM_IMPORTANCE].len);
2328 i += tipc_list_dump(&l->backlogq, false, buf + i);
2329 }
2330 if (dqueues & TIPC_DUMP_DEFERDQ) {
2331 i += scnprintf(buf + i, sz - i, "deferdq: ");
2332 i += tipc_list_dump(&l->deferdq, false, buf + i);
2333 }
2334 if (dqueues & TIPC_DUMP_INPUTQ) {
2335 i += scnprintf(buf + i, sz - i, "inputq: ");
2336 i += tipc_list_dump(l->inputq, false, buf + i);
2337 }
2338 if (dqueues & TIPC_DUMP_WAKEUP) {
2339 i += scnprintf(buf + i, sz - i, "wakeup: ");
2340 i += tipc_list_dump(&l->wakeupq, false, buf + i);
2341 }
2342
2343 return i;
2344}