diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-23 13:05:40 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-23 13:05:40 -0400 |
commit | 92fb83afd6664a6f8a05f990d264c998f9b99f69 (patch) | |
tree | b5c65f2a14d1019d8e00d94dafbc65696906455c /drivers/oprofile | |
parent | a5344876065e047d507800d0801a637d68d3b129 (diff) | |
parent | df13b31c286b3e91c556167954eda088d90a4295 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rric/oprofile
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rric/oprofile: (21 commits)
OProfile: Fix buffer synchronization for IBS
oprofile: hotplug cpu fix
oprofile: fixing whitespaces in arch/x86/oprofile/*
oprofile: fixing whitespaces in arch/x86/oprofile/*
oprofile: fixing whitespaces in drivers/oprofile/*
x86/oprofile: add the logic for enabling additional IBS bits
x86/oprofile: reordering functions in nmi_int.c
x86/oprofile: removing unused function parameter in add_ibs_begin()
oprofile: more whitespace fixes
oprofile: whitespace fixes
OProfile: Rename IBS sysfs dir into "ibs_op"
OProfile: Rework string handling in setup_ibs_files()
OProfile: Rework oprofile_add_ibs_sample() function
oprofile: discover counters for op ppro too
oprofile: Implement Intel architectural perfmon support
oprofile: Don't report Nehalem as core_2
oprofile: drop const in num counters field
Revert "Oprofile Multiplexing Patch"
x86, oprofile: BUG: using smp_processor_id() in preemptible code
x86/oprofile: fix on_each_cpu build error
...
Manually fixed trivial conflicts in
drivers/oprofile/{cpu_buffer.c,event_buffer.h}
Diffstat (limited to 'drivers/oprofile')
-rw-r--r-- | drivers/oprofile/buffer_sync.c | 17 | ||||
-rw-r--r-- | drivers/oprofile/buffer_sync.h | 4 | ||||
-rw-r--r-- | drivers/oprofile/cpu_buffer.c | 91 | ||||
-rw-r--r-- | drivers/oprofile/cpu_buffer.h | 12 | ||||
-rw-r--r-- | drivers/oprofile/event_buffer.c | 34 | ||||
-rw-r--r-- | drivers/oprofile/event_buffer.h | 10 | ||||
-rw-r--r-- | drivers/oprofile/oprof.c | 26 | ||||
-rw-r--r-- | drivers/oprofile/oprof.h | 12 | ||||
-rw-r--r-- | drivers/oprofile/oprofile_files.c | 36 | ||||
-rw-r--r-- | drivers/oprofile/oprofile_stats.c | 24 | ||||
-rw-r--r-- | drivers/oprofile/oprofile_stats.h | 10 | ||||
-rw-r--r-- | drivers/oprofile/oprofilefs.c | 78 | ||||
-rw-r--r-- | drivers/oprofile/timer_int.c | 4 |
13 files changed, 174 insertions, 184 deletions
diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index 37681700b61a..b55cd23ffdef 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c | |||
@@ -41,7 +41,6 @@ static cpumask_t marked_cpus = CPU_MASK_NONE; | |||
41 | static DEFINE_SPINLOCK(task_mortuary); | 41 | static DEFINE_SPINLOCK(task_mortuary); |
42 | static void process_task_mortuary(void); | 42 | static void process_task_mortuary(void); |
43 | 43 | ||
44 | |||
45 | /* Take ownership of the task struct and place it on the | 44 | /* Take ownership of the task struct and place it on the |
46 | * list for processing. Only after two full buffer syncs | 45 | * list for processing. Only after two full buffer syncs |
47 | * does the task eventually get freed, because by then | 46 | * does the task eventually get freed, because by then |
@@ -341,7 +340,7 @@ static void add_trace_begin(void) | |||
341 | * Add IBS fetch and op entries to event buffer | 340 | * Add IBS fetch and op entries to event buffer |
342 | */ | 341 | */ |
343 | static void add_ibs_begin(struct oprofile_cpu_buffer *cpu_buf, int code, | 342 | static void add_ibs_begin(struct oprofile_cpu_buffer *cpu_buf, int code, |
344 | int in_kernel, struct mm_struct *mm) | 343 | struct mm_struct *mm) |
345 | { | 344 | { |
346 | unsigned long rip; | 345 | unsigned long rip; |
347 | int i, count; | 346 | int i, count; |
@@ -565,9 +564,11 @@ void sync_buffer(int cpu) | |||
565 | struct task_struct *new; | 564 | struct task_struct *new; |
566 | unsigned long cookie = 0; | 565 | unsigned long cookie = 0; |
567 | int in_kernel = 1; | 566 | int in_kernel = 1; |
568 | unsigned int i; | ||
569 | sync_buffer_state state = sb_buffer_start; | 567 | sync_buffer_state state = sb_buffer_start; |
568 | #ifndef CONFIG_OPROFILE_IBS | ||
569 | unsigned int i; | ||
570 | unsigned long available; | 570 | unsigned long available; |
571 | #endif | ||
571 | 572 | ||
572 | mutex_lock(&buffer_mutex); | 573 | mutex_lock(&buffer_mutex); |
573 | 574 | ||
@@ -575,9 +576,13 @@ void sync_buffer(int cpu) | |||
575 | 576 | ||
576 | /* Remember, only we can modify tail_pos */ | 577 | /* Remember, only we can modify tail_pos */ |
577 | 578 | ||
579 | #ifndef CONFIG_OPROFILE_IBS | ||
578 | available = get_slots(cpu_buf); | 580 | available = get_slots(cpu_buf); |
579 | 581 | ||
580 | for (i = 0; i < available; ++i) { | 582 | for (i = 0; i < available; ++i) { |
583 | #else | ||
584 | while (get_slots(cpu_buf)) { | ||
585 | #endif | ||
581 | struct op_sample *s = &cpu_buf->buffer[cpu_buf->tail_pos]; | 586 | struct op_sample *s = &cpu_buf->buffer[cpu_buf->tail_pos]; |
582 | 587 | ||
583 | if (is_code(s->eip)) { | 588 | if (is_code(s->eip)) { |
@@ -593,12 +598,10 @@ void sync_buffer(int cpu) | |||
593 | #ifdef CONFIG_OPROFILE_IBS | 598 | #ifdef CONFIG_OPROFILE_IBS |
594 | } else if (s->event == IBS_FETCH_BEGIN) { | 599 | } else if (s->event == IBS_FETCH_BEGIN) { |
595 | state = sb_bt_start; | 600 | state = sb_bt_start; |
596 | add_ibs_begin(cpu_buf, | 601 | add_ibs_begin(cpu_buf, IBS_FETCH_CODE, mm); |
597 | IBS_FETCH_CODE, in_kernel, mm); | ||
598 | } else if (s->event == IBS_OP_BEGIN) { | 602 | } else if (s->event == IBS_OP_BEGIN) { |
599 | state = sb_bt_start; | 603 | state = sb_bt_start; |
600 | add_ibs_begin(cpu_buf, | 604 | add_ibs_begin(cpu_buf, IBS_OP_CODE, mm); |
601 | IBS_OP_CODE, in_kernel, mm); | ||
602 | #endif | 605 | #endif |
603 | } else { | 606 | } else { |
604 | struct mm_struct *oldmm = mm; | 607 | struct mm_struct *oldmm = mm; |
diff --git a/drivers/oprofile/buffer_sync.h b/drivers/oprofile/buffer_sync.h index 08866f6a96a3..3110732c1835 100644 --- a/drivers/oprofile/buffer_sync.h +++ b/drivers/oprofile/buffer_sync.h | |||
@@ -9,13 +9,13 @@ | |||
9 | 9 | ||
10 | #ifndef OPROFILE_BUFFER_SYNC_H | 10 | #ifndef OPROFILE_BUFFER_SYNC_H |
11 | #define OPROFILE_BUFFER_SYNC_H | 11 | #define OPROFILE_BUFFER_SYNC_H |
12 | 12 | ||
13 | /* add the necessary profiling hooks */ | 13 | /* add the necessary profiling hooks */ |
14 | int sync_start(void); | 14 | int sync_start(void); |
15 | 15 | ||
16 | /* remove the hooks */ | 16 | /* remove the hooks */ |
17 | void sync_stop(void); | 17 | void sync_stop(void); |
18 | 18 | ||
19 | /* sync the given CPU's buffer */ | 19 | /* sync the given CPU's buffer */ |
20 | void sync_buffer(int cpu); | 20 | void sync_buffer(int cpu); |
21 | 21 | ||
diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c index 7ba39fe20a8a..01d38e78cde1 100644 --- a/drivers/oprofile/cpu_buffer.c +++ b/drivers/oprofile/cpu_buffer.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <linux/oprofile.h> | 22 | #include <linux/oprofile.h> |
23 | #include <linux/vmalloc.h> | 23 | #include <linux/vmalloc.h> |
24 | #include <linux/errno.h> | 24 | #include <linux/errno.h> |
25 | 25 | ||
26 | #include "event_buffer.h" | 26 | #include "event_buffer.h" |
27 | #include "cpu_buffer.h" | 27 | #include "cpu_buffer.h" |
28 | #include "buffer_sync.h" | 28 | #include "buffer_sync.h" |
@@ -39,7 +39,7 @@ void free_cpu_buffers(void) | |||
39 | { | 39 | { |
40 | int i; | 40 | int i; |
41 | 41 | ||
42 | for_each_online_cpu(i) { | 42 | for_each_possible_cpu(i) { |
43 | vfree(per_cpu(cpu_buffer, i).buffer); | 43 | vfree(per_cpu(cpu_buffer, i).buffer); |
44 | per_cpu(cpu_buffer, i).buffer = NULL; | 44 | per_cpu(cpu_buffer, i).buffer = NULL; |
45 | } | 45 | } |
@@ -61,17 +61,17 @@ void oprofile_cpu_buffer_inc_smpl_lost(void) | |||
61 | int alloc_cpu_buffers(void) | 61 | int alloc_cpu_buffers(void) |
62 | { | 62 | { |
63 | int i; | 63 | int i; |
64 | 64 | ||
65 | unsigned long buffer_size = fs_cpu_buffer_size; | 65 | unsigned long buffer_size = fs_cpu_buffer_size; |
66 | 66 | ||
67 | for_each_online_cpu(i) { | 67 | for_each_possible_cpu(i) { |
68 | struct oprofile_cpu_buffer *b = &per_cpu(cpu_buffer, i); | 68 | struct oprofile_cpu_buffer *b = &per_cpu(cpu_buffer, i); |
69 | 69 | ||
70 | b->buffer = vmalloc_node(sizeof(struct op_sample) * buffer_size, | 70 | b->buffer = vmalloc_node(sizeof(struct op_sample) * buffer_size, |
71 | cpu_to_node(i)); | 71 | cpu_to_node(i)); |
72 | if (!b->buffer) | 72 | if (!b->buffer) |
73 | goto fail; | 73 | goto fail; |
74 | 74 | ||
75 | b->last_task = NULL; | 75 | b->last_task = NULL; |
76 | b->last_is_kernel = -1; | 76 | b->last_is_kernel = -1; |
77 | b->tracing = 0; | 77 | b->tracing = 0; |
@@ -125,7 +125,7 @@ void end_cpu_work(void) | |||
125 | } | 125 | } |
126 | 126 | ||
127 | /* Resets the cpu buffer to a sane state. */ | 127 | /* Resets the cpu buffer to a sane state. */ |
128 | void cpu_buffer_reset(struct oprofile_cpu_buffer * cpu_buf) | 128 | void cpu_buffer_reset(struct oprofile_cpu_buffer *cpu_buf) |
129 | { | 129 | { |
130 | /* reset these to invalid values; the next sample | 130 | /* reset these to invalid values; the next sample |
131 | * collected will populate the buffer with proper | 131 | * collected will populate the buffer with proper |
@@ -136,7 +136,7 @@ void cpu_buffer_reset(struct oprofile_cpu_buffer * cpu_buf) | |||
136 | } | 136 | } |
137 | 137 | ||
138 | /* compute number of available slots in cpu_buffer queue */ | 138 | /* compute number of available slots in cpu_buffer queue */ |
139 | static unsigned long nr_available_slots(struct oprofile_cpu_buffer const * b) | 139 | static unsigned long nr_available_slots(struct oprofile_cpu_buffer const *b) |
140 | { | 140 | { |
141 | unsigned long head = b->head_pos; | 141 | unsigned long head = b->head_pos; |
142 | unsigned long tail = b->tail_pos; | 142 | unsigned long tail = b->tail_pos; |
@@ -147,7 +147,7 @@ static unsigned long nr_available_slots(struct oprofile_cpu_buffer const * b) | |||
147 | return tail + (b->buffer_size - head) - 1; | 147 | return tail + (b->buffer_size - head) - 1; |
148 | } | 148 | } |
149 | 149 | ||
150 | static void increment_head(struct oprofile_cpu_buffer * b) | 150 | static void increment_head(struct oprofile_cpu_buffer *b) |
151 | { | 151 | { |
152 | unsigned long new_head = b->head_pos + 1; | 152 | unsigned long new_head = b->head_pos + 1; |
153 | 153 | ||
@@ -162,17 +162,17 @@ static void increment_head(struct oprofile_cpu_buffer * b) | |||
162 | } | 162 | } |
163 | 163 | ||
164 | static inline void | 164 | static inline void |
165 | add_sample(struct oprofile_cpu_buffer * cpu_buf, | 165 | add_sample(struct oprofile_cpu_buffer *cpu_buf, |
166 | unsigned long pc, unsigned long event) | 166 | unsigned long pc, unsigned long event) |
167 | { | 167 | { |
168 | struct op_sample * entry = &cpu_buf->buffer[cpu_buf->head_pos]; | 168 | struct op_sample *entry = &cpu_buf->buffer[cpu_buf->head_pos]; |
169 | entry->eip = pc; | 169 | entry->eip = pc; |
170 | entry->event = event; | 170 | entry->event = event; |
171 | increment_head(cpu_buf); | 171 | increment_head(cpu_buf); |
172 | } | 172 | } |
173 | 173 | ||
174 | static inline void | 174 | static inline void |
175 | add_code(struct oprofile_cpu_buffer * buffer, unsigned long value) | 175 | add_code(struct oprofile_cpu_buffer *buffer, unsigned long value) |
176 | { | 176 | { |
177 | add_sample(buffer, ESCAPE_CODE, value); | 177 | add_sample(buffer, ESCAPE_CODE, value); |
178 | } | 178 | } |
@@ -186,10 +186,10 @@ add_code(struct oprofile_cpu_buffer * buffer, unsigned long value) | |||
186 | * pc. We tag this in the buffer by generating kernel enter/exit | 186 | * pc. We tag this in the buffer by generating kernel enter/exit |
187 | * events whenever is_kernel changes | 187 | * events whenever is_kernel changes |
188 | */ | 188 | */ |
189 | static int log_sample(struct oprofile_cpu_buffer * cpu_buf, unsigned long pc, | 189 | static int log_sample(struct oprofile_cpu_buffer *cpu_buf, unsigned long pc, |
190 | int is_kernel, unsigned long event) | 190 | int is_kernel, unsigned long event) |
191 | { | 191 | { |
192 | struct task_struct * task; | 192 | struct task_struct *task; |
193 | 193 | ||
194 | cpu_buf->sample_received++; | 194 | cpu_buf->sample_received++; |
195 | 195 | ||
@@ -218,7 +218,7 @@ static int log_sample(struct oprofile_cpu_buffer * cpu_buf, unsigned long pc, | |||
218 | cpu_buf->last_task = task; | 218 | cpu_buf->last_task = task; |
219 | add_code(cpu_buf, (unsigned long)task); | 219 | add_code(cpu_buf, (unsigned long)task); |
220 | } | 220 | } |
221 | 221 | ||
222 | add_sample(cpu_buf, pc, event); | 222 | add_sample(cpu_buf, pc, event); |
223 | return 1; | 223 | return 1; |
224 | } | 224 | } |
@@ -235,7 +235,7 @@ static int oprofile_begin_trace(struct oprofile_cpu_buffer *cpu_buf) | |||
235 | return 1; | 235 | return 1; |
236 | } | 236 | } |
237 | 237 | ||
238 | static void oprofile_end_trace(struct oprofile_cpu_buffer * cpu_buf) | 238 | static void oprofile_end_trace(struct oprofile_cpu_buffer *cpu_buf) |
239 | { | 239 | { |
240 | cpu_buf->tracing = 0; | 240 | cpu_buf->tracing = 0; |
241 | } | 241 | } |
@@ -270,21 +270,23 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) | |||
270 | 270 | ||
271 | #ifdef CONFIG_OPROFILE_IBS | 271 | #ifdef CONFIG_OPROFILE_IBS |
272 | 272 | ||
273 | #define MAX_IBS_SAMPLE_SIZE 14 | 273 | #define MAX_IBS_SAMPLE_SIZE 14 |
274 | static int log_ibs_sample(struct oprofile_cpu_buffer *cpu_buf, | 274 | |
275 | unsigned long pc, int is_kernel, unsigned int *ibs, int ibs_code) | 275 | void oprofile_add_ibs_sample(struct pt_regs *const regs, |
276 | unsigned int *const ibs_sample, int ibs_code) | ||
276 | { | 277 | { |
278 | int is_kernel = !user_mode(regs); | ||
279 | struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(cpu_buffer); | ||
277 | struct task_struct *task; | 280 | struct task_struct *task; |
278 | 281 | ||
279 | cpu_buf->sample_received++; | 282 | cpu_buf->sample_received++; |
280 | 283 | ||
281 | if (nr_available_slots(cpu_buf) < MAX_IBS_SAMPLE_SIZE) { | 284 | if (nr_available_slots(cpu_buf) < MAX_IBS_SAMPLE_SIZE) { |
285 | /* we can't backtrace since we lost the source of this event */ | ||
282 | cpu_buf->sample_lost_overflow++; | 286 | cpu_buf->sample_lost_overflow++; |
283 | return 0; | 287 | return; |
284 | } | 288 | } |
285 | 289 | ||
286 | is_kernel = !!is_kernel; | ||
287 | |||
288 | /* notice a switch from user->kernel or vice versa */ | 290 | /* notice a switch from user->kernel or vice versa */ |
289 | if (cpu_buf->last_is_kernel != is_kernel) { | 291 | if (cpu_buf->last_is_kernel != is_kernel) { |
290 | cpu_buf->last_is_kernel = is_kernel; | 292 | cpu_buf->last_is_kernel = is_kernel; |
@@ -294,7 +296,6 @@ static int log_ibs_sample(struct oprofile_cpu_buffer *cpu_buf, | |||
294 | /* notice a task switch */ | 296 | /* notice a task switch */ |
295 | if (!is_kernel) { | 297 | if (!is_kernel) { |
296 | task = current; | 298 | task = current; |
297 | |||
298 | if (cpu_buf->last_task != task) { | 299 | if (cpu_buf->last_task != task) { |
299 | cpu_buf->last_task = task; | 300 | cpu_buf->last_task = task; |
300 | add_code(cpu_buf, (unsigned long)task); | 301 | add_code(cpu_buf, (unsigned long)task); |
@@ -302,36 +303,17 @@ static int log_ibs_sample(struct oprofile_cpu_buffer *cpu_buf, | |||
302 | } | 303 | } |
303 | 304 | ||
304 | add_code(cpu_buf, ibs_code); | 305 | add_code(cpu_buf, ibs_code); |
305 | add_sample(cpu_buf, ibs[0], ibs[1]); | 306 | add_sample(cpu_buf, ibs_sample[0], ibs_sample[1]); |
306 | add_sample(cpu_buf, ibs[2], ibs[3]); | 307 | add_sample(cpu_buf, ibs_sample[2], ibs_sample[3]); |
307 | add_sample(cpu_buf, ibs[4], ibs[5]); | 308 | add_sample(cpu_buf, ibs_sample[4], ibs_sample[5]); |
308 | 309 | ||
309 | if (ibs_code == IBS_OP_BEGIN) { | 310 | if (ibs_code == IBS_OP_BEGIN) { |
310 | add_sample(cpu_buf, ibs[6], ibs[7]); | 311 | add_sample(cpu_buf, ibs_sample[6], ibs_sample[7]); |
311 | add_sample(cpu_buf, ibs[8], ibs[9]); | 312 | add_sample(cpu_buf, ibs_sample[8], ibs_sample[9]); |
312 | add_sample(cpu_buf, ibs[10], ibs[11]); | 313 | add_sample(cpu_buf, ibs_sample[10], ibs_sample[11]); |
313 | } | ||
314 | |||
315 | return 1; | ||
316 | } | ||
317 | |||
318 | void oprofile_add_ibs_sample(struct pt_regs *const regs, | ||
319 | unsigned int * const ibs_sample, u8 code) | ||
320 | { | ||
321 | int is_kernel = !user_mode(regs); | ||
322 | unsigned long pc = profile_pc(regs); | ||
323 | |||
324 | struct oprofile_cpu_buffer *cpu_buf = | ||
325 | &per_cpu(cpu_buffer, smp_processor_id()); | ||
326 | |||
327 | if (!backtrace_depth) { | ||
328 | log_ibs_sample(cpu_buf, pc, is_kernel, ibs_sample, code); | ||
329 | return; | ||
330 | } | 314 | } |
331 | 315 | ||
332 | /* if log_sample() fails we can't backtrace since we lost the source | 316 | if (backtrace_depth) |
333 | * of this event */ | ||
334 | if (log_ibs_sample(cpu_buf, pc, is_kernel, ibs_sample, code)) | ||
335 | oprofile_ops.backtrace(regs, backtrace_depth); | 317 | oprofile_ops.backtrace(regs, backtrace_depth); |
336 | } | 318 | } |
337 | 319 | ||
@@ -376,11 +358,16 @@ void oprofile_add_trace(unsigned long pc) | |||
376 | */ | 358 | */ |
377 | static void wq_sync_buffer(struct work_struct *work) | 359 | static void wq_sync_buffer(struct work_struct *work) |
378 | { | 360 | { |
379 | struct oprofile_cpu_buffer * b = | 361 | struct oprofile_cpu_buffer *b = |
380 | container_of(work, struct oprofile_cpu_buffer, work.work); | 362 | container_of(work, struct oprofile_cpu_buffer, work.work); |
381 | if (b->cpu != smp_processor_id()) { | 363 | if (b->cpu != smp_processor_id()) { |
382 | printk(KERN_DEBUG "WQ on CPU%d, prefer CPU%d\n", | 364 | printk(KERN_DEBUG "WQ on CPU%d, prefer CPU%d\n", |
383 | smp_processor_id(), b->cpu); | 365 | smp_processor_id(), b->cpu); |
366 | |||
367 | if (!cpu_online(b->cpu)) { | ||
368 | cancel_delayed_work(&b->work); | ||
369 | return; | ||
370 | } | ||
384 | } | 371 | } |
385 | sync_buffer(b->cpu); | 372 | sync_buffer(b->cpu); |
386 | 373 | ||
diff --git a/drivers/oprofile/cpu_buffer.h b/drivers/oprofile/cpu_buffer.h index 9c44d004da69..d3cc26264db5 100644 --- a/drivers/oprofile/cpu_buffer.h +++ b/drivers/oprofile/cpu_buffer.h | |||
@@ -15,9 +15,9 @@ | |||
15 | #include <linux/workqueue.h> | 15 | #include <linux/workqueue.h> |
16 | #include <linux/cache.h> | 16 | #include <linux/cache.h> |
17 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
18 | 18 | ||
19 | struct task_struct; | 19 | struct task_struct; |
20 | 20 | ||
21 | int alloc_cpu_buffers(void); | 21 | int alloc_cpu_buffers(void); |
22 | void free_cpu_buffers(void); | 22 | void free_cpu_buffers(void); |
23 | 23 | ||
@@ -31,15 +31,15 @@ struct op_sample { | |||
31 | unsigned long eip; | 31 | unsigned long eip; |
32 | unsigned long event; | 32 | unsigned long event; |
33 | }; | 33 | }; |
34 | 34 | ||
35 | struct oprofile_cpu_buffer { | 35 | struct oprofile_cpu_buffer { |
36 | volatile unsigned long head_pos; | 36 | volatile unsigned long head_pos; |
37 | volatile unsigned long tail_pos; | 37 | volatile unsigned long tail_pos; |
38 | unsigned long buffer_size; | 38 | unsigned long buffer_size; |
39 | struct task_struct * last_task; | 39 | struct task_struct *last_task; |
40 | int last_is_kernel; | 40 | int last_is_kernel; |
41 | int tracing; | 41 | int tracing; |
42 | struct op_sample * buffer; | 42 | struct op_sample *buffer; |
43 | unsigned long sample_received; | 43 | unsigned long sample_received; |
44 | unsigned long sample_lost_overflow; | 44 | unsigned long sample_lost_overflow; |
45 | unsigned long backtrace_aborted; | 45 | unsigned long backtrace_aborted; |
@@ -50,7 +50,7 @@ struct oprofile_cpu_buffer { | |||
50 | 50 | ||
51 | DECLARE_PER_CPU(struct oprofile_cpu_buffer, cpu_buffer); | 51 | DECLARE_PER_CPU(struct oprofile_cpu_buffer, cpu_buffer); |
52 | 52 | ||
53 | void cpu_buffer_reset(struct oprofile_cpu_buffer * cpu_buf); | 53 | void cpu_buffer_reset(struct oprofile_cpu_buffer *cpu_buf); |
54 | 54 | ||
55 | /* transient events for the CPU buffer -> event buffer */ | 55 | /* transient events for the CPU buffer -> event buffer */ |
56 | #define CPU_IS_KERNEL 1 | 56 | #define CPU_IS_KERNEL 1 |
diff --git a/drivers/oprofile/event_buffer.c b/drivers/oprofile/event_buffer.c index 8d692a5c8e73..d962ba0dd87a 100644 --- a/drivers/oprofile/event_buffer.c +++ b/drivers/oprofile/event_buffer.c | |||
@@ -19,16 +19,16 @@ | |||
19 | #include <linux/dcookies.h> | 19 | #include <linux/dcookies.h> |
20 | #include <linux/fs.h> | 20 | #include <linux/fs.h> |
21 | #include <asm/uaccess.h> | 21 | #include <asm/uaccess.h> |
22 | 22 | ||
23 | #include "oprof.h" | 23 | #include "oprof.h" |
24 | #include "event_buffer.h" | 24 | #include "event_buffer.h" |
25 | #include "oprofile_stats.h" | 25 | #include "oprofile_stats.h" |
26 | 26 | ||
27 | DEFINE_MUTEX(buffer_mutex); | 27 | DEFINE_MUTEX(buffer_mutex); |
28 | 28 | ||
29 | static unsigned long buffer_opened; | 29 | static unsigned long buffer_opened; |
30 | static DECLARE_WAIT_QUEUE_HEAD(buffer_wait); | 30 | static DECLARE_WAIT_QUEUE_HEAD(buffer_wait); |
31 | static unsigned long * event_buffer; | 31 | static unsigned long *event_buffer; |
32 | static unsigned long buffer_size; | 32 | static unsigned long buffer_size; |
33 | static unsigned long buffer_watershed; | 33 | static unsigned long buffer_watershed; |
34 | static size_t buffer_pos; | 34 | static size_t buffer_pos; |
@@ -66,7 +66,7 @@ void wake_up_buffer_waiter(void) | |||
66 | mutex_unlock(&buffer_mutex); | 66 | mutex_unlock(&buffer_mutex); |
67 | } | 67 | } |
68 | 68 | ||
69 | 69 | ||
70 | int alloc_event_buffer(void) | 70 | int alloc_event_buffer(void) |
71 | { | 71 | { |
72 | int err = -ENOMEM; | 72 | int err = -ENOMEM; |
@@ -76,13 +76,13 @@ int alloc_event_buffer(void) | |||
76 | buffer_size = fs_buffer_size; | 76 | buffer_size = fs_buffer_size; |
77 | buffer_watershed = fs_buffer_watershed; | 77 | buffer_watershed = fs_buffer_watershed; |
78 | spin_unlock_irqrestore(&oprofilefs_lock, flags); | 78 | spin_unlock_irqrestore(&oprofilefs_lock, flags); |
79 | 79 | ||
80 | if (buffer_watershed >= buffer_size) | 80 | if (buffer_watershed >= buffer_size) |
81 | return -EINVAL; | 81 | return -EINVAL; |
82 | 82 | ||
83 | event_buffer = vmalloc(sizeof(unsigned long) * buffer_size); | 83 | event_buffer = vmalloc(sizeof(unsigned long) * buffer_size); |
84 | if (!event_buffer) | 84 | if (!event_buffer) |
85 | goto out; | 85 | goto out; |
86 | 86 | ||
87 | err = 0; | 87 | err = 0; |
88 | out: | 88 | out: |
@@ -97,8 +97,8 @@ void free_event_buffer(void) | |||
97 | event_buffer = NULL; | 97 | event_buffer = NULL; |
98 | } | 98 | } |
99 | 99 | ||
100 | 100 | ||
101 | static int event_buffer_open(struct inode * inode, struct file * file) | 101 | static int event_buffer_open(struct inode *inode, struct file *file) |
102 | { | 102 | { |
103 | int err = -EPERM; | 103 | int err = -EPERM; |
104 | 104 | ||
@@ -116,14 +116,14 @@ static int event_buffer_open(struct inode * inode, struct file * file) | |||
116 | file->private_data = dcookie_register(); | 116 | file->private_data = dcookie_register(); |
117 | if (!file->private_data) | 117 | if (!file->private_data) |
118 | goto out; | 118 | goto out; |
119 | 119 | ||
120 | if ((err = oprofile_setup())) | 120 | if ((err = oprofile_setup())) |
121 | goto fail; | 121 | goto fail; |
122 | 122 | ||
123 | /* NB: the actual start happens from userspace | 123 | /* NB: the actual start happens from userspace |
124 | * echo 1 >/dev/oprofile/enable | 124 | * echo 1 >/dev/oprofile/enable |
125 | */ | 125 | */ |
126 | 126 | ||
127 | return 0; | 127 | return 0; |
128 | 128 | ||
129 | fail: | 129 | fail: |
@@ -134,7 +134,7 @@ out: | |||
134 | } | 134 | } |
135 | 135 | ||
136 | 136 | ||
137 | static int event_buffer_release(struct inode * inode, struct file * file) | 137 | static int event_buffer_release(struct inode *inode, struct file *file) |
138 | { | 138 | { |
139 | oprofile_stop(); | 139 | oprofile_stop(); |
140 | oprofile_shutdown(); | 140 | oprofile_shutdown(); |
@@ -146,8 +146,8 @@ static int event_buffer_release(struct inode * inode, struct file * file) | |||
146 | } | 146 | } |
147 | 147 | ||
148 | 148 | ||
149 | static ssize_t event_buffer_read(struct file * file, char __user * buf, | 149 | static ssize_t event_buffer_read(struct file *file, char __user *buf, |
150 | size_t count, loff_t * offset) | 150 | size_t count, loff_t *offset) |
151 | { | 151 | { |
152 | int retval = -EINVAL; | 152 | int retval = -EINVAL; |
153 | size_t const max = buffer_size * sizeof(unsigned long); | 153 | size_t const max = buffer_size * sizeof(unsigned long); |
@@ -172,18 +172,18 @@ static ssize_t event_buffer_read(struct file * file, char __user * buf, | |||
172 | retval = -EFAULT; | 172 | retval = -EFAULT; |
173 | 173 | ||
174 | count = buffer_pos * sizeof(unsigned long); | 174 | count = buffer_pos * sizeof(unsigned long); |
175 | 175 | ||
176 | if (copy_to_user(buf, event_buffer, count)) | 176 | if (copy_to_user(buf, event_buffer, count)) |
177 | goto out; | 177 | goto out; |
178 | 178 | ||
179 | retval = count; | 179 | retval = count; |
180 | buffer_pos = 0; | 180 | buffer_pos = 0; |
181 | 181 | ||
182 | out: | 182 | out: |
183 | mutex_unlock(&buffer_mutex); | 183 | mutex_unlock(&buffer_mutex); |
184 | return retval; | 184 | return retval; |
185 | } | 185 | } |
186 | 186 | ||
187 | const struct file_operations event_buffer_fops = { | 187 | const struct file_operations event_buffer_fops = { |
188 | .open = event_buffer_open, | 188 | .open = event_buffer_open, |
189 | .release = event_buffer_release, | 189 | .release = event_buffer_release, |
diff --git a/drivers/oprofile/event_buffer.h b/drivers/oprofile/event_buffer.h index 84bf324c5771..4e70749f8d16 100644 --- a/drivers/oprofile/event_buffer.h +++ b/drivers/oprofile/event_buffer.h | |||
@@ -10,13 +10,13 @@ | |||
10 | #ifndef EVENT_BUFFER_H | 10 | #ifndef EVENT_BUFFER_H |
11 | #define EVENT_BUFFER_H | 11 | #define EVENT_BUFFER_H |
12 | 12 | ||
13 | #include <linux/types.h> | 13 | #include <linux/types.h> |
14 | #include <asm/mutex.h> | 14 | #include <asm/mutex.h> |
15 | 15 | ||
16 | int alloc_event_buffer(void); | 16 | int alloc_event_buffer(void); |
17 | 17 | ||
18 | void free_event_buffer(void); | 18 | void free_event_buffer(void); |
19 | 19 | ||
20 | /** | 20 | /** |
21 | * Add data to the event buffer. | 21 | * Add data to the event buffer. |
22 | * The data passed is free-form, but typically consists of | 22 | * The data passed is free-form, but typically consists of |
@@ -31,10 +31,10 @@ void wake_up_buffer_waiter(void); | |||
31 | #define NO_COOKIE 0UL | 31 | #define NO_COOKIE 0UL |
32 | 32 | ||
33 | extern const struct file_operations event_buffer_fops; | 33 | extern const struct file_operations event_buffer_fops; |
34 | 34 | ||
35 | /* mutex between sync_cpu_buffers() and the | 35 | /* mutex between sync_cpu_buffers() and the |
36 | * file reading code. | 36 | * file reading code. |
37 | */ | 37 | */ |
38 | extern struct mutex buffer_mutex; | 38 | extern struct mutex buffer_mutex; |
39 | 39 | ||
40 | #endif /* EVENT_BUFFER_H */ | 40 | #endif /* EVENT_BUFFER_H */ |
diff --git a/drivers/oprofile/oprof.c b/drivers/oprofile/oprof.c index 2c645170f06e..cd375907f26f 100644 --- a/drivers/oprofile/oprof.c +++ b/drivers/oprofile/oprof.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include "cpu_buffer.h" | 19 | #include "cpu_buffer.h" |
20 | #include "buffer_sync.h" | 20 | #include "buffer_sync.h" |
21 | #include "oprofile_stats.h" | 21 | #include "oprofile_stats.h" |
22 | 22 | ||
23 | struct oprofile_operations oprofile_ops; | 23 | struct oprofile_operations oprofile_ops; |
24 | 24 | ||
25 | unsigned long oprofile_started; | 25 | unsigned long oprofile_started; |
@@ -36,7 +36,7 @@ static int timer = 0; | |||
36 | int oprofile_setup(void) | 36 | int oprofile_setup(void) |
37 | { | 37 | { |
38 | int err; | 38 | int err; |
39 | 39 | ||
40 | mutex_lock(&start_mutex); | 40 | mutex_lock(&start_mutex); |
41 | 41 | ||
42 | if ((err = alloc_cpu_buffers())) | 42 | if ((err = alloc_cpu_buffers())) |
@@ -44,10 +44,10 @@ int oprofile_setup(void) | |||
44 | 44 | ||
45 | if ((err = alloc_event_buffer())) | 45 | if ((err = alloc_event_buffer())) |
46 | goto out1; | 46 | goto out1; |
47 | 47 | ||
48 | if (oprofile_ops.setup && (err = oprofile_ops.setup())) | 48 | if (oprofile_ops.setup && (err = oprofile_ops.setup())) |
49 | goto out2; | 49 | goto out2; |
50 | 50 | ||
51 | /* Note even though this starts part of the | 51 | /* Note even though this starts part of the |
52 | * profiling overhead, it's necessary to prevent | 52 | * profiling overhead, it's necessary to prevent |
53 | * us missing task deaths and eventually oopsing | 53 | * us missing task deaths and eventually oopsing |
@@ -74,7 +74,7 @@ post_sync: | |||
74 | is_setup = 1; | 74 | is_setup = 1; |
75 | mutex_unlock(&start_mutex); | 75 | mutex_unlock(&start_mutex); |
76 | return 0; | 76 | return 0; |
77 | 77 | ||
78 | out3: | 78 | out3: |
79 | if (oprofile_ops.shutdown) | 79 | if (oprofile_ops.shutdown) |
80 | oprofile_ops.shutdown(); | 80 | oprofile_ops.shutdown(); |
@@ -92,17 +92,17 @@ out: | |||
92 | int oprofile_start(void) | 92 | int oprofile_start(void) |
93 | { | 93 | { |
94 | int err = -EINVAL; | 94 | int err = -EINVAL; |
95 | 95 | ||
96 | mutex_lock(&start_mutex); | 96 | mutex_lock(&start_mutex); |
97 | 97 | ||
98 | if (!is_setup) | 98 | if (!is_setup) |
99 | goto out; | 99 | goto out; |
100 | 100 | ||
101 | err = 0; | 101 | err = 0; |
102 | 102 | ||
103 | if (oprofile_started) | 103 | if (oprofile_started) |
104 | goto out; | 104 | goto out; |
105 | 105 | ||
106 | oprofile_reset_stats(); | 106 | oprofile_reset_stats(); |
107 | 107 | ||
108 | if ((err = oprofile_ops.start())) | 108 | if ((err = oprofile_ops.start())) |
@@ -114,7 +114,7 @@ out: | |||
114 | return err; | 114 | return err; |
115 | } | 115 | } |
116 | 116 | ||
117 | 117 | ||
118 | /* echo 0>/dev/oprofile/enable */ | 118 | /* echo 0>/dev/oprofile/enable */ |
119 | void oprofile_stop(void) | 119 | void oprofile_stop(void) |
120 | { | 120 | { |
@@ -204,13 +204,13 @@ static void __exit oprofile_exit(void) | |||
204 | oprofile_arch_exit(); | 204 | oprofile_arch_exit(); |
205 | } | 205 | } |
206 | 206 | ||
207 | 207 | ||
208 | module_init(oprofile_init); | 208 | module_init(oprofile_init); |
209 | module_exit(oprofile_exit); | 209 | module_exit(oprofile_exit); |
210 | 210 | ||
211 | module_param_named(timer, timer, int, 0644); | 211 | module_param_named(timer, timer, int, 0644); |
212 | MODULE_PARM_DESC(timer, "force use of timer interrupt"); | 212 | MODULE_PARM_DESC(timer, "force use of timer interrupt"); |
213 | 213 | ||
214 | MODULE_LICENSE("GPL"); | 214 | MODULE_LICENSE("GPL"); |
215 | MODULE_AUTHOR("John Levon <levon@movementarian.org>"); | 215 | MODULE_AUTHOR("John Levon <levon@movementarian.org>"); |
216 | MODULE_DESCRIPTION("OProfile system profiler"); | 216 | MODULE_DESCRIPTION("OProfile system profiler"); |
diff --git a/drivers/oprofile/oprof.h b/drivers/oprofile/oprof.h index 18323650806e..5df0c21a608f 100644 --- a/drivers/oprofile/oprof.h +++ b/drivers/oprofile/oprof.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #define OPROF_H | 11 | #define OPROF_H |
12 | 12 | ||
13 | int oprofile_setup(void); | 13 | int oprofile_setup(void); |
14 | void oprofile_shutdown(void); | 14 | void oprofile_shutdown(void); |
15 | 15 | ||
16 | int oprofilefs_register(void); | 16 | int oprofilefs_register(void); |
17 | void oprofilefs_unregister(void); | 17 | void oprofilefs_unregister(void); |
@@ -20,20 +20,20 @@ int oprofile_start(void); | |||
20 | void oprofile_stop(void); | 20 | void oprofile_stop(void); |
21 | 21 | ||
22 | struct oprofile_operations; | 22 | struct oprofile_operations; |
23 | 23 | ||
24 | extern unsigned long fs_buffer_size; | 24 | extern unsigned long fs_buffer_size; |
25 | extern unsigned long fs_cpu_buffer_size; | 25 | extern unsigned long fs_cpu_buffer_size; |
26 | extern unsigned long fs_buffer_watershed; | 26 | extern unsigned long fs_buffer_watershed; |
27 | extern struct oprofile_operations oprofile_ops; | 27 | extern struct oprofile_operations oprofile_ops; |
28 | extern unsigned long oprofile_started; | 28 | extern unsigned long oprofile_started; |
29 | extern unsigned long backtrace_depth; | 29 | extern unsigned long backtrace_depth; |
30 | 30 | ||
31 | struct super_block; | 31 | struct super_block; |
32 | struct dentry; | 32 | struct dentry; |
33 | 33 | ||
34 | void oprofile_create_files(struct super_block * sb, struct dentry * root); | 34 | void oprofile_create_files(struct super_block *sb, struct dentry *root); |
35 | void oprofile_timer_init(struct oprofile_operations * ops); | 35 | void oprofile_timer_init(struct oprofile_operations *ops); |
36 | 36 | ||
37 | int oprofile_set_backtrace(unsigned long depth); | 37 | int oprofile_set_backtrace(unsigned long depth); |
38 | 38 | ||
39 | #endif /* OPROF_H */ | 39 | #endif /* OPROF_H */ |
diff --git a/drivers/oprofile/oprofile_files.c b/drivers/oprofile/oprofile_files.c index ef953ba5ab6b..cc106d503ace 100644 --- a/drivers/oprofile/oprofile_files.c +++ b/drivers/oprofile/oprofile_files.c | |||
@@ -13,18 +13,18 @@ | |||
13 | #include "event_buffer.h" | 13 | #include "event_buffer.h" |
14 | #include "oprofile_stats.h" | 14 | #include "oprofile_stats.h" |
15 | #include "oprof.h" | 15 | #include "oprof.h" |
16 | 16 | ||
17 | unsigned long fs_buffer_size = 131072; | 17 | unsigned long fs_buffer_size = 131072; |
18 | unsigned long fs_cpu_buffer_size = 8192; | 18 | unsigned long fs_cpu_buffer_size = 8192; |
19 | unsigned long fs_buffer_watershed = 32768; /* FIXME: tune */ | 19 | unsigned long fs_buffer_watershed = 32768; /* FIXME: tune */ |
20 | 20 | ||
21 | static ssize_t depth_read(struct file * file, char __user * buf, size_t count, loff_t * offset) | 21 | static ssize_t depth_read(struct file *file, char __user *buf, size_t count, loff_t *offset) |
22 | { | 22 | { |
23 | return oprofilefs_ulong_to_user(backtrace_depth, buf, count, offset); | 23 | return oprofilefs_ulong_to_user(backtrace_depth, buf, count, offset); |
24 | } | 24 | } |
25 | 25 | ||
26 | 26 | ||
27 | static ssize_t depth_write(struct file * file, char const __user * buf, size_t count, loff_t * offset) | 27 | static ssize_t depth_write(struct file *file, char const __user *buf, size_t count, loff_t *offset) |
28 | { | 28 | { |
29 | unsigned long val; | 29 | unsigned long val; |
30 | int retval; | 30 | int retval; |
@@ -49,8 +49,8 @@ static const struct file_operations depth_fops = { | |||
49 | .write = depth_write | 49 | .write = depth_write |
50 | }; | 50 | }; |
51 | 51 | ||
52 | 52 | ||
53 | static ssize_t pointer_size_read(struct file * file, char __user * buf, size_t count, loff_t * offset) | 53 | static ssize_t pointer_size_read(struct file *file, char __user *buf, size_t count, loff_t *offset) |
54 | { | 54 | { |
55 | return oprofilefs_ulong_to_user(sizeof(void *), buf, count, offset); | 55 | return oprofilefs_ulong_to_user(sizeof(void *), buf, count, offset); |
56 | } | 56 | } |
@@ -61,24 +61,24 @@ static const struct file_operations pointer_size_fops = { | |||
61 | }; | 61 | }; |
62 | 62 | ||
63 | 63 | ||
64 | static ssize_t cpu_type_read(struct file * file, char __user * buf, size_t count, loff_t * offset) | 64 | static ssize_t cpu_type_read(struct file *file, char __user *buf, size_t count, loff_t *offset) |
65 | { | 65 | { |
66 | return oprofilefs_str_to_user(oprofile_ops.cpu_type, buf, count, offset); | 66 | return oprofilefs_str_to_user(oprofile_ops.cpu_type, buf, count, offset); |
67 | } | 67 | } |
68 | 68 | ||
69 | 69 | ||
70 | static const struct file_operations cpu_type_fops = { | 70 | static const struct file_operations cpu_type_fops = { |
71 | .read = cpu_type_read, | 71 | .read = cpu_type_read, |
72 | }; | 72 | }; |
73 | 73 | ||
74 | 74 | ||
75 | static ssize_t enable_read(struct file * file, char __user * buf, size_t count, loff_t * offset) | 75 | static ssize_t enable_read(struct file *file, char __user *buf, size_t count, loff_t *offset) |
76 | { | 76 | { |
77 | return oprofilefs_ulong_to_user(oprofile_started, buf, count, offset); | 77 | return oprofilefs_ulong_to_user(oprofile_started, buf, count, offset); |
78 | } | 78 | } |
79 | 79 | ||
80 | 80 | ||
81 | static ssize_t enable_write(struct file * file, char const __user * buf, size_t count, loff_t * offset) | 81 | static ssize_t enable_write(struct file *file, char const __user *buf, size_t count, loff_t *offset) |
82 | { | 82 | { |
83 | unsigned long val; | 83 | unsigned long val; |
84 | int retval; | 84 | int retval; |
@@ -89,7 +89,7 @@ static ssize_t enable_write(struct file * file, char const __user * buf, size_t | |||
89 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 89 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
90 | if (retval) | 90 | if (retval) |
91 | return retval; | 91 | return retval; |
92 | 92 | ||
93 | if (val) | 93 | if (val) |
94 | retval = oprofile_start(); | 94 | retval = oprofile_start(); |
95 | else | 95 | else |
@@ -100,14 +100,14 @@ static ssize_t enable_write(struct file * file, char const __user * buf, size_t | |||
100 | return count; | 100 | return count; |
101 | } | 101 | } |
102 | 102 | ||
103 | 103 | ||
104 | static const struct file_operations enable_fops = { | 104 | static const struct file_operations enable_fops = { |
105 | .read = enable_read, | 105 | .read = enable_read, |
106 | .write = enable_write, | 106 | .write = enable_write, |
107 | }; | 107 | }; |
108 | 108 | ||
109 | 109 | ||
110 | static ssize_t dump_write(struct file * file, char const __user * buf, size_t count, loff_t * offset) | 110 | static ssize_t dump_write(struct file *file, char const __user *buf, size_t count, loff_t *offset) |
111 | { | 111 | { |
112 | wake_up_buffer_waiter(); | 112 | wake_up_buffer_waiter(); |
113 | return count; | 113 | return count; |
@@ -117,8 +117,8 @@ static ssize_t dump_write(struct file * file, char const __user * buf, size_t co | |||
117 | static const struct file_operations dump_fops = { | 117 | static const struct file_operations dump_fops = { |
118 | .write = dump_write, | 118 | .write = dump_write, |
119 | }; | 119 | }; |
120 | 120 | ||
121 | void oprofile_create_files(struct super_block * sb, struct dentry * root) | 121 | void oprofile_create_files(struct super_block *sb, struct dentry *root) |
122 | { | 122 | { |
123 | oprofilefs_create_file(sb, root, "enable", &enable_fops); | 123 | oprofilefs_create_file(sb, root, "enable", &enable_fops); |
124 | oprofilefs_create_file_perm(sb, root, "dump", &dump_fops, 0666); | 124 | oprofilefs_create_file_perm(sb, root, "dump", &dump_fops, 0666); |
@@ -126,7 +126,7 @@ void oprofile_create_files(struct super_block * sb, struct dentry * root) | |||
126 | oprofilefs_create_ulong(sb, root, "buffer_size", &fs_buffer_size); | 126 | oprofilefs_create_ulong(sb, root, "buffer_size", &fs_buffer_size); |
127 | oprofilefs_create_ulong(sb, root, "buffer_watershed", &fs_buffer_watershed); | 127 | oprofilefs_create_ulong(sb, root, "buffer_watershed", &fs_buffer_watershed); |
128 | oprofilefs_create_ulong(sb, root, "cpu_buffer_size", &fs_cpu_buffer_size); | 128 | oprofilefs_create_ulong(sb, root, "cpu_buffer_size", &fs_cpu_buffer_size); |
129 | oprofilefs_create_file(sb, root, "cpu_type", &cpu_type_fops); | 129 | oprofilefs_create_file(sb, root, "cpu_type", &cpu_type_fops); |
130 | oprofilefs_create_file(sb, root, "backtrace_depth", &depth_fops); | 130 | oprofilefs_create_file(sb, root, "backtrace_depth", &depth_fops); |
131 | oprofilefs_create_file(sb, root, "pointer_size", &pointer_size_fops); | 131 | oprofilefs_create_file(sb, root, "pointer_size", &pointer_size_fops); |
132 | oprofile_create_stats_files(sb, root); | 132 | oprofile_create_stats_files(sb, root); |
diff --git a/drivers/oprofile/oprofile_stats.c b/drivers/oprofile/oprofile_stats.c index f99b28e7b79a..e1f6ce03705e 100644 --- a/drivers/oprofile/oprofile_stats.c +++ b/drivers/oprofile/oprofile_stats.c | |||
@@ -11,17 +11,17 @@ | |||
11 | #include <linux/smp.h> | 11 | #include <linux/smp.h> |
12 | #include <linux/cpumask.h> | 12 | #include <linux/cpumask.h> |
13 | #include <linux/threads.h> | 13 | #include <linux/threads.h> |
14 | 14 | ||
15 | #include "oprofile_stats.h" | 15 | #include "oprofile_stats.h" |
16 | #include "cpu_buffer.h" | 16 | #include "cpu_buffer.h" |
17 | 17 | ||
18 | struct oprofile_stat_struct oprofile_stats; | 18 | struct oprofile_stat_struct oprofile_stats; |
19 | 19 | ||
20 | void oprofile_reset_stats(void) | 20 | void oprofile_reset_stats(void) |
21 | { | 21 | { |
22 | struct oprofile_cpu_buffer * cpu_buf; | 22 | struct oprofile_cpu_buffer *cpu_buf; |
23 | int i; | 23 | int i; |
24 | 24 | ||
25 | for_each_possible_cpu(i) { | 25 | for_each_possible_cpu(i) { |
26 | cpu_buf = &per_cpu(cpu_buffer, i); | 26 | cpu_buf = &per_cpu(cpu_buffer, i); |
27 | cpu_buf->sample_received = 0; | 27 | cpu_buf->sample_received = 0; |
@@ -29,18 +29,18 @@ void oprofile_reset_stats(void) | |||
29 | cpu_buf->backtrace_aborted = 0; | 29 | cpu_buf->backtrace_aborted = 0; |
30 | cpu_buf->sample_invalid_eip = 0; | 30 | cpu_buf->sample_invalid_eip = 0; |
31 | } | 31 | } |
32 | 32 | ||
33 | atomic_set(&oprofile_stats.sample_lost_no_mm, 0); | 33 | atomic_set(&oprofile_stats.sample_lost_no_mm, 0); |
34 | atomic_set(&oprofile_stats.sample_lost_no_mapping, 0); | 34 | atomic_set(&oprofile_stats.sample_lost_no_mapping, 0); |
35 | atomic_set(&oprofile_stats.event_lost_overflow, 0); | 35 | atomic_set(&oprofile_stats.event_lost_overflow, 0); |
36 | } | 36 | } |
37 | 37 | ||
38 | 38 | ||
39 | void oprofile_create_stats_files(struct super_block * sb, struct dentry * root) | 39 | void oprofile_create_stats_files(struct super_block *sb, struct dentry *root) |
40 | { | 40 | { |
41 | struct oprofile_cpu_buffer * cpu_buf; | 41 | struct oprofile_cpu_buffer *cpu_buf; |
42 | struct dentry * cpudir; | 42 | struct dentry *cpudir; |
43 | struct dentry * dir; | 43 | struct dentry *dir; |
44 | char buf[10]; | 44 | char buf[10]; |
45 | int i; | 45 | int i; |
46 | 46 | ||
@@ -52,7 +52,7 @@ void oprofile_create_stats_files(struct super_block * sb, struct dentry * root) | |||
52 | cpu_buf = &per_cpu(cpu_buffer, i); | 52 | cpu_buf = &per_cpu(cpu_buffer, i); |
53 | snprintf(buf, 10, "cpu%d", i); | 53 | snprintf(buf, 10, "cpu%d", i); |
54 | cpudir = oprofilefs_mkdir(sb, dir, buf); | 54 | cpudir = oprofilefs_mkdir(sb, dir, buf); |
55 | 55 | ||
56 | /* Strictly speaking access to these ulongs is racy, | 56 | /* Strictly speaking access to these ulongs is racy, |
57 | * but we can't simply lock them, and they are | 57 | * but we can't simply lock them, and they are |
58 | * informational only. | 58 | * informational only. |
@@ -66,7 +66,7 @@ void oprofile_create_stats_files(struct super_block * sb, struct dentry * root) | |||
66 | oprofilefs_create_ro_ulong(sb, cpudir, "sample_invalid_eip", | 66 | oprofilefs_create_ro_ulong(sb, cpudir, "sample_invalid_eip", |
67 | &cpu_buf->sample_invalid_eip); | 67 | &cpu_buf->sample_invalid_eip); |
68 | } | 68 | } |
69 | 69 | ||
70 | oprofilefs_create_ro_atomic(sb, dir, "sample_lost_no_mm", | 70 | oprofilefs_create_ro_atomic(sb, dir, "sample_lost_no_mm", |
71 | &oprofile_stats.sample_lost_no_mm); | 71 | &oprofile_stats.sample_lost_no_mm); |
72 | oprofilefs_create_ro_atomic(sb, dir, "sample_lost_no_mapping", | 72 | oprofilefs_create_ro_atomic(sb, dir, "sample_lost_no_mapping", |
diff --git a/drivers/oprofile/oprofile_stats.h b/drivers/oprofile/oprofile_stats.h index 6d755a633f15..3da0d08dc1f9 100644 --- a/drivers/oprofile/oprofile_stats.h +++ b/drivers/oprofile/oprofile_stats.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #define OPROFILE_STATS_H | 11 | #define OPROFILE_STATS_H |
12 | 12 | ||
13 | #include <asm/atomic.h> | 13 | #include <asm/atomic.h> |
14 | 14 | ||
15 | struct oprofile_stat_struct { | 15 | struct oprofile_stat_struct { |
16 | atomic_t sample_lost_no_mm; | 16 | atomic_t sample_lost_no_mm; |
17 | atomic_t sample_lost_no_mapping; | 17 | atomic_t sample_lost_no_mapping; |
@@ -20,14 +20,14 @@ struct oprofile_stat_struct { | |||
20 | }; | 20 | }; |
21 | 21 | ||
22 | extern struct oprofile_stat_struct oprofile_stats; | 22 | extern struct oprofile_stat_struct oprofile_stats; |
23 | 23 | ||
24 | /* reset all stats to zero */ | 24 | /* reset all stats to zero */ |
25 | void oprofile_reset_stats(void); | 25 | void oprofile_reset_stats(void); |
26 | 26 | ||
27 | struct super_block; | 27 | struct super_block; |
28 | struct dentry; | 28 | struct dentry; |
29 | 29 | ||
30 | /* create the stats/ dir */ | 30 | /* create the stats/ dir */ |
31 | void oprofile_create_stats_files(struct super_block * sb, struct dentry * root); | 31 | void oprofile_create_stats_files(struct super_block *sb, struct dentry *root); |
32 | 32 | ||
33 | #endif /* OPROFILE_STATS_H */ | 33 | #endif /* OPROFILE_STATS_H */ |
diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index 8543cb26cf34..ddc4c59f02dc 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c | |||
@@ -23,9 +23,9 @@ | |||
23 | 23 | ||
24 | DEFINE_SPINLOCK(oprofilefs_lock); | 24 | DEFINE_SPINLOCK(oprofilefs_lock); |
25 | 25 | ||
26 | static struct inode * oprofilefs_get_inode(struct super_block * sb, int mode) | 26 | static struct inode *oprofilefs_get_inode(struct super_block *sb, int mode) |
27 | { | 27 | { |
28 | struct inode * inode = new_inode(sb); | 28 | struct inode *inode = new_inode(sb); |
29 | 29 | ||
30 | if (inode) { | 30 | if (inode) { |
31 | inode->i_mode = mode; | 31 | inode->i_mode = mode; |
@@ -44,7 +44,7 @@ static struct super_operations s_ops = { | |||
44 | }; | 44 | }; |
45 | 45 | ||
46 | 46 | ||
47 | ssize_t oprofilefs_str_to_user(char const * str, char __user * buf, size_t count, loff_t * offset) | 47 | ssize_t oprofilefs_str_to_user(char const *str, char __user *buf, size_t count, loff_t *offset) |
48 | { | 48 | { |
49 | return simple_read_from_buffer(buf, count, offset, str, strlen(str)); | 49 | return simple_read_from_buffer(buf, count, offset, str, strlen(str)); |
50 | } | 50 | } |
@@ -52,7 +52,7 @@ ssize_t oprofilefs_str_to_user(char const * str, char __user * buf, size_t count | |||
52 | 52 | ||
53 | #define TMPBUFSIZE 50 | 53 | #define TMPBUFSIZE 50 |
54 | 54 | ||
55 | ssize_t oprofilefs_ulong_to_user(unsigned long val, char __user * buf, size_t count, loff_t * offset) | 55 | ssize_t oprofilefs_ulong_to_user(unsigned long val, char __user *buf, size_t count, loff_t *offset) |
56 | { | 56 | { |
57 | char tmpbuf[TMPBUFSIZE]; | 57 | char tmpbuf[TMPBUFSIZE]; |
58 | size_t maxlen = snprintf(tmpbuf, TMPBUFSIZE, "%lu\n", val); | 58 | size_t maxlen = snprintf(tmpbuf, TMPBUFSIZE, "%lu\n", val); |
@@ -62,7 +62,7 @@ ssize_t oprofilefs_ulong_to_user(unsigned long val, char __user * buf, size_t co | |||
62 | } | 62 | } |
63 | 63 | ||
64 | 64 | ||
65 | int oprofilefs_ulong_from_user(unsigned long * val, char const __user * buf, size_t count) | 65 | int oprofilefs_ulong_from_user(unsigned long *val, char const __user *buf, size_t count) |
66 | { | 66 | { |
67 | char tmpbuf[TMPBUFSIZE]; | 67 | char tmpbuf[TMPBUFSIZE]; |
68 | unsigned long flags; | 68 | unsigned long flags; |
@@ -85,16 +85,16 @@ int oprofilefs_ulong_from_user(unsigned long * val, char const __user * buf, siz | |||
85 | } | 85 | } |
86 | 86 | ||
87 | 87 | ||
88 | static ssize_t ulong_read_file(struct file * file, char __user * buf, size_t count, loff_t * offset) | 88 | static ssize_t ulong_read_file(struct file *file, char __user *buf, size_t count, loff_t *offset) |
89 | { | 89 | { |
90 | unsigned long * val = file->private_data; | 90 | unsigned long *val = file->private_data; |
91 | return oprofilefs_ulong_to_user(*val, buf, count, offset); | 91 | return oprofilefs_ulong_to_user(*val, buf, count, offset); |
92 | } | 92 | } |
93 | 93 | ||
94 | 94 | ||
95 | static ssize_t ulong_write_file(struct file * file, char const __user * buf, size_t count, loff_t * offset) | 95 | static ssize_t ulong_write_file(struct file *file, char const __user *buf, size_t count, loff_t *offset) |
96 | { | 96 | { |
97 | unsigned long * value = file->private_data; | 97 | unsigned long *value = file->private_data; |
98 | int retval; | 98 | int retval; |
99 | 99 | ||
100 | if (*offset) | 100 | if (*offset) |
@@ -108,7 +108,7 @@ static ssize_t ulong_write_file(struct file * file, char const __user * buf, siz | |||
108 | } | 108 | } |
109 | 109 | ||
110 | 110 | ||
111 | static int default_open(struct inode * inode, struct file * filp) | 111 | static int default_open(struct inode *inode, struct file *filp) |
112 | { | 112 | { |
113 | if (inode->i_private) | 113 | if (inode->i_private) |
114 | filp->private_data = inode->i_private; | 114 | filp->private_data = inode->i_private; |
@@ -129,12 +129,12 @@ static const struct file_operations ulong_ro_fops = { | |||
129 | }; | 129 | }; |
130 | 130 | ||
131 | 131 | ||
132 | static struct dentry * __oprofilefs_create_file(struct super_block * sb, | 132 | static struct dentry *__oprofilefs_create_file(struct super_block *sb, |
133 | struct dentry * root, char const * name, const struct file_operations * fops, | 133 | struct dentry *root, char const *name, const struct file_operations *fops, |
134 | int perm) | 134 | int perm) |
135 | { | 135 | { |
136 | struct dentry * dentry; | 136 | struct dentry *dentry; |
137 | struct inode * inode; | 137 | struct inode *inode; |
138 | 138 | ||
139 | dentry = d_alloc_name(root, name); | 139 | dentry = d_alloc_name(root, name); |
140 | if (!dentry) | 140 | if (!dentry) |
@@ -150,10 +150,10 @@ static struct dentry * __oprofilefs_create_file(struct super_block * sb, | |||
150 | } | 150 | } |
151 | 151 | ||
152 | 152 | ||
153 | int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root, | 153 | int oprofilefs_create_ulong(struct super_block *sb, struct dentry *root, |
154 | char const * name, unsigned long * val) | 154 | char const *name, unsigned long *val) |
155 | { | 155 | { |
156 | struct dentry * d = __oprofilefs_create_file(sb, root, name, | 156 | struct dentry *d = __oprofilefs_create_file(sb, root, name, |
157 | &ulong_fops, 0644); | 157 | &ulong_fops, 0644); |
158 | if (!d) | 158 | if (!d) |
159 | return -EFAULT; | 159 | return -EFAULT; |
@@ -163,10 +163,10 @@ int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root, | |||
163 | } | 163 | } |
164 | 164 | ||
165 | 165 | ||
166 | int oprofilefs_create_ro_ulong(struct super_block * sb, struct dentry * root, | 166 | int oprofilefs_create_ro_ulong(struct super_block *sb, struct dentry *root, |
167 | char const * name, unsigned long * val) | 167 | char const *name, unsigned long *val) |
168 | { | 168 | { |
169 | struct dentry * d = __oprofilefs_create_file(sb, root, name, | 169 | struct dentry *d = __oprofilefs_create_file(sb, root, name, |
170 | &ulong_ro_fops, 0444); | 170 | &ulong_ro_fops, 0444); |
171 | if (!d) | 171 | if (!d) |
172 | return -EFAULT; | 172 | return -EFAULT; |
@@ -176,23 +176,23 @@ int oprofilefs_create_ro_ulong(struct super_block * sb, struct dentry * root, | |||
176 | } | 176 | } |
177 | 177 | ||
178 | 178 | ||
179 | static ssize_t atomic_read_file(struct file * file, char __user * buf, size_t count, loff_t * offset) | 179 | static ssize_t atomic_read_file(struct file *file, char __user *buf, size_t count, loff_t *offset) |
180 | { | 180 | { |
181 | atomic_t * val = file->private_data; | 181 | atomic_t *val = file->private_data; |
182 | return oprofilefs_ulong_to_user(atomic_read(val), buf, count, offset); | 182 | return oprofilefs_ulong_to_user(atomic_read(val), buf, count, offset); |
183 | } | 183 | } |
184 | 184 | ||
185 | 185 | ||
186 | static const struct file_operations atomic_ro_fops = { | 186 | static const struct file_operations atomic_ro_fops = { |
187 | .read = atomic_read_file, | 187 | .read = atomic_read_file, |
188 | .open = default_open, | 188 | .open = default_open, |
189 | }; | 189 | }; |
190 | |||
191 | 190 | ||
192 | int oprofilefs_create_ro_atomic(struct super_block * sb, struct dentry * root, | 191 | |
193 | char const * name, atomic_t * val) | 192 | int oprofilefs_create_ro_atomic(struct super_block *sb, struct dentry *root, |
193 | char const *name, atomic_t *val) | ||
194 | { | 194 | { |
195 | struct dentry * d = __oprofilefs_create_file(sb, root, name, | 195 | struct dentry *d = __oprofilefs_create_file(sb, root, name, |
196 | &atomic_ro_fops, 0444); | 196 | &atomic_ro_fops, 0444); |
197 | if (!d) | 197 | if (!d) |
198 | return -EFAULT; | 198 | return -EFAULT; |
@@ -201,9 +201,9 @@ int oprofilefs_create_ro_atomic(struct super_block * sb, struct dentry * root, | |||
201 | return 0; | 201 | return 0; |
202 | } | 202 | } |
203 | 203 | ||
204 | 204 | ||
205 | int oprofilefs_create_file(struct super_block * sb, struct dentry * root, | 205 | int oprofilefs_create_file(struct super_block *sb, struct dentry *root, |
206 | char const * name, const struct file_operations * fops) | 206 | char const *name, const struct file_operations *fops) |
207 | { | 207 | { |
208 | if (!__oprofilefs_create_file(sb, root, name, fops, 0644)) | 208 | if (!__oprofilefs_create_file(sb, root, name, fops, 0644)) |
209 | return -EFAULT; | 209 | return -EFAULT; |
@@ -211,8 +211,8 @@ int oprofilefs_create_file(struct super_block * sb, struct dentry * root, | |||
211 | } | 211 | } |
212 | 212 | ||
213 | 213 | ||
214 | int oprofilefs_create_file_perm(struct super_block * sb, struct dentry * root, | 214 | int oprofilefs_create_file_perm(struct super_block *sb, struct dentry *root, |
215 | char const * name, const struct file_operations * fops, int perm) | 215 | char const *name, const struct file_operations *fops, int perm) |
216 | { | 216 | { |
217 | if (!__oprofilefs_create_file(sb, root, name, fops, perm)) | 217 | if (!__oprofilefs_create_file(sb, root, name, fops, perm)) |
218 | return -EFAULT; | 218 | return -EFAULT; |
@@ -220,11 +220,11 @@ int oprofilefs_create_file_perm(struct super_block * sb, struct dentry * root, | |||
220 | } | 220 | } |
221 | 221 | ||
222 | 222 | ||
223 | struct dentry * oprofilefs_mkdir(struct super_block * sb, | 223 | struct dentry *oprofilefs_mkdir(struct super_block *sb, |
224 | struct dentry * root, char const * name) | 224 | struct dentry *root, char const *name) |
225 | { | 225 | { |
226 | struct dentry * dentry; | 226 | struct dentry *dentry; |
227 | struct inode * inode; | 227 | struct inode *inode; |
228 | 228 | ||
229 | dentry = d_alloc_name(root, name); | 229 | dentry = d_alloc_name(root, name); |
230 | if (!dentry) | 230 | if (!dentry) |
@@ -241,10 +241,10 @@ struct dentry * oprofilefs_mkdir(struct super_block * sb, | |||
241 | } | 241 | } |
242 | 242 | ||
243 | 243 | ||
244 | static int oprofilefs_fill_super(struct super_block * sb, void * data, int silent) | 244 | static int oprofilefs_fill_super(struct super_block *sb, void *data, int silent) |
245 | { | 245 | { |
246 | struct inode * root_inode; | 246 | struct inode *root_inode; |
247 | struct dentry * root_dentry; | 247 | struct dentry *root_dentry; |
248 | 248 | ||
249 | sb->s_blocksize = PAGE_CACHE_SIZE; | 249 | sb->s_blocksize = PAGE_CACHE_SIZE; |
250 | sb->s_blocksize_bits = PAGE_CACHE_SHIFT; | 250 | sb->s_blocksize_bits = PAGE_CACHE_SHIFT; |
diff --git a/drivers/oprofile/timer_int.c b/drivers/oprofile/timer_int.c index 710a45f0d734..333f915568c7 100644 --- a/drivers/oprofile/timer_int.c +++ b/drivers/oprofile/timer_int.c | |||
@@ -19,7 +19,7 @@ | |||
19 | 19 | ||
20 | static int timer_notify(struct pt_regs *regs) | 20 | static int timer_notify(struct pt_regs *regs) |
21 | { | 21 | { |
22 | oprofile_add_sample(regs, 0); | 22 | oprofile_add_sample(regs, 0); |
23 | return 0; | 23 | return 0; |
24 | } | 24 | } |
25 | 25 | ||
@@ -35,7 +35,7 @@ static void timer_stop(void) | |||
35 | } | 35 | } |
36 | 36 | ||
37 | 37 | ||
38 | void __init oprofile_timer_init(struct oprofile_operations * ops) | 38 | void __init oprofile_timer_init(struct oprofile_operations *ops) |
39 | { | 39 | { |
40 | ops->create_files = NULL; | 40 | ops->create_files = NULL; |
41 | ops->setup = NULL; | 41 | ops->setup = NULL; |