Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
oprofile
oprofile_files.c
Go to the documentation of this file.
1
10
#include <linux/fs.h>
11
#include <
linux/oprofile.h
>
12
#include <
linux/jiffies.h
>
13
14
#include "
event_buffer.h
"
15
#include "
oprofile_stats.h
"
16
#include "
oprof.h
"
17
18
#define BUFFER_SIZE_DEFAULT 131072
19
#define CPU_BUFFER_SIZE_DEFAULT 8192
20
#define BUFFER_WATERSHED_DEFAULT 32768
/* FIXME: tune */
21
#define TIME_SLICE_DEFAULT 1
22
23
unsigned
long
oprofile_buffer_size
;
24
unsigned
long
oprofile_cpu_buffer_size
;
25
unsigned
long
oprofile_buffer_watershed
;
26
unsigned
long
oprofile_time_slice
;
27
28
#ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX
29
30
static
ssize_t
timeout_read(
struct
file
*
file
,
char
__user *
buf
,
31
size_t
count
, loff_t *
offset
)
32
{
33
return
oprofilefs_ulong_to_user
(
jiffies_to_msecs
(
oprofile_time_slice
),
34
buf, count, offset);
35
}
36
37
38
static
ssize_t
timeout_write(
struct
file
*
file
,
char
const
__user *
buf
,
39
size_t
count
, loff_t *
offset
)
40
{
41
unsigned
long
val
;
42
int
retval
;
43
44
if
(*offset)
45
return
-
EINVAL
;
46
47
retval =
oprofilefs_ulong_from_user
(&val, buf, count);
48
if
(retval <= 0)
49
return
retval
;
50
51
retval =
oprofile_set_timeout
(val);
52
53
if
(retval)
54
return
retval
;
55
return
count
;
56
}
57
58
59
static
const
struct
file_operations
timeout_fops = {
60
.
read
= timeout_read,
61
.write = timeout_write,
62
.llseek =
default_llseek
,
63
};
64
65
#endif
66
67
68
static
ssize_t
depth_read(
struct
file *file,
char
__user *buf,
size_t
count, loff_t *offset)
69
{
70
return
oprofilefs_ulong_to_user
(
oprofile_backtrace_depth
, buf, count,
71
offset);
72
}
73
74
75
static
ssize_t
depth_write(
struct
file *file,
char
const
__user *buf,
size_t
count, loff_t *offset)
76
{
77
unsigned
long
val
;
78
int
retval
;
79
80
if
(*offset)
81
return
-
EINVAL
;
82
83
if
(!
oprofile_ops
.backtrace)
84
return
-
EINVAL
;
85
86
retval =
oprofilefs_ulong_from_user
(&val, buf, count);
87
if
(retval <= 0)
88
return
retval
;
89
90
retval =
oprofile_set_ulong
(&
oprofile_backtrace_depth
, val);
91
if
(retval)
92
return
retval
;
93
94
return
count
;
95
}
96
97
98
static
const
struct
file_operations
depth_fops = {
99
.read = depth_read,
100
.write = depth_write,
101
.llseek =
default_llseek
,
102
};
103
104
105
static
ssize_t
pointer_size_read(
struct
file *file,
char
__user *buf,
size_t
count, loff_t *offset)
106
{
107
return
oprofilefs_ulong_to_user
(
sizeof
(
void
*), buf, count, offset);
108
}
109
110
111
static
const
struct
file_operations
pointer_size_fops = {
112
.read = pointer_size_read,
113
.llseek =
default_llseek
,
114
};
115
116
117
static
ssize_t
cpu_type_read(
struct
file *file,
char
__user *buf,
size_t
count, loff_t *offset)
118
{
119
return
oprofilefs_str_to_user
(
oprofile_ops
.cpu_type, buf, count, offset);
120
}
121
122
123
static
const
struct
file_operations
cpu_type_fops = {
124
.read = cpu_type_read,
125
.llseek =
default_llseek
,
126
};
127
128
129
static
ssize_t
enable_read(
struct
file *file,
char
__user *buf,
size_t
count, loff_t *offset)
130
{
131
return
oprofilefs_ulong_to_user
(
oprofile_started
, buf, count, offset);
132
}
133
134
135
static
ssize_t
enable_write(
struct
file *file,
char
const
__user *buf,
size_t
count, loff_t *offset)
136
{
137
unsigned
long
val
;
138
int
retval
;
139
140
if
(*offset)
141
return
-
EINVAL
;
142
143
retval =
oprofilefs_ulong_from_user
(&val, buf, count);
144
if
(retval <= 0)
145
return
retval
;
146
147
retval = 0;
148
if
(val)
149
retval =
oprofile_start
();
150
else
151
oprofile_stop
();
152
153
if
(retval)
154
return
retval
;
155
return
count
;
156
}
157
158
159
static
const
struct
file_operations
enable_fops = {
160
.read = enable_read,
161
.write = enable_write,
162
.llseek =
default_llseek
,
163
};
164
165
166
static
ssize_t
dump_write(
struct
file *file,
char
const
__user *buf,
size_t
count, loff_t *offset)
167
{
168
wake_up_buffer_waiter
();
169
return
count
;
170
}
171
172
173
static
const
struct
file_operations
dump_fops = {
174
.write = dump_write,
175
.llseek =
noop_llseek
,
176
};
177
178
void
oprofile_create_files
(
struct
super_block
*
sb
,
struct
dentry
*root)
179
{
180
/* reinitialize default values */
181
oprofile_buffer_size
=
BUFFER_SIZE_DEFAULT
;
182
oprofile_cpu_buffer_size
=
CPU_BUFFER_SIZE_DEFAULT
;
183
oprofile_buffer_watershed
=
BUFFER_WATERSHED_DEFAULT
;
184
oprofile_time_slice
=
msecs_to_jiffies
(
TIME_SLICE_DEFAULT
);
185
186
oprofilefs_create_file
(sb, root,
"enable"
, &enable_fops);
187
oprofilefs_create_file_perm
(sb, root,
"dump"
, &dump_fops, 0666);
188
oprofilefs_create_file
(sb, root,
"buffer"
, &
event_buffer_fops
);
189
oprofilefs_create_ulong
(sb, root,
"buffer_size"
, &
oprofile_buffer_size
);
190
oprofilefs_create_ulong
(sb, root,
"buffer_watershed"
, &
oprofile_buffer_watershed
);
191
oprofilefs_create_ulong
(sb, root,
"cpu_buffer_size"
, &
oprofile_cpu_buffer_size
);
192
oprofilefs_create_file
(sb, root,
"cpu_type"
, &cpu_type_fops);
193
oprofilefs_create_file
(sb, root,
"backtrace_depth"
, &depth_fops);
194
oprofilefs_create_file
(sb, root,
"pointer_size"
, &pointer_size_fops);
195
#ifdef CONFIG_OPROFILE_EVENT_MULTIPLEX
196
oprofilefs_create_file
(sb, root,
"time_slice"
, &timeout_fops);
197
#endif
198
oprofile_create_stats_files
(sb, root);
199
if
(
oprofile_ops
.create_files)
200
oprofile_ops
.create_files(sb, root);
201
}
Generated on Thu Jan 10 2013 14:13:39 for Linux Kernel by
1.8.2