diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-04-07 05:15:40 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-04-07 05:15:40 -0400 |
commit | 5e34437840d33554f69380584311743b39e8fbeb (patch) | |
tree | e081135619ee146af5efb9ee883afca950df5757 /kernel/trace/trace_mmiotrace.c | |
parent | 77d05632baee21b1cef8730d7c06aa69601e4dca (diff) | |
parent | d508afb437daee7cf07da085b635c44a4ebf9b38 (diff) |
Merge branch 'linus' into core/softlockup
Conflicts:
kernel/sysctl.c
Diffstat (limited to 'kernel/trace/trace_mmiotrace.c')
-rw-r--r-- | kernel/trace/trace_mmiotrace.c | 59 |
1 files changed, 28 insertions, 31 deletions
diff --git a/kernel/trace/trace_mmiotrace.c b/kernel/trace/trace_mmiotrace.c index fffcb069f1dc..8e37fcddd8b4 100644 --- a/kernel/trace/trace_mmiotrace.c +++ b/kernel/trace/trace_mmiotrace.c | |||
@@ -9,8 +9,10 @@ | |||
9 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
10 | #include <linux/mmiotrace.h> | 10 | #include <linux/mmiotrace.h> |
11 | #include <linux/pci.h> | 11 | #include <linux/pci.h> |
12 | #include <asm/atomic.h> | ||
12 | 13 | ||
13 | #include "trace.h" | 14 | #include "trace.h" |
15 | #include "trace_output.h" | ||
14 | 16 | ||
15 | struct header_iter { | 17 | struct header_iter { |
16 | struct pci_dev *dev; | 18 | struct pci_dev *dev; |
@@ -19,6 +21,7 @@ struct header_iter { | |||
19 | static struct trace_array *mmio_trace_array; | 21 | static struct trace_array *mmio_trace_array; |
20 | static bool overrun_detected; | 22 | static bool overrun_detected; |
21 | static unsigned long prev_overruns; | 23 | static unsigned long prev_overruns; |
24 | static atomic_t dropped_count; | ||
22 | 25 | ||
23 | static void mmio_reset_data(struct trace_array *tr) | 26 | static void mmio_reset_data(struct trace_array *tr) |
24 | { | 27 | { |
@@ -121,11 +124,11 @@ static void mmio_close(struct trace_iterator *iter) | |||
121 | 124 | ||
122 | static unsigned long count_overruns(struct trace_iterator *iter) | 125 | static unsigned long count_overruns(struct trace_iterator *iter) |
123 | { | 126 | { |
124 | unsigned long cnt = 0; | 127 | unsigned long cnt = atomic_xchg(&dropped_count, 0); |
125 | unsigned long over = ring_buffer_overruns(iter->tr->buffer); | 128 | unsigned long over = ring_buffer_overruns(iter->tr->buffer); |
126 | 129 | ||
127 | if (over > prev_overruns) | 130 | if (over > prev_overruns) |
128 | cnt = over - prev_overruns; | 131 | cnt += over - prev_overruns; |
129 | prev_overruns = over; | 132 | prev_overruns = over; |
130 | return cnt; | 133 | return cnt; |
131 | } | 134 | } |
@@ -181,21 +184,22 @@ static enum print_line_t mmio_print_rw(struct trace_iterator *iter) | |||
181 | switch (rw->opcode) { | 184 | switch (rw->opcode) { |
182 | case MMIO_READ: | 185 | case MMIO_READ: |
183 | ret = trace_seq_printf(s, | 186 | ret = trace_seq_printf(s, |
184 | "R %d %lu.%06lu %d 0x%llx 0x%lx 0x%lx %d\n", | 187 | "R %d %u.%06lu %d 0x%llx 0x%lx 0x%lx %d\n", |
185 | rw->width, secs, usec_rem, rw->map_id, | 188 | rw->width, secs, usec_rem, rw->map_id, |
186 | (unsigned long long)rw->phys, | 189 | (unsigned long long)rw->phys, |
187 | rw->value, rw->pc, 0); | 190 | rw->value, rw->pc, 0); |
188 | break; | 191 | break; |
189 | case MMIO_WRITE: | 192 | case MMIO_WRITE: |
190 | ret = trace_seq_printf(s, | 193 | ret = trace_seq_printf(s, |
191 | "W %d %lu.%06lu %d 0x%llx 0x%lx 0x%lx %d\n", | 194 | "W %d %u.%06lu %d 0x%llx 0x%lx 0x%lx %d\n", |
192 | rw->width, secs, usec_rem, rw->map_id, | 195 | rw->width, secs, usec_rem, rw->map_id, |
193 | (unsigned long long)rw->phys, | 196 | (unsigned long long)rw->phys, |
194 | rw->value, rw->pc, 0); | 197 | rw->value, rw->pc, 0); |
195 | break; | 198 | break; |
196 | case MMIO_UNKNOWN_OP: | 199 | case MMIO_UNKNOWN_OP: |
197 | ret = trace_seq_printf(s, | 200 | ret = trace_seq_printf(s, |
198 | "UNKNOWN %lu.%06lu %d 0x%llx %02x,%02x,%02x 0x%lx %d\n", | 201 | "UNKNOWN %u.%06lu %d 0x%llx %02lx,%02lx," |
202 | "%02lx 0x%lx %d\n", | ||
199 | secs, usec_rem, rw->map_id, | 203 | secs, usec_rem, rw->map_id, |
200 | (unsigned long long)rw->phys, | 204 | (unsigned long long)rw->phys, |
201 | (rw->value >> 16) & 0xff, (rw->value >> 8) & 0xff, | 205 | (rw->value >> 16) & 0xff, (rw->value >> 8) & 0xff, |
@@ -227,14 +231,14 @@ static enum print_line_t mmio_print_map(struct trace_iterator *iter) | |||
227 | switch (m->opcode) { | 231 | switch (m->opcode) { |
228 | case MMIO_PROBE: | 232 | case MMIO_PROBE: |
229 | ret = trace_seq_printf(s, | 233 | ret = trace_seq_printf(s, |
230 | "MAP %lu.%06lu %d 0x%llx 0x%lx 0x%lx 0x%lx %d\n", | 234 | "MAP %u.%06lu %d 0x%llx 0x%lx 0x%lx 0x%lx %d\n", |
231 | secs, usec_rem, m->map_id, | 235 | secs, usec_rem, m->map_id, |
232 | (unsigned long long)m->phys, m->virt, m->len, | 236 | (unsigned long long)m->phys, m->virt, m->len, |
233 | 0UL, 0); | 237 | 0UL, 0); |
234 | break; | 238 | break; |
235 | case MMIO_UNPROBE: | 239 | case MMIO_UNPROBE: |
236 | ret = trace_seq_printf(s, | 240 | ret = trace_seq_printf(s, |
237 | "UNMAP %lu.%06lu %d 0x%lx %d\n", | 241 | "UNMAP %u.%06lu %d 0x%lx %d\n", |
238 | secs, usec_rem, m->map_id, 0UL, 0); | 242 | secs, usec_rem, m->map_id, 0UL, 0); |
239 | break; | 243 | break; |
240 | default: | 244 | default: |
@@ -253,18 +257,15 @@ static enum print_line_t mmio_print_mark(struct trace_iterator *iter) | |||
253 | const char *msg = print->buf; | 257 | const char *msg = print->buf; |
254 | struct trace_seq *s = &iter->seq; | 258 | struct trace_seq *s = &iter->seq; |
255 | unsigned long long t = ns2usecs(iter->ts); | 259 | unsigned long long t = ns2usecs(iter->ts); |
256 | unsigned long usec_rem = do_div(t, 1000000ULL); | 260 | unsigned long usec_rem = do_div(t, USEC_PER_SEC); |
257 | unsigned secs = (unsigned long)t; | 261 | unsigned secs = (unsigned long)t; |
258 | int ret; | 262 | int ret; |
259 | 263 | ||
260 | /* The trailing newline must be in the message. */ | 264 | /* The trailing newline must be in the message. */ |
261 | ret = trace_seq_printf(s, "MARK %lu.%06lu %s", secs, usec_rem, msg); | 265 | ret = trace_seq_printf(s, "MARK %u.%06lu %s", secs, usec_rem, msg); |
262 | if (!ret) | 266 | if (!ret) |
263 | return TRACE_TYPE_PARTIAL_LINE; | 267 | return TRACE_TYPE_PARTIAL_LINE; |
264 | 268 | ||
265 | if (entry->flags & TRACE_FLAG_CONT) | ||
266 | trace_seq_print_cont(s, iter); | ||
267 | |||
268 | return TRACE_TYPE_HANDLED; | 269 | return TRACE_TYPE_HANDLED; |
269 | } | 270 | } |
270 | 271 | ||
@@ -306,19 +307,17 @@ static void __trace_mmiotrace_rw(struct trace_array *tr, | |||
306 | { | 307 | { |
307 | struct ring_buffer_event *event; | 308 | struct ring_buffer_event *event; |
308 | struct trace_mmiotrace_rw *entry; | 309 | struct trace_mmiotrace_rw *entry; |
309 | unsigned long irq_flags; | 310 | int pc = preempt_count(); |
310 | 311 | ||
311 | event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry), | 312 | event = trace_buffer_lock_reserve(tr, TRACE_MMIO_RW, |
312 | &irq_flags); | 313 | sizeof(*entry), 0, pc); |
313 | if (!event) | 314 | if (!event) { |
315 | atomic_inc(&dropped_count); | ||
314 | return; | 316 | return; |
317 | } | ||
315 | entry = ring_buffer_event_data(event); | 318 | entry = ring_buffer_event_data(event); |
316 | tracing_generic_entry_update(&entry->ent, 0, preempt_count()); | ||
317 | entry->ent.type = TRACE_MMIO_RW; | ||
318 | entry->rw = *rw; | 319 | entry->rw = *rw; |
319 | ring_buffer_unlock_commit(tr->buffer, event, irq_flags); | 320 | trace_buffer_unlock_commit(tr, event, 0, pc); |
320 | |||
321 | trace_wake_up(); | ||
322 | } | 321 | } |
323 | 322 | ||
324 | void mmio_trace_rw(struct mmiotrace_rw *rw) | 323 | void mmio_trace_rw(struct mmiotrace_rw *rw) |
@@ -334,19 +333,17 @@ static void __trace_mmiotrace_map(struct trace_array *tr, | |||
334 | { | 333 | { |
335 | struct ring_buffer_event *event; | 334 | struct ring_buffer_event *event; |
336 | struct trace_mmiotrace_map *entry; | 335 | struct trace_mmiotrace_map *entry; |
337 | unsigned long irq_flags; | 336 | int pc = preempt_count(); |
338 | 337 | ||
339 | event = ring_buffer_lock_reserve(tr->buffer, sizeof(*entry), | 338 | event = trace_buffer_lock_reserve(tr, TRACE_MMIO_MAP, |
340 | &irq_flags); | 339 | sizeof(*entry), 0, pc); |
341 | if (!event) | 340 | if (!event) { |
341 | atomic_inc(&dropped_count); | ||
342 | return; | 342 | return; |
343 | } | ||
343 | entry = ring_buffer_event_data(event); | 344 | entry = ring_buffer_event_data(event); |
344 | tracing_generic_entry_update(&entry->ent, 0, preempt_count()); | ||
345 | entry->ent.type = TRACE_MMIO_MAP; | ||
346 | entry->map = *map; | 345 | entry->map = *map; |
347 | ring_buffer_unlock_commit(tr->buffer, event, irq_flags); | 346 | trace_buffer_unlock_commit(tr, event, 0, pc); |
348 | |||
349 | trace_wake_up(); | ||
350 | } | 347 | } |
351 | 348 | ||
352 | void mmio_trace_mapping(struct mmiotrace_map *map) | 349 | void mmio_trace_mapping(struct mmiotrace_map *map) |
@@ -362,5 +359,5 @@ void mmio_trace_mapping(struct mmiotrace_map *map) | |||
362 | 359 | ||
363 | int mmio_trace_printk(const char *fmt, va_list args) | 360 | int mmio_trace_printk(const char *fmt, va_list args) |
364 | { | 361 | { |
365 | return trace_vprintk(0, -1, fmt, args); | 362 | return trace_vprintk(0, fmt, args); |
366 | } | 363 | } |