]>
Commit | Line | Data |
---|---|---|
63e03724 | 1 | # Monitor the system for dropped packets and proudce a report of drop locations and counts |
b2441318 | 2 | # SPDX-License-Identifier: GPL-2.0 |
63e03724 | 3 | |
8c42b960 TJ |
4 | from __future__ import print_function |
5 | ||
63e03724 NH |
6 | import os |
7 | import sys | |
8 | ||
9 | sys.path.append(os.environ['PERF_EXEC_PATH'] + \ | |
b504d7f6 | 10 | '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') |
63e03724 NH |
11 | |
12 | from perf_trace_context import * | |
13 | from Core import * | |
14 | from Util import * | |
15 | ||
16 | drop_log = {} | |
17 | kallsyms = [] | |
18 | ||
19 | def get_kallsyms_table(): | |
20 | global kallsyms | |
6b75c735 | 21 | |
63e03724 NH |
22 | try: |
23 | f = open("/proc/kallsyms", "r") | |
63e03724 NH |
24 | except: |
25 | return | |
26 | ||
63e03724 NH |
27 | for line in f: |
28 | loc = int(line.split()[0], 16) | |
29 | name = line.split()[2] | |
326017c7 | 30 | kallsyms.append((loc, name)) |
63e03724 | 31 | kallsyms.sort() |
63e03724 NH |
32 | |
33 | def get_sym(sloc): | |
34 | loc = int(sloc) | |
0ce58bae BH |
35 | |
36 | # Invariant: kallsyms[i][0] <= loc for all 0 <= i <= start | |
37 | # kallsyms[i][0] > loc for all end <= i < len(kallsyms) | |
38 | start, end = -1, len(kallsyms) | |
39 | while end != start + 1: | |
40 | pivot = (start + end) // 2 | |
41 | if loc < kallsyms[pivot][0]: | |
42 | end = pivot | |
43 | else: | |
44 | start = pivot | |
45 | ||
46 | # Now (start == -1 or kallsyms[start][0] <= loc) | |
47 | # and (start == len(kallsyms) - 1 or loc < kallsyms[start + 1][0]) | |
48 | if start >= 0: | |
49 | symloc, name = kallsyms[start] | |
50 | return (name, loc - symloc) | |
51 | else: | |
52 | return (None, 0) | |
63e03724 NH |
53 | |
54 | def print_drop_table(): | |
8c42b960 | 55 | print("%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT")) |
63e03724 NH |
56 | for i in drop_log.keys(): |
57 | (sym, off) = get_sym(i) | |
58 | if sym == None: | |
59 | sym = i | |
8c42b960 | 60 | print("%25s %25s %25s" % (sym, off, drop_log[i])) |
63e03724 NH |
61 | |
62 | ||
63 | def trace_begin(): | |
8c42b960 | 64 | print("Starting trace (Ctrl-C to dump results)") |
63e03724 NH |
65 | |
66 | def trace_end(): | |
8c42b960 | 67 | print("Gathering kallsyms data") |
63e03724 NH |
68 | get_kallsyms_table() |
69 | print_drop_table() | |
70 | ||
71 | # called from perf, when it finds a correspoinding event | |
0f5f5bcd | 72 | def skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm, callchain, |
140c3c6a | 73 | skbaddr, location, protocol): |
63e03724 NH |
74 | slocation = str(location) |
75 | try: | |
76 | drop_log[slocation] = drop_log[slocation] + 1 | |
77 | except: | |
78 | drop_log[slocation] = 1 |