* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: perf tools: Add group event scheduling option to perf record/stat MAINTAINERS: Fix list of perf events source files perf tools: Fix build against newer glibc perf tools: Fix error handling of unknown events perf evlist: Fix missing event name init for default event perf list: Fix exit value
Unified · Split
| @@ -4971,7 +4971,7 @@ M: Paul Mackerras <paulus@samba.org> · 4970 unmodified lines | ||
| 4971 | 4971 | M: Ingo Molnar <mingo@elte.hu> |
| 4972 | 4972 | M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> |
| 4973 | 4973 | S: Supported |
| 4974 | −F: kernel/perf_event*.c | |
| 4974 | +F: kernel/events/* | |
| 4975 | 4975 | F: include/linux/perf_event.h |
| 4976 | 4976 | F: arch/*/kernel/perf_event*.c |
| 4977 | 4977 | F: arch/*/kernel/*/perf_event*.c |
| @@ -45,7 +45,7 @@ static int freq = 1000; · 44 unmodified lines | ||
| 45 | 45 | static int output; |
| 46 | 46 | static int pipe_output = 0; |
| 47 | 47 | static const char *output_name = NULL; |
| 48 | −static int group = 0; | |
| 48 | +static bool group = false; | |
| 49 | 49 | static int realtime_prio = 0; |
| 50 | 50 | static bool nodelay = false; |
| 51 | 51 | static bool raw_samples = false; |
| @@ -753,6 +753,8 @@ const struct option record_options[] = { · 701 unmodified lines | ||
| 753 | 753 | "child tasks do not inherit counters"), |
| 754 | 754 | OPT_UINTEGER('F', "freq", &user_freq, "profile at this frequency"), |
| 755 | 755 | OPT_UINTEGER('m', "mmap-pages", &mmap_pages, "number of mmap data pages"), |
| 756 | + OPT_BOOLEAN(0, "group", &group, | |
| 757 | + "put the counters into a counter group"), | |
| 756 | 758 | OPT_BOOLEAN('g', "call-graph", &call_graph, |
| 757 | 759 | "do call-graph (stack chain/backtrace) recording"), |
| 758 | 760 | OPT_INCR('v', "verbose", &verbose, |
| @@ -193,6 +193,7 @@ static int big_num_opt = -1; · 192 unmodified lines | ||
| 193 | 193 | static const char *cpu_list; |
| 194 | 194 | static const char *csv_sep = NULL; |
| 195 | 195 | static bool csv_output = false; |
| 196 | +static bool group = false; | |
| 196 | 197 | |
| 197 | 198 | static volatile int done = 0; |
| 198 | 199 | |
| @@ -280,14 +281,14 @@ static int create_perf_stat_counter(struct perf_evsel *evsel) · 81 unmodified lines | ||
| 280 | 281 | attr->inherit = !no_inherit; |
| 281 | 282 | |
| 282 | 283 | if (system_wide) |
| 283 | − return perf_evsel__open_per_cpu(evsel, evsel_list->cpus, false); | |
| 284 | + return perf_evsel__open_per_cpu(evsel, evsel_list->cpus, group); | |
| 284 | 285 | |
| 285 | 286 | if (target_pid == -1 && target_tid == -1) { |
| 286 | 287 | attr->disabled = 1; |
| 287 | 288 | attr->enable_on_exec = 1; |
| 288 | 289 | } |
| 289 | 290 | |
| 290 | − return perf_evsel__open_per_thread(evsel, evsel_list->threads, false); | |
| 291 | + return perf_evsel__open_per_thread(evsel, evsel_list->threads, group); | |
| 291 | 292 | } |
| 292 | 293 | |
| 293 | 294 | /* |
| @@ -1043,6 +1044,8 @@ static const struct option options[] = { · 749 unmodified lines | ||
| 1043 | 1044 | "stat events on existing thread id"), |
| 1044 | 1045 | OPT_BOOLEAN('a', "all-cpus", &system_wide, |
| 1045 | 1046 | "system-wide collection from all CPUs"), |
| 1047 | + OPT_BOOLEAN('g', "group", &group, | |
| 1048 | + "put the counters into a counter group"), | |
| 1046 | 1049 | OPT_BOOLEAN('c', "scale", &scale, |
| 1047 | 1050 | "scale/normalize counters"), |
| 1048 | 1051 | OPT_INCR('v', "verbose", &verbose, |
| @@ -85,10 +85,19 @@ int perf_evlist__add_default(struct perf_evlist *evlist) · 84 unmodified lines | ||
| 85 | 85 | struct perf_evsel *evsel = perf_evsel__new(&attr, 0); |
| 86 | 86 | |
| 87 | 87 | if (evsel == NULL) |
| 88 | − return -ENOMEM; | |
| 88 | + goto error; | |
| 89 | + | |
| 90 | + /* use strdup() because free(evsel) assumes name is allocated */ | |
| 91 | + evsel->name = strdup("cycles"); | |
| 92 | + if (!evsel->name) | |
| 93 | + goto error_free; | |
| 89 | 94 | |
| 90 | 95 | perf_evlist__add(evlist, evsel); |
| 91 | 96 | return 0; |
| 97 | +error_free: | |
| 98 | + perf_evsel__delete(evsel); | |
| 99 | +error: | |
| 100 | + return -ENOMEM; | |
| 92 | 101 | } |
| 93 | 102 | |
| 94 | 103 | void perf_evlist__disable(struct perf_evlist *evlist) |
| @@ -5,7 +5,9 @@ · 4 unmodified lines | ||
| 5 | 5 | #define __always_inline inline |
| 6 | 6 | #endif |
| 7 | 7 | #define __user |
| 8 | +#ifndef __attribute_const__ | |
| 8 | 9 | #define __attribute_const__ |
| 10 | +#endif | |
| 9 | 11 | |
| 10 | 12 | #define __used __attribute__((__unused__)) |
| 11 | 13 | |
| @@ -697,7 +697,11 @@ parse_raw_event(const char **strp, struct perf_event_attr *attr) · 696 unmodified lines | ||
| 697 | 697 | return EVT_FAILED; |
| 698 | 698 | n = hex2u64(str + 1, &config); |
| 699 | 699 | if (n > 0) { |
| 700 | − *strp = str + n + 1; | |
| 700 | + const char *end = str + n + 1; | |
| 701 | + if (*end != '\0' && *end != ',' && *end != ':') | |
| 702 | + return EVT_FAILED; | |
| 703 | + | |
| 704 | + *strp = end; | |
| 701 | 705 | attr->type = PERF_TYPE_RAW; |
| 702 | 706 | attr->config = config; |
| 703 | 707 | return EVT_HANDLED; |
| @@ -1097,6 +1101,4 @@ void print_events(const char *event_glob) · 393 unmodified lines | ||
| 1097 | 1101 | printf("\n"); |
| 1098 | 1102 | |
| 1099 | 1103 | print_tracepoint_events(NULL, NULL); |
| 1100 | − | |
| 1101 | − exit(129); | |
| 1102 | 1104 | } |