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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
|
<!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="annotated.html">Data Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</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 <span class="preprocessor">#include <linux/module.h></span>
00005 <span class="preprocessor">#include <linux/interrupt.h></span>
00006 <span class="preprocessor">#include <net/sock.h></span>
00007 <span class="preprocessor">#include <linux/netlink.h></span>
00008
00009 <span class="preprocessor">#include "<a class="code" href="runtime_8h.html">runtime.h</a>"</span>
00010 <span class="preprocessor">#include "<a class="code" href="io_8c.html">io.c</a>"</span>
00011 <span class="preprocessor">#include "<a class="code" href="map_8c.html">map.c</a>"</span>
00012 <span class="preprocessor">#include "<a class="code" href="probes_8c.html">probes.c</a>"</span>
00013 <span class="preprocessor">#include "<a class="code" href="stack_8c.html">stack.c</a>"</span>
00014
00015 MODULE_DESCRIPTION(<span class="stringliteral">"SystemTap probe: test4"</span>);
00016 MODULE_AUTHOR(<span class="stringliteral">"Martin Hunt <hunt@redhat.com>"</span>);
00017
00018 <span class="keyword">static</span> <span class="keywordtype">char</span> tbuffer[2][50000];
00019 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper(<span class="keywordtype">void</span> *);
00020 <span class="keyword">static</span> DECLARE_WORK(stp_work, stp_helper, tbuffer);
00021
00022 <a class="code" href="structmap__root.html">MAP</a> opens, reads, writes, traces;
00023 <span class="keyword">static</span> <span class="keywordtype">int</span> bufcount = 0;
00024
00025 <span class="comment">/* netlink control channel */</span>
00026 <span class="keyword">static</span> <span class="keyword">struct </span>sock *control;
00027 <span class="keyword">static</span> <span class="keywordtype">int</span> seq = 0;
00028
00029 <span class="keywordtype">int</span> pid;
00030 <span class="comment">/*</span>
00031 <span class="comment"> * send_reply - send reply to userspace over netlink control channel</span>
00032 <span class="comment"> */</span>
00033 <span class="keyword">static</span> <span class="keywordtype">int</span> send_reply(<span class="keywordtype">int</span> type, <span class="keywordtype">void</span> *reply, <span class="keywordtype">int</span> len, <span class="keywordtype">int</span> pid)
00034 {
00035 <span class="keyword">struct </span>sk_buff *skb;
00036 <span class="keyword">struct </span>nlmsghdr *nlh;
00037 <span class="keywordtype">void</span> *data;
00038 <span class="keywordtype">int</span> size;
00039 <span class="keywordtype">int</span> err;
00040
00041 size = NLMSG_SPACE(len);
00042 skb = alloc_skb(size, GFP_KERNEL);
00043 <span class="keywordflow">if</span> (!skb)
00044 return -1;
00045 nlh = NLMSG_PUT(skb, pid, seq++, type, size - sizeof(*nlh));
00046 nlh->nlmsg_flags = 0;
00047 data = NLMSG_DATA(nlh);
00048 memcpy(data, reply, len);
00049 err = netlink_unicast(control, skb, pid, MSG_DONTWAIT);
00050
00051 return 0;
00052
00053 nlmsg_failure:
00054 if (skb)
00055 kfree_skb(skb);
00056
00057 return -1;
00058 }
00059
00060 static <span class="keywordtype">char</span> pbuff[1024];
00061
00062 <span class="keywordtype">void</span> nlog (const <span class="keywordtype">char</span> *fmt, ...)
00063 {
00064 <span class="keywordtype">int</span> len;
00065 va_list args;
00066 va_start(args, fmt);
00067 len = vscnprintf (pbuff, <span class="keyword">sizeof</span>(pbuff), fmt, args) + 1;
00068 va_end(args);
00069 send_reply (42, pbuff, len, pid);
00070 }
00071
00072 <span class="comment">/*</span>
00073 <span class="comment"> * msg_rcv_skb - dispatch userspace requests from netlink control channel</span>
00074 <span class="comment"> */</span>
00075 <span class="keyword">static</span> <span class="keywordtype">void</span> msg_rcv_skb(<span class="keyword">struct</span> sk_buff *skb)
00076 {
00077 <span class="keyword">struct </span>nlmsghdr *nlh = NULL;
00078 <span class="keywordtype">int</span> flags;
00079 <span class="keywordtype">int</span> nlmsglen, skblen;
00080 <span class="keywordtype">void</span> *data;
00081
00082 skblen = skb->len;
00083 <span class="comment">// dlog ("skblen = %d %d\n", skblen, sizeof(*nlh));</span>
00084 <span class="keywordflow">if</span> (skblen < <span class="keyword">sizeof</span> (*nlh))
00085 return;
00086
00087 nlh = (struct nlmsghdr *)skb->data;
00088 nlmsglen = nlh->nlmsg_len;
00089
00090 <span class="comment">// dlog ("nlmsghlen=%d\n", nlmsglen);</span>
00091 if (nlmsglen < sizeof(*nlh) || skblen < nlmsglen)
00092 return;
00093
00094 pid = nlh->nlmsg_pid;
00095 flags = nlh->nlmsg_flags;
00096
00097 <span class="comment">// dlog ("pid=%d flags=%x %x %x %x\n", pid, flags, NLM_F_REQUEST, MSG_TRUNC, NLM_F_ACK);</span>
00098 if (pid <= 0 || !(flags & NLM_F_REQUEST)) {
00099 netlink_ack(skb, nlh, -EINVAL);
00100 <span class="keywordflow">return</span>;
00101 }
00102
00103 <span class="keywordflow">if</span> (flags & MSG_TRUNC) {
00104 netlink_ack(skb, nlh, -ECOMM);
00105 <span class="keywordflow">return</span>;
00106 }
00107
00108 data = NLMSG_DATA(nlh);
00109
00110 <span class="comment">// dlog ("NETLINK: Got message \"%s\" of type %d from pid %d\n", data, nlh->nlmsg_type,pid);</span>
00111
00112 <span class="keywordflow">if</span> (flags & NLM_F_ACK)
00113 netlink_ack(skb, nlh, 0);
00114
00115 send_reply (42, "Howdy Partner", 14, pid);
00116 }
00117
00118 static <span class="keywordtype">void</span> msg_rcv(struct sock *sk, <span class="keywordtype">int</span> len)
00119 {
00120 <span class="keyword">struct </span>sk_buff *skb;
00121 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"netlink message received\n"</span>);
00122 <span class="keywordflow">while</span> ((skb = skb_dequeue(&sk->sk_receive_queue))) {
00123 msg_rcv_skb(skb);
00124 kfree_skb(skb);
00125 }
00126 }
00127
00128 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper (<span class="keywordtype">void</span> *data)
00129 {
00130 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"HELPER\n"</span>);
00131 }
00132
00133 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)
00134 {
00135 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (opens, current->comm);
00136 <a class="code" href="group__maps.html#ga17">_stp_map_add_int64</a> (opens, 1);
00137 jprobe_return();
00138 <span class="keywordflow">return</span> 0;
00139 }
00140
00141 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)
00142 {
00143 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (reads, current->comm);
00144 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (reads, count);
00145 jprobe_return();
00146 <span class="keywordflow">return</span> 0;
00147 }
00148
00149 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)
00150 {
00151 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (writes, current->comm);
00152 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (writes, count);
00153 jprobe_return();
00154 <span class="keywordflow">return</span> 0;
00155 }
00156
00157 <span class="keywordtype">int</span> inst_show_cpuinfo(<span class="keyword">struct</span> seq_file *m, <span class="keywordtype">void</span> *v)
00158 {
00159 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (0,0);
00160 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (1,0);
00161
00162 <a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a>();
00163 <a class="code" href="group__lists.html#ga5">_stp_list_add</a> (traces, _stp_stack_sprint(0,0));
00164 <span class="keywordflow">if</span> (bufcount++ == 0)
00165 schedule_work (&stp_work);
00166
00167 jprobe_return();
00168 return 0;
00169 }
00170
00171
00172 static struct jprobe dtr_probes[] = {
00173 {
00174 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_open"</span>,
00175 .entry = (kprobe_opcode_t *) inst_sys_open
00176 },
00177 {
00178 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_read"</span>,
00179 .entry = (kprobe_opcode_t *) inst_sys_read
00180 },
00181 {
00182 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_write"</span>,
00183 .entry = (kprobe_opcode_t *) inst_sys_write
00184 },
00185 {
00186 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"show_cpuinfo"</span>,
00187 .entry = (kprobe_opcode_t *) inst_show_cpuinfo,
00188 },
00189 };
00190
00191 <span class="preprocessor">#define MAX_DTR_ROUTINE (sizeof(dtr_probes)/sizeof(struct jprobe))</span>
00192 <span class="preprocessor"></span>
00193 <span class="keyword">static</span> <span class="keywordtype">int</span> init_dtr(<span class="keywordtype">void</span>)
00194 {
00195 <span class="keywordtype">int</span> ret;
00196
00197 control = netlink_kernel_create(31, msg_rcv);
00198 <span class="keywordflow">if</span> (!control) {
00199 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"Couldn't create netlink channel\n"</span>);
00200 <span class="keywordflow">return</span> -1;
00201 }
00202
00203 opens = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, INT64);
00204 reads = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT);
00205 writes = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT);
00206 traces = <a class="code" href="group__lists.html#ga0">_stp_list_new</a> (1000, STRING);
00207
00208 ret = <a class="code" href="probes_8c.html#a2">_stp_register_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE);
00209
00210 <a class="code" href="group__io.html#ga0">dlog</a>(<span class="stringliteral">"instrumentation is enabled...\n"</span>);
00211 <span class="keywordflow">return</span> ret;
00212
00213 }
00214
00215 <span class="keyword">static</span> <span class="keywordtype">void</span> cleanup_dtr(<span class="keywordtype">void</span>)
00216 {
00217 <span class="keyword">struct </span><a class="code" href="structmap__node__stat.html">map_node_stat</a> *st;
00218 <span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *ptr;
00219 <span class="keyword">struct </span><a class="code" href="structmap__node__str.html">map_node_str</a> *sptr;
00220
00221 <a class="code" href="probes_8c.html#a1">_stp_unregister_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE);
00222
00223 <a class="code" href="group__maps.html#ga31">foreach</a> (traces, sptr)
00224 nlog ("trace: %s\n", sptr->str);
00225
00226 foreach (opens, ptr)
00227 nlog ("opens[%s] = %lld\n", key1str(ptr), ptr->val);
00228 nlog ("\n");
00229
00230 foreach (reads, st)
00231 nlog ("reads[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st),
00232 st->stats.count, st->stats.sum, st->stats.min, st->stats.max);
00233 nlog ("\n");
00234
00235 foreach (writes, st)
00236 nlog ("writes[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st),
00237 st->stats.count, st->stats.sum, st->stats.min, st->stats.max);
00238 nlog ("\n");
00239
00240 _stp_map_del (opens);
00241 _stp_map_del (reads);
00242 _stp_map_del (writes);
00243
00244 if (control)
00245 sock_release(control->sk_socket);
00246
00247 dlog("EXIT\n");
00248 }
00249
00250 module_init(init_dtr);
00251 module_exit(cleanup_dtr);
00252 MODULE_LICENSE("GPL");
00253
</pre></div></body></html>
|