summaryrefslogtreecommitdiffstats
path: root/runtime/docs/html/test4_2dtr_8c-source.html
blob: af19db1ad640ac3bf5999e5377694f655c591fc9 (plain)
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&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
<div class="nav">
<a class="el" href="dir_000000.html">probes</a>&nbsp;/&nbsp;<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&lt;&lt;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 &lt;linux/module.h&gt;</span>
00005 <span class="preprocessor">#include &lt;linux/interrupt.h&gt;</span>
00006 <span class="preprocessor">#include &lt;net/sock.h&gt;</span>
00007 <span class="preprocessor">#include &lt;linux/netlink.h&gt;</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 &lt;hunt@redhat.com&gt;"</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-&gt;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-&gt;len;
00083         <span class="comment">//      dlog ("skblen = %d %d\n", skblen, sizeof(*nlh));</span>
00084         <span class="keywordflow">if</span> (skblen &lt; <span class="keyword">sizeof</span> (*nlh))
00085                 return; 
00086 
00087         nlh = (struct nlmsghdr *)skb-&gt;data;
00088         nlmsglen = nlh-&gt;nlmsg_len;
00089         
00090         <span class="comment">//      dlog ("nlmsghlen=%d\n", nlmsglen);</span>
00091         if (nlmsglen &lt; sizeof(*nlh) || skblen &lt; nlmsglen)
00092                 return;
00093 
00094         pid = nlh-&gt;nlmsg_pid;
00095         flags = nlh-&gt;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 &lt;= 0 || !(flags &amp; NLM_F_REQUEST)) {
00099                 netlink_ack(skb, nlh, -EINVAL);
00100                 <span class="keywordflow">return</span>;
00101         }
00102 
00103         <span class="keywordflow">if</span> (flags &amp; 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-&gt;nlmsg_type,pid);</span>
00111         
00112         <span class="keywordflow">if</span> (flags &amp; 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(&amp;sk-&gt;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-&gt;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-&gt;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-&gt;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 (&amp;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-&gt;str);
00225 
00226   foreach (opens, ptr)
00227     nlog ("opens[%s] = %lld\n", key1str(ptr), ptr-&gt;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-&gt;stats.count, st-&gt;stats.sum, st-&gt;stats.min, st-&gt;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-&gt;stats.count, st-&gt;stats.sum, st-&gt;stats.min, st-&gt;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-&gt;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>