diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/oprofile/buffer_sync.c | 24 | ||||
-rw-r--r-- | drivers/oprofile/cpu_buffer.c | 15 | ||||
-rw-r--r-- | drivers/oprofile/event_buffer.h | 7 |
3 files changed, 45 insertions, 1 deletions
diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index ed982273fb8b..37681700b61a 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c | |||
@@ -628,3 +628,27 @@ void sync_buffer(int cpu) | |||
628 | 628 | ||
629 | mutex_unlock(&buffer_mutex); | 629 | mutex_unlock(&buffer_mutex); |
630 | } | 630 | } |
631 | |||
632 | /* The function can be used to add a buffer worth of data directly to | ||
633 | * the kernel buffer. The buffer is assumed to be a circular buffer. | ||
634 | * Take the entries from index start and end at index end, wrapping | ||
635 | * at max_entries. | ||
636 | */ | ||
637 | void oprofile_put_buff(unsigned long *buf, unsigned int start, | ||
638 | unsigned int stop, unsigned int max) | ||
639 | { | ||
640 | int i; | ||
641 | |||
642 | i = start; | ||
643 | |||
644 | mutex_lock(&buffer_mutex); | ||
645 | while (i != stop) { | ||
646 | add_event_entry(buf[i++]); | ||
647 | |||
648 | if (i >= max) | ||
649 | i = 0; | ||
650 | } | ||
651 | |||
652 | mutex_unlock(&buffer_mutex); | ||
653 | } | ||
654 | |||
diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c index e1bd5a937f6c..7ba39fe20a8a 100644 --- a/drivers/oprofile/cpu_buffer.c +++ b/drivers/oprofile/cpu_buffer.c | |||
@@ -38,13 +38,26 @@ static int work_enabled; | |||
38 | void free_cpu_buffers(void) | 38 | void free_cpu_buffers(void) |
39 | { | 39 | { |
40 | int i; | 40 | int i; |
41 | 41 | ||
42 | for_each_online_cpu(i) { | 42 | for_each_online_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 | } |
46 | } | 46 | } |
47 | 47 | ||
48 | unsigned long oprofile_get_cpu_buffer_size(void) | ||
49 | { | ||
50 | return fs_cpu_buffer_size; | ||
51 | } | ||
52 | |||
53 | void oprofile_cpu_buffer_inc_smpl_lost(void) | ||
54 | { | ||
55 | struct oprofile_cpu_buffer *cpu_buf | ||
56 | = &__get_cpu_var(cpu_buffer); | ||
57 | |||
58 | cpu_buf->sample_lost_overflow++; | ||
59 | } | ||
60 | |||
48 | int alloc_cpu_buffers(void) | 61 | int alloc_cpu_buffers(void) |
49 | { | 62 | { |
50 | int i; | 63 | int i; |
diff --git a/drivers/oprofile/event_buffer.h b/drivers/oprofile/event_buffer.h index 5076ed1ebd8f..84bf324c5771 100644 --- a/drivers/oprofile/event_buffer.h +++ b/drivers/oprofile/event_buffer.h | |||
@@ -17,6 +17,13 @@ int alloc_event_buffer(void); | |||
17 | 17 | ||
18 | void free_event_buffer(void); | 18 | void free_event_buffer(void); |
19 | 19 | ||
20 | /** | ||
21 | * Add data to the event buffer. | ||
22 | * The data passed is free-form, but typically consists of | ||
23 | * file offsets, dcookies, context information, and ESCAPE codes. | ||
24 | */ | ||
25 | void add_event_entry(unsigned long data); | ||
26 | |||
20 | /* wake up the process sleeping on the event file */ | 27 | /* wake up the process sleeping on the event file */ |
21 | void wake_up_buffer_waiter(void); | 28 | void wake_up_buffer_waiter(void); |
22 | 29 | ||