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
|
<!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
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 }
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 }
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 };
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;
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");
00140
</pre></div></body></html>
|