1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  | # perf script event handlers, generated by perf script -g python 
 |  # (c) 2010, Tom Zanussi <tzanussi@gmail.com> 
 |  # Licensed under the terms of the GNU GPL License version 2 
 |  # 
 |  # This script tests basic functionality such as flag and symbol 
 |  # strings, common_xxx() calls back into perf, begin, end, unhandled 
 |  # events, etc.  Basically, if this script runs successfully and 
 |  # displays expected results, Python scripting support should be ok. 
 |    
 |  import os 
 |  import sys 
 |    
 |  sys.path.append(os.environ['PERF_EXEC_PATH'] + \ 
 |      '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 
 |    
 |  from Core import * 
 |  from perf_trace_context import * 
 |    
 |  unhandled = autodict() 
 |    
 |  def trace_begin(): 
 |      print "trace_begin" 
 |      pass 
 |    
 |  def trace_end(): 
 |          print_unhandled() 
 |    
 |  def irq__softirq_entry(event_name, context, common_cpu, 
 |      common_secs, common_nsecs, common_pid, common_comm, 
 |      common_callchain, vec): 
 |          print_header(event_name, common_cpu, common_secs, common_nsecs, 
 |              common_pid, common_comm) 
 |    
 |                  print_uncommon(context) 
 |    
 |          print "vec=%s\n" % \ 
 |          (symbol_str("irq__softirq_entry", "vec", vec)), 
 |    
 |  def kmem__kmalloc(event_name, context, common_cpu, 
 |      common_secs, common_nsecs, common_pid, common_comm, 
 |      common_callchain, call_site, ptr, bytes_req, bytes_alloc, 
 |      gfp_flags): 
 |          print_header(event_name, common_cpu, common_secs, common_nsecs, 
 |              common_pid, common_comm) 
 |    
 |                  print_uncommon(context) 
 |    
 |          print "call_site=%u, ptr=%u, bytes_req=%u, " \ 
 |          "bytes_alloc=%u, gfp_flags=%s\n" % \ 
 |          (call_site, ptr, bytes_req, bytes_alloc, 
 |    
 |          flag_str("kmem__kmalloc", "gfp_flags", gfp_flags)), 
 |    
 |  def trace_unhandled(event_name, context, event_fields_dict): 
 |      try: 
 |          unhandled[event_name] += 1 
 |      except TypeError: 
 |          unhandled[event_name] = 1 
 |    
 |  def print_header(event_name, cpu, secs, nsecs, pid, comm): 
 |      print "%-20s %5u %05u.%09u %8u %-20s " % \ 
 |      (event_name, cpu, secs, nsecs, pid, comm), 
 |    
 |  # print trace fields not included in handler args 
 |  def print_uncommon(context): 
 |      print "common_preempt_count=%d, common_flags=%s, common_lock_depth=%d, " \ 
 |          % (common_pc(context), trace_flag_str(common_flags(context)), \ 
 |                 common_lock_depth(context)) 
 |    
 |  def print_unhandled(): 
 |      keys = unhandled.keys() 
 |      if not keys: 
 |          return 
 |    
 |      print "\nunhandled events:\n\n", 
 |    
 |      print "%-40s  %10s\n" % ("event", "count"), 
 |      print "%-40s  %10s\n" % ("----------------------------------------", \ 
 |                                   "-----------"), 
 |    
 |      for event_name in keys: 
 |      print "%-40s  %10d\n" % (event_name, unhandled[event_name]) 
 |  
  |