From f3054c778e367d624ca0dfe68b8498b5c463a9d1 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 23 Apr 2012 09:04:29 -0400 Subject: perf tools: Cleanup realloc use The if branch is completely unnecessary since 'realloc' handles NULL pointers for the first parameter. This is really only a cleanup and submitted mainly to prevent proliferation of bad practices. Signed-off-by: Ulrich Drepper Cc: David Ahern Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Cc: Robert Richter Cc: Stephane Eranian Link: http://lkml.kernel.org/r/201204231304.q3ND4TFe020805@drepperk.user.openhosting.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/header.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 4c7c2d73251f..6e618ba21382 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -31,21 +31,16 @@ static const char **header_argv; int perf_header__push_event(u64 id, const char *name) { + struct perf_trace_event_type *nevents; + if (strlen(name) > MAX_EVENT_NAME) pr_warning("Event %s will be truncated\n", name); - if (!events) { - events = malloc(sizeof(struct perf_trace_event_type)); - if (events == NULL) - return -ENOMEM; - } else { - struct perf_trace_event_type *nevents; + nevents = realloc(events, (event_count + 1) * sizeof(*events)); + if (nevents == NULL) + return -ENOMEM; + events = nevents; - nevents = realloc(events, (event_count + 1) * sizeof(*events)); - if (nevents == NULL) - return -ENOMEM; - events = nevents; - } memset(&events[event_count], 0, sizeof(struct perf_trace_event_type)); events[event_count].event_id = id; strncpy(events[event_count].name, name, MAX_EVENT_NAME - 1); -- cgit v1.2.2 From c651214e90e5c150015f7524a6bfc298ad61435f Mon Sep 17 00:00:00 2001 From: Robert Richter Date: Thu, 5 Apr 2012 18:26:25 +0200 Subject: perf tools: Fix include header files in util/parse-events.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Include header fixes for ... bool: util/parse-events.h:31: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘have_tracepoints’ ... and types.h: util/parse-events.h:28: error: expected ‘)’ before ‘config’ util/parse-events.h:34: error: expected declaration specifiers or ‘...’ before ‘u64’ util/parse-events.h:45: error: expected ‘)’ before ‘type’ This happens if now other include files are included before util/parse-events.h. Signed-off-by: Robert Richter Cc: Ingo Molnar Link: http://lkml.kernel.org/r/1333643188-26895-2-git-send-email-robert.richter@amd.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/parse-events.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'tools/perf/util') diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index ca069f893381..5cb002894a17 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -4,7 +4,9 @@ * Parse symbolic events/counts passed in as options: */ +#include #include "../../../include/linux/perf_event.h" +#include "types.h" struct list_head; struct perf_evsel; -- cgit v1.2.2 From bea0340582dc47b447a014f5bf9f460925afdaf4 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Thu, 26 Apr 2012 14:15:15 +0900 Subject: perf tools: Introduce struct perf_target The perf_target struct will be used for taking care of cpu/thread maps based on user's input. Since it is used on various subcommands it'd better factoring it out. Thanks to Arnaldo for suggesting the better name. Signed-off-by: Namhyung Kim Reviewed-by: David Ahern Cc: David Ahern Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1335417327-11796-2-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/evlist.c | 2 +- tools/perf/util/evsel.c | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 1986d8051bd1..7080901a2717 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -827,7 +827,7 @@ int perf_evlist__prepare_workload(struct perf_evlist *evlist, exit(-1); } - if (!opts->system_wide && !opts->target_tid && !opts->target_pid) + if (!opts->target.system_wide && !opts->target.tid && !opts->target.pid) evlist->threads->map[0] = evlist->workload.pid; close(child_ready_pipe[1]); diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 8c13dbcb84b9..d90598edcf1d 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -106,15 +106,15 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts, if (opts->call_graph) attr->sample_type |= PERF_SAMPLE_CALLCHAIN; - if (opts->system_wide) + if (opts->target.system_wide) attr->sample_type |= PERF_SAMPLE_CPU; if (opts->period) attr->sample_type |= PERF_SAMPLE_PERIOD; if (!opts->sample_id_all_missing && - (opts->sample_time || opts->system_wide || - !opts->no_inherit || opts->cpu_list)) + (opts->sample_time || opts->target.system_wide || + !opts->no_inherit || opts->target.cpu_list)) attr->sample_type |= PERF_SAMPLE_TIME; if (opts->raw_samples) { @@ -135,8 +135,8 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts, attr->mmap = track; attr->comm = track; - if (!opts->target_pid && !opts->target_tid && !opts->system_wide && - (!opts->group || evsel == first)) { + if (!opts->target.pid && !opts->target.tid && + !opts->target.system_wide && (!opts->group || evsel == first)) { attr->disabled = 1; attr->enable_on_exec = 1; } -- cgit v1.2.2 From fe9d18a71d2018f8021fd2bd2aaf5137954ef839 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Thu, 26 Apr 2012 14:15:17 +0900 Subject: perf top: Convert to struct perf_target Use struct perf_target as it is introduced by previous patch. This is a preparation of further changes. Signed-off-by: Namhyung Kim Reviewed-by: David Ahern Cc: David Ahern Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1335417327-11796-4-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/top.c | 19 ++++++++++--------- tools/perf/util/top.h | 6 +----- 2 files changed, 11 insertions(+), 14 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/top.c b/tools/perf/util/top.c index 09fe579ccafb..abe0e8e95068 100644 --- a/tools/perf/util/top.c +++ b/tools/perf/util/top.c @@ -69,23 +69,24 @@ size_t perf_top__header_snprintf(struct perf_top *top, char *bf, size_t size) ret += SNPRINTF(bf + ret, size - ret, "], "); - if (top->target_pid) + if (top->target.pid) ret += SNPRINTF(bf + ret, size - ret, " (target_pid: %s", - top->target_pid); - else if (top->target_tid) + top->target.pid); + else if (top->target.tid) ret += SNPRINTF(bf + ret, size - ret, " (target_tid: %s", - top->target_tid); - else if (top->uid_str != NULL) + top->target.tid); + else if (top->target.uid_str != NULL) ret += SNPRINTF(bf + ret, size - ret, " (uid: %s", - top->uid_str); + top->target.uid_str); else ret += SNPRINTF(bf + ret, size - ret, " (all"); - if (top->cpu_list) + if (top->target.cpu_list) ret += SNPRINTF(bf + ret, size - ret, ", CPU%s: %s)", - top->evlist->cpus->nr > 1 ? "s" : "", top->cpu_list); + top->evlist->cpus->nr > 1 ? "s" : "", + top->target.cpu_list); else { - if (top->target_tid) + if (top->target.tid) ret += SNPRINTF(bf + ret, size - ret, ")"); else ret += SNPRINTF(bf + ret, size - ret, ", %d CPU%s)", diff --git a/tools/perf/util/top.h b/tools/perf/util/top.h index ce61cb2d1acf..33347ca89ee4 100644 --- a/tools/perf/util/top.h +++ b/tools/perf/util/top.h @@ -13,6 +13,7 @@ struct perf_session; struct perf_top { struct perf_tool tool; struct perf_evlist *evlist; + struct perf_target target; /* * Symbols will be added here in perf_event__process_sample and will * get out after decayed. @@ -23,10 +24,7 @@ struct perf_top { u64 guest_us_samples, guest_kernel_samples; int print_entries, count_filter, delay_secs; int freq; - const char *target_pid, *target_tid; - uid_t uid; bool hide_kernel_symbols, hide_user_symbols, zero; - bool system_wide; bool use_tui, use_stdio; bool sort_has_symbols; bool dont_use_callchains; @@ -37,7 +35,6 @@ struct perf_top { bool sample_id_all_missing; bool exclude_guest_missing; bool dump_symtab; - const char *cpu_list; struct hist_entry *sym_filter_entry; struct perf_evsel *sym_evsel; struct perf_session *session; @@ -47,7 +44,6 @@ struct perf_top { int realtime_prio; int sym_pcnt_filter; const char *sym_filter; - const char *uid_str; }; size_t perf_top__header_snprintf(struct perf_top *top, char *bf, size_t size); -- cgit v1.2.2 From 4bd0f2d2c0cf14de9c84c2fe689120c6b0f667c8 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Thu, 26 Apr 2012 14:15:18 +0900 Subject: perf tools: Introduce perf_target__validate() helper The perf_target__validate function is used to check given PID/TID/UID/CPU target options and warn if some combination is impossible. Also this can make some arguments of parse_target_uid() function useless as it is checked before the call via our new helper. Signed-off-by: Namhyung Kim Reviewed-by: David Ahern Cc: David Ahern Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1335417327-11796-5-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/usage.c | 29 +++++++++++++++++++++-------- tools/perf/util/util.h | 4 +++- 2 files changed, 24 insertions(+), 9 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/usage.c b/tools/perf/util/usage.c index 52bb07c6442a..0a1a885a5914 100644 --- a/tools/perf/util/usage.c +++ b/tools/perf/util/usage.c @@ -83,7 +83,7 @@ void warning(const char *warn, ...) va_end(params); } -uid_t parse_target_uid(const char *str, const char *tid, const char *pid) +uid_t parse_target_uid(const char *str) { struct passwd pwd, *result; char buf[1024]; @@ -91,13 +91,6 @@ uid_t parse_target_uid(const char *str, const char *tid, const char *pid) if (str == NULL) return UINT_MAX; - /* UID and PID are mutually exclusive */ - if (tid || pid) { - ui__warning("PID/TID switch overriding UID\n"); - sleep(1); - return UINT_MAX; - } - getpwnam_r(str, &pwd, buf, sizeof(buf), &result); if (result == NULL) { @@ -120,3 +113,23 @@ uid_t parse_target_uid(const char *str, const char *tid, const char *pid) return result->pw_uid; } + +void perf_target__validate(struct perf_target *target) +{ + if (target->pid) + target->tid = target->pid; + + /* CPU and PID are mutually exclusive */ + if (target->tid && target->cpu_list) { + ui__warning("WARNING: PID switch overriding CPU\n"); + sleep(1); + target->cpu_list = NULL; + } + + /* UID and PID are mutually exclusive */ + if (target->tid && target->uid_str) { + ui__warning("PID/TID switch overriding UID\n"); + sleep(1); + target->uid_str = NULL; + } +} diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 0f99f394d8e0..3f05d6264dab 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h @@ -246,10 +246,12 @@ unsigned long convert_unit(unsigned long value, char *unit); int readn(int fd, void *buf, size_t size); struct perf_event_attr; +struct perf_target; void event_attr_init(struct perf_event_attr *attr); -uid_t parse_target_uid(const char *str, const char *tid, const char *pid); +uid_t parse_target_uid(const char *str); +void perf_target__validate(struct perf_target *target); #define _STR(x) #x #define STR(x) _STR(x) -- cgit v1.2.2 From b809ac100e2f12ebf1b58ff522dba15651a77d27 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Thu, 26 Apr 2012 14:15:19 +0900 Subject: perf evlist: Make create_maps() take struct perf_target Now we have all information that needed to create cpu/thread maps in struct perf_target, it'd be better using it as an argument. Signed-off-by: Namhyung Kim Reviewed-by: David Ahern Cc: David Ahern Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1335417327-11796-6-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/evlist.c | 12 +++++++----- tools/perf/util/evlist.h | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 7080901a2717..a43e2c56d1c6 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -599,18 +599,20 @@ int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages, return perf_evlist__mmap_per_cpu(evlist, prot, mask); } -int perf_evlist__create_maps(struct perf_evlist *evlist, const char *target_pid, - const char *target_tid, uid_t uid, const char *cpu_list) +int perf_evlist__create_maps(struct perf_evlist *evlist, + struct perf_target *target) { - evlist->threads = thread_map__new_str(target_pid, target_tid, uid); + evlist->threads = thread_map__new_str(target->pid, target->tid, + target->uid); if (evlist->threads == NULL) return -1; - if (uid != UINT_MAX || (cpu_list == NULL && target_tid)) + if (target->uid != UINT_MAX || + (target->cpu_list == NULL && target->tid)) evlist->cpus = cpu_map__dummy_new(); else - evlist->cpus = cpu_map__new(cpu_list); + evlist->cpus = cpu_map__new(target->cpu_list); if (evlist->cpus == NULL) goto out_delete_threads; diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 21f1c9e57f13..58abb63ac13a 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -106,8 +106,8 @@ static inline void perf_evlist__set_maps(struct perf_evlist *evlist, evlist->threads = threads; } -int perf_evlist__create_maps(struct perf_evlist *evlist, const char *target_pid, - const char *tid, uid_t uid, const char *cpu_list); +int perf_evlist__create_maps(struct perf_evlist *evlist, + struct perf_target *target); void perf_evlist__delete_maps(struct perf_evlist *evlist); int perf_evlist__set_filters(struct perf_evlist *evlist); -- cgit v1.2.2 From 770a34a38b74982724dbb099225944b415f90281 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Thu, 26 Apr 2012 14:15:20 +0900 Subject: perf tools: Check more combinations of PID/TID, UID and CPU switches There were some combinations of these switches that are not so appropriate IMHO. Since there are implicit priorities between them and they worked well anyway, but it ends up opening useless duplicated events. For example, 'perf stat -t -a' will open multiple events for the thread instead of one. Add explicit checks and warn user in perf_target__validate(). Signed-off-by: Namhyung Kim Reviewed-by: David Ahern Cc: David Ahern Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1335417327-11796-7-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/usage.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'tools/perf/util') diff --git a/tools/perf/util/usage.c b/tools/perf/util/usage.c index 0a1a885a5914..228f0a558872 100644 --- a/tools/perf/util/usage.c +++ b/tools/perf/util/usage.c @@ -132,4 +132,18 @@ void perf_target__validate(struct perf_target *target) sleep(1); target->uid_str = NULL; } + + /* UID and CPU are mutually exclusive */ + if (target->uid_str && target->cpu_list) { + ui__warning("UID switch overriding CPU\n"); + sleep(1); + target->cpu_list = NULL; + } + + /* PID/UID and SYSTEM are mutually exclusive */ + if ((target->tid || target->uid_str) && target->system_wide) { + ui__warning("PID/TID/UID switch overriding CPU\n"); + sleep(1); + target->system_wide = false; + } } -- cgit v1.2.2 From 12864b31583bcbd26789ebe68c612688f9ee2e30 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Thu, 26 Apr 2012 14:15:22 +0900 Subject: perf target: Split out perf_target handling code For further work on perf_target, it'd be better off splitting the code into a separate file. Signed-off-by: Namhyung Kim Reviewed-by: David Ahern Cc: David Ahern Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1335417327-11796-9-git-send-email-namhyung.kim@lge.com [ committer note: Fixed perl build by using stdbool and types.h in target.h ] Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/evlist.c | 1 + tools/perf/util/evsel.c | 1 + tools/perf/util/target.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/target.h | 18 ++++++++++++++++++ tools/perf/util/usage.c | 34 ---------------------------------- tools/perf/util/util.h | 2 -- 6 files changed, 65 insertions(+), 36 deletions(-) create mode 100644 tools/perf/util/target.c create mode 100644 tools/perf/util/target.h (limited to 'tools/perf/util') diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index a43e2c56d1c6..30328623cae6 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -11,6 +11,7 @@ #include #include "cpumap.h" #include "thread_map.h" +#include "target.h" #include "evlist.h" #include "evsel.h" #include diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index d90598edcf1d..bb785a098ced 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -14,6 +14,7 @@ #include "util.h" #include "cpumap.h" #include "thread_map.h" +#include "target.h" #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) #define GROUP_FD(group_fd, cpu) (*(int *)xyarray__entry(group_fd, cpu, 0)) diff --git a/tools/perf/util/target.c b/tools/perf/util/target.c new file mode 100644 index 000000000000..3fadf85dd7e3 --- /dev/null +++ b/tools/perf/util/target.c @@ -0,0 +1,45 @@ +/* + * Helper functions for handling target threads/cpus + * + * Copyright (C) 2012, LG Electronics, Namhyung Kim + * + * Released under the GPL v2. + */ + +#include "target.h" +#include "debug.h" + + +void perf_target__validate(struct perf_target *target) +{ + if (target->pid) + target->tid = target->pid; + + /* CPU and PID are mutually exclusive */ + if (target->tid && target->cpu_list) { + ui__warning("WARNING: PID switch overriding CPU\n"); + sleep(1); + target->cpu_list = NULL; + } + + /* UID and PID are mutually exclusive */ + if (target->tid && target->uid_str) { + ui__warning("PID/TID switch overriding UID\n"); + sleep(1); + target->uid_str = NULL; + } + + /* UID and CPU are mutually exclusive */ + if (target->uid_str && target->cpu_list) { + ui__warning("UID switch overriding CPU\n"); + sleep(1); + target->cpu_list = NULL; + } + + /* PID/UID and SYSTEM are mutually exclusive */ + if ((target->tid || target->uid_str) && target->system_wide) { + ui__warning("PID/TID/UID switch overriding CPU\n"); + sleep(1); + target->system_wide = false; + } +} diff --git a/tools/perf/util/target.h b/tools/perf/util/target.h new file mode 100644 index 000000000000..218291f921ed --- /dev/null +++ b/tools/perf/util/target.h @@ -0,0 +1,18 @@ +#ifndef _PERF_TARGET_H +#define _PERF_TARGET_H + +#include +#include + +struct perf_target { + const char *pid; + const char *tid; + const char *cpu_list; + const char *uid_str; + uid_t uid; + bool system_wide; +}; + +void perf_target__validate(struct perf_target *target); + +#endif /* _PERF_TARGET_H */ diff --git a/tools/perf/util/usage.c b/tools/perf/util/usage.c index 228f0a558872..e851abc22ccc 100644 --- a/tools/perf/util/usage.c +++ b/tools/perf/util/usage.c @@ -113,37 +113,3 @@ uid_t parse_target_uid(const char *str) return result->pw_uid; } - -void perf_target__validate(struct perf_target *target) -{ - if (target->pid) - target->tid = target->pid; - - /* CPU and PID are mutually exclusive */ - if (target->tid && target->cpu_list) { - ui__warning("WARNING: PID switch overriding CPU\n"); - sleep(1); - target->cpu_list = NULL; - } - - /* UID and PID are mutually exclusive */ - if (target->tid && target->uid_str) { - ui__warning("PID/TID switch overriding UID\n"); - sleep(1); - target->uid_str = NULL; - } - - /* UID and CPU are mutually exclusive */ - if (target->uid_str && target->cpu_list) { - ui__warning("UID switch overriding CPU\n"); - sleep(1); - target->cpu_list = NULL; - } - - /* PID/UID and SYSTEM are mutually exclusive */ - if ((target->tid || target->uid_str) && target->system_wide) { - ui__warning("PID/TID/UID switch overriding CPU\n"); - sleep(1); - target->system_wide = false; - } -} diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 3f05d6264dab..52be74c359d3 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h @@ -246,12 +246,10 @@ unsigned long convert_unit(unsigned long value, char *unit); int readn(int fd, void *buf, size_t size); struct perf_event_attr; -struct perf_target; void event_attr_init(struct perf_event_attr *attr); uid_t parse_target_uid(const char *str); -void perf_target__validate(struct perf_target *target); #define _STR(x) #x #define STR(x) _STR(x) -- cgit v1.2.2 From 7706f966323f32f3ea13121b5918851432876ae5 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Mon, 30 Apr 2012 13:55:06 +0900 Subject: perf ui gtk: Drop arg[cv] arguments from perf_gtk_setup_browser() As perf doesn't allow to specify gtk command-line option, drop the arguments and pass NULL to gtk_init(). This makes the function easier to be called from setup_browser(). Signed-off-by: Namhyung Kim Acked-by: Pekka Enberg Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Pekka Enberg Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1335761711-31403-3-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/cache.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h index 8dd224df3e54..d22ca689fb15 100644 --- a/tools/perf/util/cache.h +++ b/tools/perf/util/cache.h @@ -46,14 +46,14 @@ void exit_browser(bool wait_for_ok); #endif #ifdef NO_GTK2_SUPPORT -static inline void perf_gtk_setup_browser(int argc __used, const char *argv[] __used, bool fallback_to_pager) +static inline void perf_gtk_setup_browser(bool fallback_to_pager) { if (fallback_to_pager) setup_pager(); } static inline void perf_gtk_exit_browser(bool wait_for_ok __used) {} #else -void perf_gtk_setup_browser(int argc, const char *argv[], bool fallback_to_pager); +void perf_gtk_setup_browser(bool fallback_to_pager); void perf_gtk_exit_browser(bool wait_for_ok); #endif -- cgit v1.2.2 From 28e62b90d95a4ed8ae2ba93879003665051581a6 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Mon, 30 Apr 2012 13:55:07 +0900 Subject: perf ui gtk: Rename functions for consistency We use double underscore characters to distinguish its subsystem and actual function name. Signed-off-by: Namhyung Kim Acked-by: Pekka Enberg Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Pekka Enberg Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1335761711-31403-4-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/cache.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h index d22ca689fb15..3428b777396d 100644 --- a/tools/perf/util/cache.h +++ b/tools/perf/util/cache.h @@ -46,15 +46,15 @@ void exit_browser(bool wait_for_ok); #endif #ifdef NO_GTK2_SUPPORT -static inline void perf_gtk_setup_browser(bool fallback_to_pager) +static inline void perf_gtk__setup_browser(bool fallback_to_pager) { if (fallback_to_pager) setup_pager(); } -static inline void perf_gtk_exit_browser(bool wait_for_ok __used) {} +static inline void perf_gtk__exit_browser(bool wait_for_ok __used) {} #else -void perf_gtk_setup_browser(bool fallback_to_pager); -void perf_gtk_exit_browser(bool wait_for_ok); +void perf_gtk__setup_browser(bool fallback_to_pager); +void perf_gtk__exit_browser(bool wait_for_ok); #endif char *alias_lookup(const char *alias); -- cgit v1.2.2 From 281ef544a8476f750b9f378593c42b3e8a0b8788 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Mon, 30 Apr 2012 13:55:08 +0900 Subject: perf ui: Add gtk2 support into setup_browser() Now setup_browser can handle gtk2 front-end so split the TUI code to ui/tui/setup.c in order to remove dependency. To this end, make ui__init/exit global symbols and take an argument. Also split gtk code to ui/gtk/setup.c. Signed-off-by: Namhyung Kim Acked-by: Pekka Enberg Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Pekka Enberg Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1335761711-31403-5-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/cache.h | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h index 3428b777396d..761d4e998101 100644 --- a/tools/perf/util/cache.h +++ b/tools/perf/util/cache.h @@ -33,7 +33,7 @@ extern int pager_use_color; extern int use_browser; -#ifdef NO_NEWT_SUPPORT +#if defined(NO_NEWT_SUPPORT) && defined(NO_GTK2_SUPPORT) static inline void setup_browser(bool fallback_to_pager) { if (fallback_to_pager) @@ -43,19 +43,32 @@ static inline void exit_browser(bool wait_for_ok __used) {} #else void setup_browser(bool fallback_to_pager); void exit_browser(bool wait_for_ok); + +#ifdef NO_NEWT_SUPPORT +static inline int ui__init(bool fallback_to_pager) +{ + if (fallback_to_pager) + setup_pager(); + return 0; +} +static inline void ui__exit(bool wait_for_ok __used) {} +#else +int ui__init(bool fallback_to_pager); +void ui__exit(bool wait_for_ok); #endif #ifdef NO_GTK2_SUPPORT -static inline void perf_gtk__setup_browser(bool fallback_to_pager) +static inline void perf_gtk__init(bool fallback_to_pager) { if (fallback_to_pager) setup_pager(); } -static inline void perf_gtk__exit_browser(bool wait_for_ok __used) {} +static inline void perf_gtk__exit(bool wait_for_ok __used) {} #else -void perf_gtk__setup_browser(bool fallback_to_pager); -void perf_gtk__exit_browser(bool wait_for_ok); +void perf_gtk__init(bool fallback_to_pager); +void perf_gtk__exit(bool wait_for_ok); #endif +#endif /* NO_NEWT_SUPPORT && NO_GTK2_SUPPORT */ char *alias_lookup(const char *alias); int split_cmdline(char *cmdline, const char ***argv); -- cgit v1.2.2 From dc41b9b8f02dbe2228ae787d525dac43beebb7fa Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Mon, 30 Apr 2012 13:55:09 +0900 Subject: perf ui: Change fallback policy of setup_browser() If gtk2 support is not enabled (or failed for some reason) try TUI again instead of falling directly back to the stdio interface. Signed-off-by: Namhyung Kim Acked-by: Pekka Enberg Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Pekka Enberg Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1335761711-31403-6-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/cache.h | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h index 761d4e998101..cff18c617d13 100644 --- a/tools/perf/util/cache.h +++ b/tools/perf/util/cache.h @@ -45,27 +45,24 @@ void setup_browser(bool fallback_to_pager); void exit_browser(bool wait_for_ok); #ifdef NO_NEWT_SUPPORT -static inline int ui__init(bool fallback_to_pager) +static inline int ui__init(void) { - if (fallback_to_pager) - setup_pager(); - return 0; + return -1; } static inline void ui__exit(bool wait_for_ok __used) {} #else -int ui__init(bool fallback_to_pager); +int ui__init(void); void ui__exit(bool wait_for_ok); #endif #ifdef NO_GTK2_SUPPORT -static inline void perf_gtk__init(bool fallback_to_pager) +static inline int perf_gtk__init(void) { - if (fallback_to_pager) - setup_pager(); + return -1; } static inline void perf_gtk__exit(bool wait_for_ok __used) {} #else -void perf_gtk__init(bool fallback_to_pager); +int perf_gtk__init(void); void perf_gtk__exit(bool wait_for_ok); #endif #endif /* NO_NEWT_SUPPORT && NO_GTK2_SUPPORT */ -- cgit v1.2.2 From 9389a46043c8f091dc8f8d8e25a5c1355f8bcc9b Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Mon, 16 Apr 2012 20:42:51 +0200 Subject: perf session: Fail on processing event with unknown size Currently if we cannot decide the size of the event, we guess next event possition by: "... check alignment, and increment a single u64 in the hope to catch on again 'soon'" This usually ends up with segfault or endless loop. It's better to admit the failure right away, then pretend nothing happened. It makes the life easier ;) Signed-off-by: Jiri Olsa Acked-by: Peter Zijlstra Cc: Corey Ashford Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/20120416184251.GA11503@m.brq.redhat.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/session.c | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 9412e3b05f68..f992ae3c7e30 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -1100,16 +1100,10 @@ more: } if ((skip = perf_session__process_event(self, &event, tool, head)) < 0) { - dump_printf("%#" PRIx64 " [%#x]: skipping unknown header type: %d\n", - head, event.header.size, event.header.type); - /* - * assume we lost track of the stream, check alignment, and - * increment a single u64 in the hope to catch on again 'soon'. - */ - if (unlikely(head & 7)) - head &= ~7ULL; - - size = 8; + pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n", + head, event.header.size, event.header.type); + err = -EINVAL; + goto out_err; } head += size; @@ -1218,17 +1212,11 @@ more: if (size == 0 || perf_session__process_event(session, event, tool, file_pos) < 0) { - dump_printf("%#" PRIx64 " [%#x]: skipping unknown header type: %d\n", - file_offset + head, event->header.size, - event->header.type); - /* - * assume we lost track of the stream, check alignment, and - * increment a single u64 in the hope to catch on again 'soon'. - */ - if (unlikely(head & 7)) - head &= ~7ULL; - - size = 8; + pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n", + file_offset + head, event->header.size, + event->header.type); + err = -EINVAL; + goto out_err; } head += size; -- cgit v1.2.2 From 55261f46702cec96911a81aacfb3cba13434d304 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Mon, 7 May 2012 14:08:59 +0900 Subject: perf evlist: Fix creation of cpu map Currently, 'perf record -- sleep 1' creates a cpu map for all online cpus since it turns out calling cpu_map__new(NULL). Fix it. Also it is guaranteed that cpu_list is NULL if PID/TID is given by calling perf_target__validate(), so we can make the conditional bit simpler. This also fixes perf test 7 (Validate) failure on my 6 core machine: $ cat /sys/devices/system/cpu/online 0-11 $ ./perf test -v 7 7: Validate PERF_RECORD_* events & perf_sample fields: --- start --- perf_evlist__mmap: Operation not permitted ---- end ---- Validate PERF_RECORD_* events & perf_sample fields: FAILED! Signed-off-by: Namhyung Kim Reviewed-by: David Ahern Cc: David Ahern Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1336367344-28071-3-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/evlist.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 30328623cae6..183b199b0d09 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -609,8 +609,9 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, if (evlist->threads == NULL) return -1; - if (target->uid != UINT_MAX || - (target->cpu_list == NULL && target->tid)) + if (target->uid != UINT_MAX || target->tid) + evlist->cpus = cpu_map__dummy_new(); + else if (!target->system_wide && target->cpu_list == NULL) evlist->cpus = cpu_map__dummy_new(); else evlist->cpus = cpu_map__new(target->cpu_list); -- cgit v1.2.2 From 60bbddaaa33865633efa2800702e3b02495a0e94 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Mon, 7 May 2012 14:09:00 +0900 Subject: perf target: Introduce perf_target_errno The perf_target_errno enumerations are used to indicate specific error cases on perf target operations. It'd help libperf being a more generic library. Signed-off-by: Namhyung Kim Suggested-by: Arnaldo Carvalho de Melo Reviewed-by: David Ahern Cc: David Ahern Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1336367344-28071-4-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/target.c | 33 ++++++++++++++++++++++----------- tools/perf/util/target.h | 25 ++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 12 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/target.c b/tools/perf/util/target.c index 3fadf85dd7e3..5c59dcfc8f8d 100644 --- a/tools/perf/util/target.c +++ b/tools/perf/util/target.c @@ -10,36 +10,47 @@ #include "debug.h" -void perf_target__validate(struct perf_target *target) +enum perf_target_errno perf_target__validate(struct perf_target *target) { + enum perf_target_errno ret = PERF_ERRNO_TARGET__SUCCESS; + if (target->pid) target->tid = target->pid; /* CPU and PID are mutually exclusive */ if (target->tid && target->cpu_list) { - ui__warning("WARNING: PID switch overriding CPU\n"); - sleep(1); target->cpu_list = NULL; + if (ret == PERF_ERRNO_TARGET__SUCCESS) + ret = PERF_ERRNO_TARGET__PID_OVERRIDE_CPU; } /* UID and PID are mutually exclusive */ if (target->tid && target->uid_str) { - ui__warning("PID/TID switch overriding UID\n"); - sleep(1); target->uid_str = NULL; + if (ret == PERF_ERRNO_TARGET__SUCCESS) + ret = PERF_ERRNO_TARGET__PID_OVERRIDE_UID; } /* UID and CPU are mutually exclusive */ if (target->uid_str && target->cpu_list) { - ui__warning("UID switch overriding CPU\n"); - sleep(1); target->cpu_list = NULL; + if (ret == PERF_ERRNO_TARGET__SUCCESS) + ret = PERF_ERRNO_TARGET__UID_OVERRIDE_CPU; } - /* PID/UID and SYSTEM are mutually exclusive */ - if ((target->tid || target->uid_str) && target->system_wide) { - ui__warning("PID/TID/UID switch overriding CPU\n"); - sleep(1); + /* PID and SYSTEM are mutually exclusive */ + if (target->tid && target->system_wide) { target->system_wide = false; + if (ret == PERF_ERRNO_TARGET__SUCCESS) + ret = PERF_ERRNO_TARGET__PID_OVERRIDE_SYSTEM; } + + /* UID and SYSTEM are mutually exclusive */ + if (target->uid_str && target->system_wide) { + target->system_wide = false; + if (ret == PERF_ERRNO_TARGET__SUCCESS) + ret = PERF_ERRNO_TARGET__UID_OVERRIDE_SYSTEM; + } + + return ret; } diff --git a/tools/perf/util/target.h b/tools/perf/util/target.h index 218291f921ed..eb0d2101154a 100644 --- a/tools/perf/util/target.h +++ b/tools/perf/util/target.h @@ -13,6 +13,29 @@ struct perf_target { bool system_wide; }; -void perf_target__validate(struct perf_target *target); +enum perf_target_errno { + PERF_ERRNO_TARGET__SUCCESS = 0, + + /* + * Choose an arbitrary negative big number not to clash with standard + * errno since SUS requires the errno has distinct positive values. + * See 'Issue 6' in the link below. + * + * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html + */ + __PERF_ERRNO_TARGET__START = -10000, + + + /* for perf_target__validate() */ + PERF_ERRNO_TARGET__PID_OVERRIDE_CPU = __PERF_ERRNO_TARGET__START, + PERF_ERRNO_TARGET__PID_OVERRIDE_UID, + PERF_ERRNO_TARGET__UID_OVERRIDE_CPU, + PERF_ERRNO_TARGET__PID_OVERRIDE_SYSTEM, + PERF_ERRNO_TARGET__UID_OVERRIDE_SYSTEM, + + __PERF_ERRNO_TARGET__END, +}; + +enum perf_target_errno perf_target__validate(struct perf_target *target); #endif /* _PERF_TARGET_H */ -- cgit v1.2.2 From dfe78adaaca90417ece98edbd3eb1c9661334406 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Mon, 7 May 2012 14:09:01 +0900 Subject: perf target: Introduce perf_target__parse_uid() Add and use the modern perf_target__parse_uid() and get rid of the old parse_target_uid(). Signed-off-by: Namhyung Kim Reviewed-by: David Ahern Cc: David Ahern Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1336367344-28071-5-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/target.c | 35 +++++++++++++++++++++++++++++++++++ tools/perf/util/target.h | 5 +++++ tools/perf/util/usage.c | 31 ------------------------------- tools/perf/util/util.h | 3 --- 4 files changed, 40 insertions(+), 34 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/target.c b/tools/perf/util/target.c index 5c59dcfc8f8d..02a6bedb69a3 100644 --- a/tools/perf/util/target.c +++ b/tools/perf/util/target.c @@ -9,6 +9,8 @@ #include "target.h" #include "debug.h" +#include + enum perf_target_errno perf_target__validate(struct perf_target *target) { @@ -54,3 +56,36 @@ enum perf_target_errno perf_target__validate(struct perf_target *target) return ret; } + +enum perf_target_errno perf_target__parse_uid(struct perf_target *target) +{ + struct passwd pwd, *result; + char buf[1024]; + const char *str = target->uid_str; + + target->uid = UINT_MAX; + if (str == NULL) + return PERF_ERRNO_TARGET__SUCCESS; + + /* Try user name first */ + getpwnam_r(str, &pwd, buf, sizeof(buf), &result); + + if (result == NULL) { + /* + * The user name not found. Maybe it's a UID number. + */ + char *endptr; + int uid = strtol(str, &endptr, 10); + + if (*endptr != '\0') + return PERF_ERRNO_TARGET__INVALID_UID; + + getpwuid_r(uid, &pwd, buf, sizeof(buf), &result); + + if (result == NULL) + return PERF_ERRNO_TARGET__USER_NOT_FOUND; + } + + target->uid = result->pw_uid; + return PERF_ERRNO_TARGET__SUCCESS; +} diff --git a/tools/perf/util/target.h b/tools/perf/util/target.h index eb0d2101154a..d4aabdaba42a 100644 --- a/tools/perf/util/target.h +++ b/tools/perf/util/target.h @@ -33,9 +33,14 @@ enum perf_target_errno { PERF_ERRNO_TARGET__PID_OVERRIDE_SYSTEM, PERF_ERRNO_TARGET__UID_OVERRIDE_SYSTEM, + /* for perf_target__parse_uid() */ + PERF_ERRNO_TARGET__INVALID_UID, + PERF_ERRNO_TARGET__USER_NOT_FOUND, + __PERF_ERRNO_TARGET__END, }; enum perf_target_errno perf_target__validate(struct perf_target *target); +enum perf_target_errno perf_target__parse_uid(struct perf_target *target); #endif /* _PERF_TARGET_H */ diff --git a/tools/perf/util/usage.c b/tools/perf/util/usage.c index e851abc22ccc..4007aca8e0ca 100644 --- a/tools/perf/util/usage.c +++ b/tools/perf/util/usage.c @@ -82,34 +82,3 @@ void warning(const char *warn, ...) warn_routine(warn, params); va_end(params); } - -uid_t parse_target_uid(const char *str) -{ - struct passwd pwd, *result; - char buf[1024]; - - if (str == NULL) - return UINT_MAX; - - getpwnam_r(str, &pwd, buf, sizeof(buf), &result); - - if (result == NULL) { - char *endptr; - int uid = strtol(str, &endptr, 10); - - if (*endptr != '\0') { - ui__error("Invalid user %s\n", str); - return UINT_MAX - 1; - } - - getpwuid_r(uid, &pwd, buf, sizeof(buf), &result); - - if (result == NULL) { - ui__error("Problems obtaining information for user %s\n", - str); - return UINT_MAX - 1; - } - } - - return result->pw_uid; -} diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 52be74c359d3..27a11a78ad39 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h @@ -74,7 +74,6 @@ #include #include #include -#include #include #include "../../../include/linux/magic.h" #include "types.h" @@ -249,8 +248,6 @@ struct perf_event_attr; void event_attr_init(struct perf_event_attr *attr); -uid_t parse_target_uid(const char *str); - #define _STR(x) #x #define STR(x) _STR(x) -- cgit v1.2.2 From 16ad2ffb822cd28e2330284a60fdfec8bb90bbb0 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Mon, 7 May 2012 14:09:02 +0900 Subject: perf tools: Introduce perf_target__strerror() The perf_target__strerror() sets @buf to a string that describes the (perf_target-specific) error condition that is passed via @errnum. This is similar to strerror_r() and does same thing if @errnum has a standard errno value. Signed-off-by: Namhyung Kim Suggested-by: Arnaldo Carvalho de Melo Reviewed-by: David Ahern Cc: David Ahern Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1336367344-28071-6-git-send-email-namhyung.kim@lge.com [ committer note: No need to use PERF_ERRNO_TARGET__SUCCESS, use shorter idiom ] Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/debug.c | 1 + tools/perf/util/target.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/target.h | 3 +++ 3 files changed, 55 insertions(+) (limited to 'tools/perf/util') diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c index 26817daa2961..efb1fce259a4 100644 --- a/tools/perf/util/debug.c +++ b/tools/perf/util/debug.c @@ -11,6 +11,7 @@ #include "event.h" #include "debug.h" #include "util.h" +#include "target.h" int verbose; bool dump_trace = false, quiet = false; diff --git a/tools/perf/util/target.c b/tools/perf/util/target.c index 02a6bedb69a3..1064d5b148ad 100644 --- a/tools/perf/util/target.c +++ b/tools/perf/util/target.c @@ -10,6 +10,7 @@ #include "debug.h" #include +#include enum perf_target_errno perf_target__validate(struct perf_target *target) @@ -89,3 +90,53 @@ enum perf_target_errno perf_target__parse_uid(struct perf_target *target) target->uid = result->pw_uid; return PERF_ERRNO_TARGET__SUCCESS; } + +/* + * This must have a same ordering as the enum perf_target_errno. + */ +static const char *perf_target__error_str[] = { + "PID/TID switch overriding CPU", + "PID/TID switch overriding UID", + "UID switch overriding CPU", + "PID/TID switch overriding SYSTEM", + "UID switch overriding SYSTEM", + "Invalid User: %s", + "Problems obtaining information for user %s", +}; + +int perf_target__strerror(struct perf_target *target, int errnum, + char *buf, size_t buflen) +{ + int idx; + const char *msg; + + if (errnum >= 0) { + strerror_r(errnum, buf, buflen); + return 0; + } + + if (errnum < __PERF_ERRNO_TARGET__START || + errnum >= __PERF_ERRNO_TARGET__END) + return -1; + + idx = errnum - __PERF_ERRNO_TARGET__START; + msg = perf_target__error_str[idx]; + + switch (errnum) { + case PERF_ERRNO_TARGET__PID_OVERRIDE_CPU + ... PERF_ERRNO_TARGET__UID_OVERRIDE_SYSTEM: + snprintf(buf, buflen, "%s", msg); + break; + + case PERF_ERRNO_TARGET__INVALID_UID: + case PERF_ERRNO_TARGET__USER_NOT_FOUND: + snprintf(buf, buflen, msg, target->uid_str); + break; + + default: + /* cannot reach here */ + break; + } + + return 0; +} diff --git a/tools/perf/util/target.h b/tools/perf/util/target.h index d4aabdaba42a..6fcd01c440a9 100644 --- a/tools/perf/util/target.h +++ b/tools/perf/util/target.h @@ -43,4 +43,7 @@ enum perf_target_errno { enum perf_target_errno perf_target__validate(struct perf_target *target); enum perf_target_errno perf_target__parse_uid(struct perf_target *target); +int perf_target__strerror(struct perf_target *target, int errnum, char *buf, + size_t buflen); + #endif /* _PERF_TARGET_H */ -- cgit v1.2.2 From d67356e7f80f5c2ef487bedc11a91d5fe18c5a15 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Mon, 7 May 2012 14:09:03 +0900 Subject: perf target: Consolidate target task/cpu checking There are places that check whether target task/cpu is given or not and some of them didn't check newly introduced uid or cpu list. Add and use three of helper functions to treat them properly. Signed-off-by: Namhyung Kim Reviewed-by: David Ahern Cc: David Ahern Cc: Ingo Molnar Cc: Namhyung Kim Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1336367344-28071-7-git-send-email-namhyung.kim@lge.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/evlist.c | 10 ++++------ tools/perf/util/evsel.c | 8 ++++---- tools/perf/util/target.h | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 10 deletions(-) (limited to 'tools/perf/util') diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 183b199b0d09..1201daf71719 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -609,12 +609,10 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, if (evlist->threads == NULL) return -1; - if (target->uid != UINT_MAX || target->tid) - evlist->cpus = cpu_map__dummy_new(); - else if (!target->system_wide && target->cpu_list == NULL) - evlist->cpus = cpu_map__dummy_new(); - else + if (!perf_target__no_cpu(target)) evlist->cpus = cpu_map__new(target->cpu_list); + else + evlist->cpus = cpu_map__dummy_new(); if (evlist->cpus == NULL) goto out_delete_threads; @@ -831,7 +829,7 @@ int perf_evlist__prepare_workload(struct perf_evlist *evlist, exit(-1); } - if (!opts->target.system_wide && !opts->target.tid && !opts->target.pid) + if (perf_target__none(&opts->target)) evlist->threads->map[0] = evlist->workload.pid; close(child_ready_pipe[1]); diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index bb785a098ced..21eaab240396 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -114,8 +114,8 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts, attr->sample_type |= PERF_SAMPLE_PERIOD; if (!opts->sample_id_all_missing && - (opts->sample_time || opts->target.system_wide || - !opts->no_inherit || opts->target.cpu_list)) + (opts->sample_time || !opts->no_inherit || + !perf_target__no_cpu(&opts->target))) attr->sample_type |= PERF_SAMPLE_TIME; if (opts->raw_samples) { @@ -136,8 +136,8 @@ void perf_evsel__config(struct perf_evsel *evsel, struct perf_record_opts *opts, attr->mmap = track; attr->comm = track; - if (!opts->target.pid && !opts->target.tid && - !opts->target.system_wide && (!opts->group || evsel == first)) { + if (perf_target__none(&opts->target) && + (!opts->group || evsel == first)) { attr->disabled = 1; attr->enable_on_exec = 1; } diff --git a/tools/perf/util/target.h b/tools/perf/util/target.h index 6fcd01c440a9..127cff3f8ced 100644 --- a/tools/perf/util/target.h +++ b/tools/perf/util/target.h @@ -46,4 +46,19 @@ enum perf_target_errno perf_target__parse_uid(struct perf_target *target); int perf_target__strerror(struct perf_target *target, int errnum, char *buf, size_t buflen); +static inline bool perf_target__no_task(struct perf_target *target) +{ + return !target->pid && !target->tid && !target->uid_str; +} + +static inline bool perf_target__no_cpu(struct perf_target *target) +{ + return !target->system_wide && !target->cpu_list; +} + +static inline bool perf_target__none(struct perf_target *target) +{ + return perf_target__no_task(target) && perf_target__no_cpu(target); +} + #endif /* _PERF_TARGET_H */ -- cgit v1.2.2