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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>SystemTap: probes/test4/dtr.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.1 -->
<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related Pages</a></div>
<div class="nav">
<a class="el" href="dir_000000.html">probes</a> / <a class="el" href="dir_000003.html">test4</a></div>
<h1>dtr.c</h1><div class="fragment"><pre class="fragment">00001 <span class="preprocessor">#define HASH_TABLE_BITS 8</span>
00002 <span class="preprocessor"></span><span class="preprocessor">#define HASH_TABLE_SIZE (1<<HASH_TABLE_BITS)</span>
00003 <span class="preprocessor"></span><span class="preprocessor">#define BUCKETS 16 </span><span class="comment">/* largest histogram width */</span>
00004
00005 <span class="preprocessor">#define STP_NETLINK_ONLY</span>
00006 <span class="preprocessor"></span><span class="preprocessor">#define STP_NUM_STRINGS 1</span>
00007 <span class="preprocessor"></span>
00008 <span class="preprocessor">#include <linux/module.h></span>
00009 <span class="preprocessor">#include <linux/interrupt.h></span>
00010 <span class="preprocessor">#include <net/sock.h></span>
00011 <span class="preprocessor">#include <linux/netlink.h></span>
00012
00013 <span class="preprocessor">#include "<a class="code" href="runtime_8h.html">runtime.h</a>"</span>
00014 <span class="preprocessor">#include "<a class="code" href="map_8c.html">map.c</a>"</span>
00015 <span class="preprocessor">#include "<a class="code" href="probes_8c.html">probes.c</a>"</span>
00016 <span class="preprocessor">#include "<a class="code" href="stack_8c.html">stack.c</a>"</span>
00017
00018 MODULE_DESCRIPTION(<span class="stringliteral">"SystemTap probe: test4"</span>);
00019 MODULE_AUTHOR(<span class="stringliteral">"Martin Hunt <hunt@redhat.com>"</span>);
00020
00021
00022 <a class="code" href="group__maps.html#ga1">MAP</a> opens, reads, writes, traces;
00023
00024 asmlinkage <span class="keywordtype">long</span> inst_sys_open (<span class="keyword">const</span> <span class="keywordtype">char</span> __user * filename, <span class="keywordtype">int</span> flags, <span class="keywordtype">int</span> mode)
00025 {
00026 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (opens, current->comm);
00027 <a class="code" href="group__maps.html#ga17">_stp_map_add_int64</a> (opens, 1);
00028 jprobe_return();
00029 <span class="keywordflow">return</span> 0;
00030 }
00031
00032 asmlinkage ssize_t inst_sys_read (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keywordtype">char</span> __user * buf, size_t count)
00033 {
00034 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (reads, current->comm);
00035 <a class="code" href="group__maps.html#ga24">_stp_map_stat_add</a> (reads, count);
00036 jprobe_return();
00037 <span class="keywordflow">return</span> 0;
00038 }
00039
00040 asmlinkage ssize_t inst_sys_write (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keyword">const</span> <span class="keywordtype">char</span> __user * buf, size_t count)
00041 {
00042 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (writes, current->comm);
00043 <a class="code" href="group__maps.html#ga24">_stp_map_stat_add</a> (writes, count);
00044 jprobe_return();
00045 <span class="keywordflow">return</span> 0;
00046 }
00047
00048 <span class="keywordtype">int</span> inst_show_cpuinfo(<span class="keyword">struct</span> seq_file *m, <span class="keywordtype">void</span> *v)
00049 {
00050 String str = <a class="code" href="group__string.html#ga2">_stp_string_init</a> (0);
00051 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (0,0);
00052 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (1,0);
00053 <a class="code" href="group__lists.html#ga6">_stp_list_add</a> (traces, <a class="code" href="group__stack.html#ga7">_stp_stack_sprint</a>(str, 0, 0));
00054
00055 jprobe_return();
00056 <span class="keywordflow">return</span> 0;
00057 }
00058
00059
00060 <span class="keyword">static</span> <span class="keyword">struct </span>jprobe dtr_probes[] = {
00061 {
00062 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_open"</span>,
00063 .entry = (kprobe_opcode_t *) inst_sys_open
00064 },
00065 {
00066 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_read"</span>,
00067 .entry = (kprobe_opcode_t *) inst_sys_read
00068 },
00069 {
00070 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_write"</span>,
00071 .entry = (kprobe_opcode_t *) inst_sys_write
00072 },
00073 {
00074 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"show_cpuinfo"</span>,
00075 .entry = (kprobe_opcode_t *) inst_show_cpuinfo,
00076 },
00077 };
00078
00079 <span class="preprocessor">#define MAX_DTR_ROUTINE (sizeof(dtr_probes)/sizeof(struct jprobe))</span>
00080 <span class="preprocessor"></span>
00081 <span class="keyword">static</span> <span class="keywordtype">int</span> init_dtr(<span class="keywordtype">void</span>)
00082 {
00083 <span class="keywordtype">int</span> ret;
00084
00085 <span class="keywordflow">if</span> (<a class="code" href="group__io.html#ga7">_stp_netlink_open</a>() < 0)
00086 return -1;
00087
00088 opens = _stp_map_new (1000, INT64);
00089 reads = _stp_map_new (1000, STAT);
00090 writes = _stp_map_new (1000, STAT);
00091 traces = _stp_list_new (1000, STRING);
00092
00093 ret = _stp_register_jprobes (dtr_probes, MAX_DTR_ROUTINE);
00094
00095 _stp_log("instrumentation is enabled...\n");
00096 return ret;
00097 }
00098
00099 static <span class="keywordtype">void</span> probe_exit (<span class="keywordtype">void</span>)
00100 {
00101 <span class="keyword">struct </span>map_node_stat *st;
00102 <span class="keyword">struct </span>map_node_int64 *ptr;
00103 <span class="keyword">struct </span>map_node_str *sptr;
00104
00105 <a class="code" href="probes_8c.html#a2">_stp_unregister_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE);
00106
00107 <a class="code" href="group__maps.html#ga32">foreach</a> (traces, sptr) {
00108 <a class="code" href="group__print.html#ga3">_stp_printf</a> (<span class="stringliteral">"trace: %s\n"</span>, sptr->str);
00109 <a class="code" href="group__print.html#ga2">_stp_print_flush</a> ();
00110 }
00111
00112 <a class="code" href="group__maps.html#ga32">foreach</a> (opens, ptr) {
00113 <a class="code" href="group__print.html#ga3">_stp_printf</a> (<span class="stringliteral">"opens[%s] = %lld\n"</span>, <a class="code" href="group__maps.html#ga25">key1str</a>(ptr), ptr->val);
00114 <a class="code" href="group__print.html#ga2">_stp_print_flush</a> ();
00115 }
00116
00117 <a class="code" href="group__maps.html#ga32">foreach</a> (reads, st) {
00118 <a class="code" href="group__print.html#ga3">_stp_printf</a> (<span class="stringliteral">"reads[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n"</span>, <a class="code" href="group__maps.html#ga25">key1str</a>(st),
00119 st->stats.count, st->stats.sum, st->stats.min, st->stats.max);
00120 <a class="code" href="group__print.html#ga2">_stp_print_flush</a> ();
00121 }
00122
00123 <a class="code" href="group__maps.html#ga32">foreach</a> (writes, st) {
00124 <a class="code" href="group__print.html#ga3">_stp_printf</a> (<span class="stringliteral">"writes[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n"</span>, <a class="code" href="group__maps.html#ga25">key1str</a>(st),
00125 st->stats.count, st->stats.sum, st->stats.min, st->stats.max);
00126 <a class="code" href="group__print.html#ga2">_stp_print_flush</a>();
00127 }
00128
00129 <a class="code" href="group__maps.html#ga7">_stp_map_del</a> (opens);
00130 <a class="code" href="group__maps.html#ga7">_stp_map_del</a> (reads);
00131 <a class="code" href="group__maps.html#ga7">_stp_map_del</a> (writes);
00132 }
00133
00134 <span class="keyword">static</span> <span class="keywordtype">void</span> cleanup_dtr(<span class="keywordtype">void</span>)
00135 {
00136 <a class="code" href="group__io.html#ga8">_stp_netlink_close</a>();
00137 }
00138
00139 module_init(init_dtr);
00140 module_exit(cleanup_dtr);
00141 MODULE_LICENSE(<span class="stringliteral">"GPL"</span>);
00142
</pre></div></body></html>
|