summaryrefslogtreecommitdiffstats
path: root/runtime/docs/html/test4_2dtr_8c-source.html
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/docs/html/test4_2dtr_8c-source.html')
-rw-r--r--runtime/docs/html/test4_2dtr_8c-source.html371
1 files changed, 242 insertions, 129 deletions
diff --git a/runtime/docs/html/test4_2dtr_8c-source.html b/runtime/docs/html/test4_2dtr_8c-source.html
index 2847b88a..af19db1a 100644
--- a/runtime/docs/html/test4_2dtr_8c-source.html
+++ b/runtime/docs/html/test4_2dtr_8c-source.html
@@ -13,138 +13,251 @@
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
-00008 <span class="preprocessor">#include "<a class="code" href="runtime_8h.html">runtime.h</a>"</span>
-00009 <span class="preprocessor">#include "<a class="code" href="io_8c.html">io.c</a>"</span>
-00010 <span class="preprocessor">#include "<a class="code" href="map_8c.html">map.c</a>"</span>
-00011 <span class="preprocessor">#include "<a class="code" href="probes_8c.html">probes.c</a>"</span>
-00012 <span class="preprocessor">#include "<a class="code" href="stack_8c.html">stack.c</a>"</span>
-00013
-00014 MODULE_DESCRIPTION(<span class="stringliteral">"SystemTap probe: test4"</span>);
-00015 MODULE_AUTHOR(<span class="stringliteral">"Martin Hunt &lt;hunt@redhat.com&gt;"</span>);
-00016
-00017 <span class="keyword">static</span> <span class="keywordtype">char</span> tbuffer[2][50000];
-00018 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper(<span class="keywordtype">void</span> *);
-00019 <span class="keyword">static</span> DECLARE_WORK(stp_work, stp_helper, tbuffer);
-00020
-00021 <a class="code" href="structmap__root.html">MAP</a> opens, reads, writes, traces;
-00022 <span class="keyword">static</span> <span class="keywordtype">int</span> bufcount = 0;
-00023
-00024 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper (<span class="keywordtype">void</span> *data)
-00025 {
-00026 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"HELPER\n"</span>);
-00027 }
+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 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)
-00030 {
-00031 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (opens, current-&gt;comm);
-00032 <a class="code" href="group__maps.html#ga17">_stp_map_add_int64</a> (opens, 1);
-00033 jprobe_return();
-00034 <span class="keywordflow">return</span> 0;
-00035 }
-00036
-00037 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)
-00038 {
-00039 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (reads, current-&gt;comm);
-00040 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (reads, count);
-00041 jprobe_return();
-00042 <span class="keywordflow">return</span> 0;
-00043 }
-00044
-00045 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)
-00046 {
-00047 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (writes, current-&gt;comm);
-00048 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (writes, count);
-00049 jprobe_return();
-00050 <span class="keywordflow">return</span> 0;
-00051 }
+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 <span class="keywordtype">int</span> inst_show_cpuinfo(<span class="keyword">struct</span> seq_file *m, <span class="keywordtype">void</span> *v)
-00054 {
-00055 _stp_stack_print (0,0);
-00056 _stp_stack_print (1,0);
-00057
-00058 <a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a>();
-00059 <a class="code" href="group__lists.html#ga5">_stp_list_add</a> (traces, _stp_stack_sprint(0,0));
-00060 <span class="keywordflow">if</span> (bufcount++ == 0)
-00061 schedule_work (&amp;stp_work);
-00062
-00063 jprobe_return();
-00064 return 0;
-00065 }
-00066
-00067
-00068 static struct jprobe dtr_probes[] = {
-00069 {
-00070 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_open"</span>,
-00071 .entry = (kprobe_opcode_t *) inst_sys_open
-00072 },
-00073 {
-00074 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_read"</span>,
-00075 .entry = (kprobe_opcode_t *) inst_sys_read
-00076 },
-00077 {
-00078 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_write"</span>,
-00079 .entry = (kprobe_opcode_t *) inst_sys_write
-00080 },
-00081 {
-00082 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"show_cpuinfo"</span>,
-00083 .entry = (kprobe_opcode_t *) inst_show_cpuinfo,
-00084 },
-00085 };
+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 <span class="preprocessor">#define MAX_DTR_ROUTINE (sizeof(dtr_probes)/sizeof(struct jprobe))</span>
-00088 <span class="preprocessor"></span>
-00089 <span class="keyword">static</span> <span class="keywordtype">int</span> init_dtr(<span class="keywordtype">void</span>)
-00090 {
-00091 <span class="keywordtype">int</span> ret;
-00092
-00093 opens = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, INT64);
-00094 reads = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT);
-00095 writes = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT);
-00096 traces = <a class="code" href="group__lists.html#ga0">_stp_list_new</a> (1000, STRING);
-00097
-00098 ret = <a class="code" href="probes_8c.html#a2">_stp_register_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE);
-00099
-00100 <a class="code" href="group__io.html#ga0">dlog</a>(<span class="stringliteral">"instrumentation is enabled...\n"</span>);
-00101 <span class="keywordflow">return</span> ret;
+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 }
-00104
-00105 <span class="keyword">static</span> <span class="keywordtype">void</span> cleanup_dtr(<span class="keywordtype">void</span>)
-00106 {
-00107 <span class="keyword">struct </span><a class="code" href="structmap__node__stat.html">map_node_stat</a> *st;
-00108 <span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *ptr;
-00109 <span class="keyword">struct </span><a class="code" href="structmap__node__str.html">map_node_str</a> *sptr;
-00110
-00111 <a class="code" href="probes_8c.html#a1">_stp_unregister_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE);
-00112
-00113 <a class="code" href="group__maps.html#ga31">foreach</a> (traces, sptr)
-00114 dlog ("trace: %s\n", sptr-&gt;str);
-00115
-00116 foreach (opens, ptr)
-00117 dlog ("opens[%s] = %lld\n", key1str(ptr), ptr-&gt;val);
-00118 dlog ("\n");
-00119
-00120 foreach (reads, st)
-00121 dlog ("reads[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st),
-00122 st-&gt;stats.count, st-&gt;stats.sum, st-&gt;stats.min, st-&gt;stats.max);
-00123 dlog ("\n");
-00124
-00125 foreach (writes, st)
-00126 dlog ("writes[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st),
-00127 st-&gt;stats.count, st-&gt;stats.sum, st-&gt;stats.min, st-&gt;stats.max);
-00128 dlog ("\n");
-00129
-00130 _stp_map_del (opens);
-00131 _stp_map_del (reads);
-00132 _stp_map_del (writes);
-00133
-00134 dlog("EXIT\n");
-00135 }
-00136
-00137 module_init(init_dtr);
-00138 module_exit(cleanup_dtr);
-00139 MODULE_LICENSE("GPL");
+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>