diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-01-06 04:18:43 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-01-06 04:18:43 -0500 |
| commit | 99793e3dbe39a50d871eedc361659a894601e2bf (patch) | |
| tree | a676d42a42f4c884e38121e5a5a4d6630929a9f7 /kernel | |
| parent | 3e80680208ba6ce9635ca7c21ad0019442ea166a (diff) | |
| parent | a103e2ab7377dbbef2506be59c49a3f2ae10b60b (diff) | |
Merge branches 'tracing/kmemtrace2' and 'tracing/ftrace' into tracing/urgent
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/trace/Makefile | 2 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 741 | ||||
| -rw-r--r-- | kernel/trace/trace.h | 36 | ||||
| -rw-r--r-- | kernel/trace/trace_boot.c | 1 | ||||
| -rw-r--r-- | kernel/trace/trace_branch.c | 295 | ||||
| -rw-r--r-- | kernel/trace/trace_functions_graph.c | 4 | ||||
| -rw-r--r-- | kernel/trace/trace_hw_branches.c | 1 | ||||
| -rw-r--r-- | kernel/trace/trace_mmiotrace.c | 4 | ||||
| -rw-r--r-- | kernel/trace/trace_output.c | 832 | ||||
| -rw-r--r-- | kernel/trace/trace_output.h | 59 | ||||
| -rw-r--r-- | kernel/trace/trace_power.c | 1 | ||||
| -rw-r--r-- | kernel/trace/trace_selftest.c | 1 | ||||
| -rw-r--r-- | kernel/trace/trace_stat.c | 251 |
13 files changed, 1392 insertions, 836 deletions
diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile index 513dc86b5dfa..05c9182061de 100644 --- a/kernel/trace/Makefile +++ b/kernel/trace/Makefile | |||
| @@ -19,6 +19,8 @@ obj-$(CONFIG_FUNCTION_TRACER) += libftrace.o | |||
| 19 | obj-$(CONFIG_RING_BUFFER) += ring_buffer.o | 19 | obj-$(CONFIG_RING_BUFFER) += ring_buffer.o |
| 20 | 20 | ||
| 21 | obj-$(CONFIG_TRACING) += trace.o | 21 | obj-$(CONFIG_TRACING) += trace.o |
| 22 | obj-$(CONFIG_TRACING) += trace_output.o | ||
| 23 | obj-$(CONFIG_TRACING) += trace_stat.o | ||
| 22 | obj-$(CONFIG_CONTEXT_SWITCH_TRACER) += trace_sched_switch.o | 24 | obj-$(CONFIG_CONTEXT_SWITCH_TRACER) += trace_sched_switch.o |
| 23 | obj-$(CONFIG_SYSPROF_TRACER) += trace_sysprof.o | 25 | obj-$(CONFIG_SYSPROF_TRACER) += trace_sysprof.o |
| 24 | obj-$(CONFIG_FUNCTION_TRACER) += trace_functions.o | 26 | obj-$(CONFIG_FUNCTION_TRACER) += trace_functions.o |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index c580233add95..0418fc338b5c 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <linux/irqflags.h> | 37 | #include <linux/irqflags.h> |
| 38 | 38 | ||
| 39 | #include "trace.h" | 39 | #include "trace.h" |
| 40 | #include "trace_output.h" | ||
| 40 | 41 | ||
| 41 | #define TRACE_BUFFER_FLAGS (RB_FL_OVERWRITE) | 42 | #define TRACE_BUFFER_FLAGS (RB_FL_OVERWRITE) |
| 42 | 43 | ||
| @@ -329,132 +330,6 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) | |||
| 329 | tracing_record_cmdline(current); | 330 | tracing_record_cmdline(current); |
| 330 | } | 331 | } |
| 331 | 332 | ||
| 332 | /** | ||
| 333 | * trace_seq_printf - sequence printing of trace information | ||
| 334 | * @s: trace sequence descriptor | ||
| 335 | * @fmt: printf format string | ||
| 336 | * | ||
| 337 | * The tracer may use either sequence operations or its own | ||
| 338 | * copy to user routines. To simplify formating of a trace | ||
| 339 | * trace_seq_printf is used to store strings into a special | ||
| 340 | * buffer (@s). Then the output may be either used by | ||
| 341 | * the sequencer or pulled into another buffer. | ||
| 342 | */ | ||
| 343 | int | ||
| 344 | trace_seq_printf(struct trace_seq *s, const char *fmt, ...) | ||
| 345 | { | ||
| 346 | int len = (PAGE_SIZE - 1) - s->len; | ||
| 347 | va_list ap; | ||
| 348 | int ret; | ||
| 349 | |||
| 350 | if (!len) | ||
| 351 | return 0; | ||
| 352 | |||
| 353 | va_start(ap, fmt); | ||
| 354 | ret = vsnprintf(s->buffer + s->len, len, fmt, ap); | ||
| 355 | va_end(ap); | ||
| 356 | |||
| 357 | /* If we can't write it all, don't bother writing anything */ | ||
| 358 | if (ret >= len) | ||
| 359 | return 0; | ||
| 360 | |||
| 361 | s->len += ret; | ||
| 362 | |||
| 363 | return len; | ||
| 364 | } | ||
| 365 | |||
| 366 | /** | ||
| 367 | * trace_seq_puts - trace sequence printing of simple string | ||
| 368 | * @s: trace sequence descriptor | ||
| 369 | * @str: simple string to record | ||
| 370 | * | ||
| 371 | * The tracer may use either the sequence operations or its own | ||
| 372 | * copy to user routines. This function records a simple string | ||
| 373 | * into a special buffer (@s) for later retrieval by a sequencer | ||
| 374 | * or other mechanism. | ||
| 375 | */ | ||
| 376 | static int | ||
| 377 | trace_seq_puts(struct trace_seq *s, const char *str) | ||
| 378 | { | ||
| 379 | int len = strlen(str); | ||
| 380 | |||
| 381 | if (len > ((PAGE_SIZE - 1) - s->len)) | ||
| 382 | return 0; | ||
| 383 | |||
| 384 | memcpy(s->buffer + s->len, str, len); | ||
| 385 | s->len += len; | ||
| 386 | |||
| 387 | return len; | ||
| 388 | } | ||
| 389 | |||
| 390 | static int | ||
| 391 | trace_seq_putc(struct trace_seq *s, unsigned char c) | ||
| 392 | { | ||
| 393 | if (s->len >= (PAGE_SIZE - 1)) | ||
| 394 | return 0; | ||
| 395 | |||
| 396 | s->buffer[s->len++] = c; | ||
| 397 | |||
| 398 | return 1; | ||
| 399 | } | ||
| 400 | |||
| 401 | static int | ||
| 402 | trace_seq_putmem(struct trace_seq *s, void *mem, size_t len) | ||
| 403 | { | ||
| 404 | if (len > ((PAGE_SIZE - 1) - s->len)) | ||
| 405 | return 0; | ||
| 406 | |||
| 407 | memcpy(s->buffer + s->len, mem, len); | ||
| 408 | s->len += len; | ||
| 409 | |||
| 410 | return len; | ||
| 411 | } | ||
| 412 | |||
| 413 | #define MAX_MEMHEX_BYTES 8 | ||
| 414 | #define HEX_CHARS (MAX_MEMHEX_BYTES*2 + 1) | ||
| 415 | |||
| 416 | static int | ||
| 417 | trace_seq_putmem_hex(struct trace_seq *s, void *mem, size_t len) | ||
| 418 | { | ||
| 419 | unsigned char hex[HEX_CHARS]; | ||
| 420 | unsigned char *data = mem; | ||
| 421 | int i, j; | ||
| 422 | |||
| 423 | #ifdef __BIG_ENDIAN | ||
| 424 | for (i = 0, j = 0; i < len; i++) { | ||
| 425 | #else | ||
| 426 | for (i = len-1, j = 0; i >= 0; i--) { | ||
| 427 | #endif | ||
| 428 | hex[j++] = hex_asc_hi(data[i]); | ||
| 429 | hex[j++] = hex_asc_lo(data[i]); | ||
| 430 | } | ||
| 431 | hex[j++] = ' '; | ||
| 432 | |||
| 433 | return trace_seq_putmem(s, hex, j); | ||
| 434 | } | ||
| 435 | |||
| 436 | static int | ||
| 437 | trace_seq_path(struct trace_seq *s, struct path *path) | ||
| 438 | { | ||
| 439 | unsigned char *p; | ||
| 440 | |||
| 441 | if (s->len >= (PAGE_SIZE - 1)) | ||
| 442 | return 0; | ||
| 443 | p = d_path(path, s->buffer + s->len, PAGE_SIZE - s->len); | ||
| 444 | if (!IS_ERR(p)) { | ||
| 445 | p = mangle_path(s->buffer + s->len, p, "\n"); | ||
| 446 | if (p) { | ||
| 447 | s->len = p - s->buffer; | ||
| 448 | return 1; | ||
| 449 | } | ||
| 450 | } else { | ||
| 451 | s->buffer[s->len++] = '?'; | ||
| 452 | return 1; | ||
| 453 | } | ||
| 454 | |||
| 455 | return 0; | ||
| 456 | } | ||
| 457 | |||
| 458 | static void | 333 | static void |
| 459 | trace_seq_reset(struct trace_seq *s) | 334 | trace_seq_reset(struct trace_seq *s) |
| 460 | { | 335 | { |
| @@ -1472,154 +1347,6 @@ static void s_stop(struct seq_file *m, void *p) | |||
| 1472 | mutex_unlock(&trace_types_lock); | 1347 | mutex_unlock(&trace_types_lock); |
| 1473 | } | 1348 | } |
| 1474 | 1349 | ||
| 1475 | #ifdef CONFIG_KRETPROBES | ||
| 1476 | static inline const char *kretprobed(const char *name) | ||
| 1477 | { | ||
| 1478 | static const char tramp_name[] = "kretprobe_trampoline"; | ||
| 1479 | int size = sizeof(tramp_name); | ||
| 1480 | |||
| 1481 | if (strncmp(tramp_name, name, size) == 0) | ||
| 1482 | return "[unknown/kretprobe'd]"; | ||
| 1483 | return name; | ||
| 1484 | } | ||
| 1485 | #else | ||
| 1486 | static inline const char *kretprobed(const char *name) | ||
| 1487 | { | ||
| 1488 | return name; | ||
| 1489 | } | ||
| 1490 | #endif /* CONFIG_KRETPROBES */ | ||
| 1491 | |||
| 1492 | static int | ||
| 1493 | |||
