Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* '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
This commit is contained in:
@@ -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;
|
|||||||
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[] = {
|
|||||||
"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;
|
|||||||
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)
|
|||||||
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[] = {
|
|||||||
"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)
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
print_tracepoint_events(NULL, NULL);
|
print_tracepoint_events(NULL, NULL);
|
||||||
|
|
||||||
exit(129);
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user