perf fixes
Linus,
Please pull the latest perf-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git perf-urgent-for-linus
Thanks,
Ingo
------------------>
Geunsik Lim (1):
MAINTAINERS: Fix list of perf events source files
Josh Boyer (1):
perf tools: Fix build against newer glibc
Lin Ming (1):
perf tools: Add group event scheduling option to perf record/stat
Stephane Eranian (3):
perf list: Fix exit value
perf evlist: Fix missing event name init for default event perf tools: Fix error handling of unknown events
MAINTAINERS | 2 +- tools/perf/builtin-record.c | 4 +++- tools/perf/builtin-stat.c | 7 +++++-- tools/perf/util/evlist.c | 11 ++++++++++- tools/perf/util/include/linux/compiler.h | 2 ++ tools/perf/util/parse-events.c | 8 +++++--- 6 files changed, 26 insertions(+), 8 deletions(-)
MAINTAINERS +1 -1
@@ -4971,7 +4971,7 @@ M: Paul Mackerras <[email protected]> M: Ingo Molnar <[email protected]> M: Arnaldo Carvalho de Melo <[email protected]> S: Supported -F: kernel/perf_event*.c +F: kernel/events/* F: include/linux/perf_event.h F: arch/*/kernel/perf_event*.c F: arch/*/kernel/*/perf_event*.c
tools/perf/builtin-record.c +3 -1
@@ -45,7 +45,7 @@ static int freq = 1000;static int output;static int pipe_output =0 ;static const char *output_name =NULL ; -static int group =0 ; +static bool group = false;static int realtime_prio =0 ;static bool nodelay = false;static bool raw_samples = false;
@@ -753,6 +753,8 @@ const struct option record_options[] = { "child tasks do not inherit counters"),OPT_UINTEGER ('F' ,"freq" , &user_freq,"profile at this frequency" ),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,"do call-graph (stack chain/backtrace) recording" ), OPT_INCR('v', "verbose", &verbose,
tools/perf/builtin-stat.c +5 -2
@@ -193,6 +193,7 @@ static int big_num_opt = -1;static const char *cpu_list;static const char *csv_sep =NULL ;static bool csv_output = false; +static bool group = false;static volatile int done =0 ;
@@ -280,14 +281,14 @@ static int create_perf_stat_counter(struct perf_evsel *evsel) attr->inherit = !no_inherit;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 ) { attr->disabled =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"),OPT_BOOLEAN ('a' ,"all-cpus" , &system_wide,"system-wide collection from all CPUs" ), +OPT_BOOLEAN ('g' ,"group" , &group, +"put the counters into a counter group" ),OPT_BOOLEAN ('c' ,"scale" , &scale,"scale/normalize counters" ), OPT_INCR('v', "verbose", &verbose,
tools/perf/util/evlist.c +10 -1
@@ -85,10 +85,19 @@ int perf_evlist__add_default(struct perf_evlist *evlist)struct perf_evsel *evsel =perf_evsel__new (&attr,0 );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);return 0 ; +error_free: +perf_evsel__delete (evsel); +error: +return -ENOMEM ; }void perf_evlist__disable (struct perf_evlist *evlist)
tools/perf/util/include/linux/compiler.h +2 -0
@@ -5,7 +5,9 @@#define __always_inline inline#endif #define __user +#ifndef __attribute_const__#define __attribute_const__ +#endif #define __used __attribute__((__unused__))
tools/perf/util/parse-events.c +5 -3
@@ -697,7 +697,11 @@ parse_raw_event(const char **strp, struct perf_event_attr *attr)return EVT_FAILED ; n =hex2u64 (str +1 , &config);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->config = config;return EVT_HANDLED ;
@@ -1097,6 +1101,4 @@ void print_events(const char *event_glob)printf ("\n" );print_tracepoint_events (NULL ,NULL ); - -exit (129 ); }