/* For general debugging purposes */ #include "../perf.h" #include #include #include #include #include #include "cache.h" #include "color.h" #include "event.h" #include "debug.h" #include "util.h" #include "target.h" int verbose; bool dump_trace = false, quiet = false; int debug_ordered_events; static int redirect_to_stderr; int debug_data_convert; int veprintf(int level, int var, const char *fmt, va_list args) { int ret = 0; if (var >= level) { if (use_browser >= 1 && !redirect_to_stderr) ui_helpline__vshow(fmt, args); else ret = vfprintf(stderr, fmt, args); } return ret; } int eprintf(int level, int var, const char *fmt, ...) { va_list args; int ret; va_start(args, fmt); ret = veprintf(level, var, fmt, args); va_end(args); return ret; } static int veprintf_time(u64 t, const char *fmt, va_list args) { int ret = 0; u64 secs, usecs, nsecs = t; secs = nsecs / NSEC_PER_SEC; nsecs -= secs * NSEC_PER_SEC; usecs = nsecs / NSEC_PER_USEC; ret = fprintf(stderr, "[%13" PRIu64 ".%06" PRIu64 "] ", secs, usecs); ret += vfprintf(stderr, fmt, args); return ret; } int eprintf_time(int level, int var, u64 t, const char *fmt, ...) { int ret = 0; va_list args; if (var >= level) { va_start(args, fmt); ret = veprintf_time(t, fmt, args); va_end(args); } return ret; } /* * Overloading libtraceevent standard info print * function, display with -v in perf. */ void pr_stat(const char *fmt, ...) { va_list args; va_start(args, fmt); veprintf(1, verbose, fmt, args); va_end(args); eprintf(1, verbose, "\n"); } int dump_printf(const char *fmt, ...) { va_list args; int ret = 0; if (dump_trace) { va_start(args, fmt); ret = vprintf(fmt, args); va_end(args); } return ret; } static void trace_event_printer(enum binary_printer_ops op, unsigned int val, void *extra) { const char *color = PERF_COLOR_BLUE; union perf_event *event = (union perf_event *)extra; unsigned char ch = (unsigned char)val; switch (op) { case BINARY_PRINT_DATA_BEGIN: printf("."); color_fprintf(stdout, color, "\n. ... raw event: size %d bytes\n", event->header.size); break; case BINARY_PRINT_LINE_BEGIN: printf("."); break; case BINARY_PRINT_ADDR: color_fprintf(stdout, color, " %04x: ", val); break; case BINARY_PRINT_NUM_DATA: color_fprintf(stdout, color, " %02x", val); break; case BINARY_PRINT_NUM_PAD: color_fprintf(stdout, color, " "); break; case BINARY_PRINT_SEP: color_fprintf(stdout, color, " "); break; case BINARY_PRINT_CHAR_DATA: color_fprintf(stdout, color, "%c", isprint(ch) ? ch : '.'); break; case BINARY_PRINT_CHAR_PAD: color_fprintf(stdout, color, " "); break; case BINARY_PRINT_LINE_END: color_fprintf(stdout, color, "\n"); break; case BINARY_PRINT_DATA_END: printf("\n"); break; default: break; } } void trace_event(union perf_event *event) { unsigned char *raw_event = (void *)event; if (!dump_trace) return; print_binary(raw_event, event->header.size, 16, trace_event_printer, event); } static struct debug_variable { const char *name; int *ptr; } debug_variables[] = { { .name = "verbose", .ptr = &verbose }, { .name = "ordered-events", .ptr = &debug_ordered_events}, { .name = "stderr", .ptr = &redirect_to_stderr}, { .name = "data-convert", .ptr = &debug_data_convert }, { .name = NULL, } }; int perf_debug_option(const char *str) { struct debug_variable *var = &debug_variables[0]; char *vstr, *s = strdup(str); int v = 1; vstr = strchr(s, '='); if (vstr) *vstr++ = 0; while (var->name) { if (!strcmp(s, var->name)) break; var++; } if (!var->name) { pr_err("Unknown debug variable name '%s'\n", s); free(s); return -1; } if (vstr) { v = atoi(vstr); /* * Allow only values in range (0, 10), * otherwise set 0. */ v = (v < 0) || (v > 10) ? 0 : v; } *var->ptr = v; free(s); return 0; } #define DEBUG_WRAPPER(__n, __l) \ static int pr_ ## __n ## _wrapper(const char *fmt, ...) \ { \ va_list args; \ int ret; \ \ va_start(args, fmt); \ ret = veprintf(__l, verbose, fmt, args); \ va_end(args); \ return ret; \ } DEBUG_WRAPPER(warning, 0); DEBUG_WRAPPER(debug, 1); void perf_debug_setup(void) { libapi_set_print(pr_warning_wrapper, pr_warning_wrapper, pr_debug_wrapper); } ='selected'>unified
authorThomas Gleixner <tglx@linutronix.de>2017-01-31 23:58:38 +0100
committerIngo Molnar <mingo@kernel.org>2017-02-01 08:37:27 +0100
commitdd86e373e09fb16b83e8adf5c48c421a4ca76468 (patch)
tree55703c2ea8584e303e342090614e0aab3509ab21 /drivers/usb/host/ehci-dbg.c
parent0b3589be9b98994ce3d5aeca52445d1f5627c4ba (diff)
perf/x86/intel/rapl: Make package handling more robust
The package management code in RAPL relies on package mapping being available before a CPU is started. This changed with: 9d85eb9119f4 ("x86/smpboot: Make logical package management more robust") because the ACPI/BIOS information turned out to be unreliable, but that left RAPL in broken state. This was not noticed because on a regular boot all CPUs are online before RAPL is initialized. A possible fix would be to reintroduce the mess which allocates a package data structure in CPU prepare and when it turns out to already exist in starting throw it away later in the CPU online callback. But that's a horrible hack and not required at all because RAPL becomes functional for perf only in the CPU online callback. That's correct because user space is not yet informed about the CPU being onlined, so nothing caan rely on RAPL being available on that particular CPU. Move the allocation to the CPU online callback and simplify the hotplug handling. At this point the package mapping is established and correct. This also adds a missing check for available package data in the event_init() function. Reported-by: Yasuaki Ishimatsu <yasu.isimatu@gmail.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sebastian Siewior <bigeasy@linutronix.de> Cc: Stephane Eranian <eranian@google.com> Cc: Vince Weaver <vincent.weaver@maine.edu> Fixes: 9d85eb9119f4 ("x86/smpboot: Make logical package management more robust") Link: http://lkml.kernel.org/r/20170131230141.212593966@linutronix.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/usb/host/ehci-dbg.c')