Commit fe4c51b2 authored by Ingo Molnar's avatar Ingo Molnar

Merge branch 'perf/urgent' of...

Merge branch 'perf/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
parents 72ed62bd 43bece79
...@@ -4971,7 +4971,7 @@ M: Paul Mackerras <paulus@samba.org> ...@@ -4971,7 +4971,7 @@ M: Paul Mackerras <paulus@samba.org>
M: Ingo Molnar <mingo@elte.hu> M: Ingo Molnar <mingo@elte.hu>
M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
S: Supported S: Supported
F: kernel/perf_event*.c F: kernel/events/*
F: include/linux/perf_event.h F: include/linux/perf_event.h
F: arch/*/kernel/perf_event*.c F: arch/*/kernel/perf_event*.c
F: arch/*/kernel/*/perf_event*.c F: arch/*/kernel/*/perf_event*.c
......
...@@ -45,7 +45,7 @@ static int freq = 1000; ...@@ -45,7 +45,7 @@ static int freq = 1000;
static int output; static int output;
static int pipe_output = 0; static int pipe_output = 0;
static const char *output_name = NULL; static const char *output_name = NULL;
static int group = 0; static bool group = false;
static int realtime_prio = 0; static int realtime_prio = 0;
static bool nodelay = false; static bool nodelay = false;
static bool raw_samples = false; static bool raw_samples = false;
...@@ -753,6 +753,8 @@ const struct option record_options[] = { ...@@ -753,6 +753,8 @@ const struct option record_options[] = {
"child tasks do not inherit counters"), "child tasks do not inherit counters"),
OPT_UINTEGER('F', "freq", &user_freq, "profile at this frequency"), OPT_UINTEGER('F', "freq", &user_freq, "profile at this frequency"),
OPT_UINTEGER('m', "mmap-pages", &mmap_pages, "number of mmap data pages"), OPT_UINTEGER('m', "mmap-pages", &mmap_pages, "number of mmap data pages"),
OPT_BOOLEAN(0, "group", &group,
"put the counters into a counter group"),
OPT_BOOLEAN('g', "call-graph", &call_graph, OPT_BOOLEAN('g', "call-graph", &call_graph,
"do call-graph (stack chain/backtrace) recording"), "do call-graph (stack chain/backtrace) recording"),
OPT_INCR('v', "verbose", &verbose, OPT_INCR('v', "verbose", &verbose,
......
...@@ -193,6 +193,7 @@ static int big_num_opt = -1; ...@@ -193,6 +193,7 @@ static int big_num_opt = -1;
static const char *cpu_list; static const char *cpu_list;
static const char *csv_sep = NULL; static const char *csv_sep = NULL;
static bool csv_output = false; static bool csv_output = false;
static bool group = false;
static volatile int done = 0; static volatile int done = 0;
...@@ -280,14 +281,14 @@ static int create_perf_stat_counter(struct perf_evsel *evsel) ...@@ -280,14 +281,14 @@ static int create_perf_stat_counter(struct perf_evsel *evsel)
attr->inherit = !no_inherit; attr->inherit = !no_inherit;
if (system_wide) if (system_wide)
return perf_evsel__open_per_cpu(evsel, evsel_list->cpus, false); return perf_evsel__open_per_cpu(evsel, evsel_list->cpus, group);
if (target_pid == -1 && target_tid == -1) { if (target_pid == -1 && target_tid == -1) {
attr->disabled = 1; attr->disabled = 1;
attr->enable_on_exec = 1; attr->enable_on_exec = 1;
} }
return perf_evsel__open_per_thread(evsel, evsel_list->threads, false); return perf_evsel__open_per_thread(evsel, evsel_list->threads, group);
} }
/* /*
...@@ -1043,6 +1044,8 @@ static const struct option options[] = { ...@@ -1043,6 +1044,8 @@ static const struct option options[] = {
"stat events on existing thread id"), "stat events on existing thread id"),
OPT_BOOLEAN('a', "all-cpus", &system_wide, OPT_BOOLEAN('a', "all-cpus", &system_wide,
"system-wide collection from all CPUs"), "system-wide collection from all CPUs"),
OPT_BOOLEAN('g', "group", &group,
"put the counters into a counter group"),
OPT_BOOLEAN('c', "scale", &scale, OPT_BOOLEAN('c', "scale", &scale,
"scale/normalize counters"), "scale/normalize counters"),
OPT_INCR('v', "verbose", &verbose, OPT_INCR('v', "verbose", &verbose,
......
...@@ -85,10 +85,19 @@ int perf_evlist__add_default(struct perf_evlist *evlist) ...@@ -85,10 +85,19 @@ int perf_evlist__add_default(struct perf_evlist *evlist)
struct perf_evsel *evsel = perf_evsel__new(&attr, 0); struct perf_evsel *evsel = perf_evsel__new(&attr, 0);
if (evsel == NULL) if (evsel == NULL)
return -ENOMEM; goto error;
/* use strdup() because free(evsel) assumes name is allocated */
evsel->name = strdup("cycles");
if (!evsel->name)
goto error_free;
perf_evlist__add(evlist, evsel); perf_evlist__add(evlist, evsel);
return 0; return 0;
error_free:
perf_evsel__delete(evsel);
error:
return -ENOMEM;
} }
void perf_evlist__disable(struct perf_evlist *evlist) void perf_evlist__disable(struct perf_evlist *evlist)
......
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
#define __always_inline inline #define __always_inline inline
#endif #endif
#define __user #define __user
#ifndef __attribute_const__
#define __attribute_const__ #define __attribute_const__
#endif
#define __used __attribute__((__unused__)) #define __used __attribute__((__unused__))
......
...@@ -697,7 +697,11 @@ parse_raw_event(const char **strp, struct perf_event_attr *attr) ...@@ -697,7 +697,11 @@ parse_raw_event(const char **strp, struct perf_event_attr *attr)
return EVT_FAILED; return EVT_FAILED;
n = hex2u64(str + 1, &config); n = hex2u64(str + 1, &config);
if (n > 0) { if (n > 0) {
*strp = str + n + 1; const char *end = str + n + 1;
if (*end != '\0' && *end != ',' && *end != ':')
return EVT_FAILED;
*strp = end;
attr->type = PERF_TYPE_RAW; attr->type = PERF_TYPE_RAW;
attr->config = config; attr->config = config;
return EVT_HANDLED; return EVT_HANDLED;
...@@ -1097,6 +1101,4 @@ void print_events(const char *event_glob) ...@@ -1097,6 +1101,4 @@ void print_events(const char *event_glob)
printf("\n"); printf("\n");
print_tracepoint_events(NULL, NULL); print_tracepoint_events(NULL, NULL);
exit(129);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment