diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-01-10 21:41:39 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-01-10 21:41:39 -0500 |
commit | abede81c4fb2e3b85d8760f25e3da39d2c69a134 (patch) | |
tree | 26c893ec108d837eb9171d678c55a1cea7b22af4 /drivers/oprofile/cpu_buffer.h | |
parent | c9d557c19f94df42db78d4a5de4d25feee694bad (diff) | |
parent | c59765042f53a79a7a65585042ff463b69cb248c (diff) |
Merge commit 'v2.6.29-rc1' into core/urgent
Diffstat (limited to 'drivers/oprofile/cpu_buffer.h')
-rw-r--r-- | drivers/oprofile/cpu_buffer.h | 89 |
1 files changed, 38 insertions, 51 deletions
diff --git a/drivers/oprofile/cpu_buffer.h b/drivers/oprofile/cpu_buffer.h index aacb0f0bc566..63f81c44846a 100644 --- a/drivers/oprofile/cpu_buffer.h +++ b/drivers/oprofile/cpu_buffer.h | |||
@@ -1,10 +1,11 @@ | |||
1 | /** | 1 | /** |
2 | * @file cpu_buffer.h | 2 | * @file cpu_buffer.h |
3 | * | 3 | * |
4 | * @remark Copyright 2002 OProfile authors | 4 | * @remark Copyright 2002-2009 OProfile authors |
5 | * @remark Read the file COPYING | 5 | * @remark Read the file COPYING |
6 | * | 6 | * |
7 | * @author John Levon <levon@movementarian.org> | 7 | * @author John Levon <levon@movementarian.org> |
8 | * @author Robert Richter <robert.richter@amd.com> | ||
8 | */ | 9 | */ |
9 | 10 | ||
10 | #ifndef OPROFILE_CPU_BUFFER_H | 11 | #ifndef OPROFILE_CPU_BUFFER_H |
@@ -31,17 +32,12 @@ void end_cpu_work(void); | |||
31 | struct op_sample { | 32 | struct op_sample { |
32 | unsigned long eip; | 33 | unsigned long eip; |
33 | unsigned long event; | 34 | unsigned long event; |
35 | unsigned long data[0]; | ||
34 | }; | 36 | }; |
35 | 37 | ||
36 | struct op_entry { | 38 | struct op_entry; |
37 | struct ring_buffer_event *event; | ||
38 | struct op_sample *sample; | ||
39 | unsigned long irq_flags; | ||
40 | }; | ||
41 | 39 | ||
42 | struct oprofile_cpu_buffer { | 40 | struct oprofile_cpu_buffer { |
43 | volatile unsigned long head_pos; | ||
44 | volatile unsigned long tail_pos; | ||
45 | unsigned long buffer_size; | 41 | unsigned long buffer_size; |
46 | struct task_struct *last_task; | 42 | struct task_struct *last_task; |
47 | int last_is_kernel; | 43 | int last_is_kernel; |
@@ -54,8 +50,6 @@ struct oprofile_cpu_buffer { | |||
54 | struct delayed_work work; | 50 | struct delayed_work work; |
55 | }; | 51 | }; |
56 | 52 | ||
57 | extern struct ring_buffer *op_ring_buffer_read; | ||
58 | extern struct ring_buffer *op_ring_buffer_write; | ||
59 | DECLARE_PER_CPU(struct oprofile_cpu_buffer, cpu_buffer); | 53 | DECLARE_PER_CPU(struct oprofile_cpu_buffer, cpu_buffer); |
60 | 54 | ||
61 | /* | 55 | /* |
@@ -64,7 +58,7 @@ DECLARE_PER_CPU(struct oprofile_cpu_buffer, cpu_buffer); | |||
64 | * reset these to invalid values; the next sample collected will | 58 | * reset these to invalid values; the next sample collected will |
65 | * populate the buffer with proper values to initialize the buffer | 59 | * populate the buffer with proper values to initialize the buffer |
66 | */ | 60 | */ |
67 | static inline void cpu_buffer_reset(int cpu) | 61 | static inline void op_cpu_buffer_reset(int cpu) |
68 | { | 62 | { |
69 | struct oprofile_cpu_buffer *cpu_buf = &per_cpu(cpu_buffer, cpu); | 63 | struct oprofile_cpu_buffer *cpu_buf = &per_cpu(cpu_buffer, cpu); |
70 | 64 | ||
@@ -72,55 +66,48 @@ static inline void cpu_buffer_reset(int cpu) | |||
72 | cpu_buf->last_task = NULL; | 66 | cpu_buf->last_task = NULL; |
73 | } | 67 | } |
74 | 68 | ||
75 | static inline int cpu_buffer_write_entry(struct op_entry *entry) | 69 | struct op_sample |
76 | { | 70 | *op_cpu_buffer_write_reserve(struct op_entry *entry, unsigned long size); |
77 | entry->event = ring_buffer_lock_reserve(op_ring_buffer_write, | 71 | int op_cpu_buffer_write_commit(struct op_entry *entry); |
78 | sizeof(struct op_sample), | 72 | struct op_sample *op_cpu_buffer_read_entry(struct op_entry *entry, int cpu); |
79 | &entry->irq_flags); | 73 | unsigned long op_cpu_buffer_entries(int cpu); |
80 | if (entry->event) | ||
81 | entry->sample = ring_buffer_event_data(entry->event); | ||
82 | else | ||
83 | entry->sample = NULL; | ||
84 | |||
85 | if (!entry->sample) | ||
86 | return -ENOMEM; | ||
87 | |||
88 | return 0; | ||
89 | } | ||
90 | 74 | ||
91 | static inline int cpu_buffer_write_commit(struct op_entry *entry) | 75 | /* returns the remaining free size of data in the entry */ |
76 | static inline | ||
77 | int op_cpu_buffer_add_data(struct op_entry *entry, unsigned long val) | ||
92 | { | 78 | { |
93 | return ring_buffer_unlock_commit(op_ring_buffer_write, entry->event, | 79 | if (!entry->size) |
94 | entry->irq_flags); | 80 | return 0; |
81 | *entry->data = val; | ||
82 | entry->size--; | ||
83 | entry->data++; | ||
84 | return entry->size; | ||
95 | } | 85 | } |
96 | 86 | ||
97 | static inline struct op_sample *cpu_buffer_read_entry(int cpu) | 87 | /* returns the size of data in the entry */ |
88 | static inline | ||
89 | int op_cpu_buffer_get_size(struct op_entry *entry) | ||
98 | { | 90 | { |
99 | struct ring_buffer_event *e; | 91 | return entry->size; |
100 | e = ring_buffer_consume(op_ring_buffer_read, cpu, NULL); | ||
101 | if (e) | ||
102 | return ring_buffer_event_data(e); | ||
103 | if (ring_buffer_swap_cpu(op_ring_buffer_read, | ||
104 | op_ring_buffer_write, | ||
105 | cpu)) | ||
106 | return NULL; | ||
107 | e = ring_buffer_consume(op_ring_buffer_read, cpu, NULL); | ||
108 | if (e) | ||
109 | return ring_buffer_event_data(e); | ||
110 | return NULL; | ||
111 | } | 92 | } |
112 | 93 | ||
113 | /* "acquire" as many cpu buffer slots as we can */ | 94 | /* returns 0 if empty or the size of data including the current value */ |
114 | static inline unsigned long cpu_buffer_entries(int cpu) | 95 | static inline |
96 | int op_cpu_buffer_get_data(struct op_entry *entry, unsigned long *val) | ||
115 | { | 97 | { |
116 | return ring_buffer_entries_cpu(op_ring_buffer_read, cpu) | 98 | int size = entry->size; |
117 | + ring_buffer_entries_cpu(op_ring_buffer_write, cpu); | 99 | if (!size) |
100 | return 0; | ||
101 | *val = *entry->data; | ||
102 | entry->size--; | ||
103 | entry->data++; | ||
104 | return size; | ||
118 | } | 105 | } |
119 | 106 | ||
120 | /* transient events for the CPU buffer -> event buffer */ | 107 | /* extra data flags */ |
121 | #define CPU_IS_KERNEL 1 | 108 | #define KERNEL_CTX_SWITCH (1UL << 0) |
122 | #define CPU_TRACE_BEGIN 2 | 109 | #define IS_KERNEL (1UL << 1) |
123 | #define IBS_FETCH_BEGIN 3 | 110 | #define TRACE_BEGIN (1UL << 2) |
124 | #define IBS_OP_BEGIN 4 | 111 | #define USER_CTX_SWITCH (1UL << 3) |
125 | 112 | ||
126 | #endif /* OPROFILE_CPU_BUFFER_H */ | 113 | #endif /* OPROFILE_CPU_BUFFER_H */ |