diff options
Diffstat (limited to 'runtime/docs/html/test4_2dtr_8c-source.html')
-rw-r--r-- | runtime/docs/html/test4_2dtr_8c-source.html | 371 |
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 <linux/module.h></span> 00005 <span class="preprocessor">#include <linux/interrupt.h></span> 00006 <span class="preprocessor">#include <net/sock.h></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 <hunt@redhat.com>"</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 <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 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->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->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->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->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 (&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->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 <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->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 } -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->str); -00115 -00116 foreach (opens, ptr) -00117 dlog ("opens[%s] = %lld\n", key1str(ptr), ptr->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->stats.count, st->stats.sum, st->stats.min, st->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->stats.count, st->stats.sum, st->stats.min, st->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 & 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> |