Commit 30fdaa6b authored by Ingo Molnar's avatar Ingo Molnar

Merge tag 'perf-core-for-mingo' of...

Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core

Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:

User visible changes:

  - Show the first event with an invalid filter (David Ahern, Arnaldo Carvalho de Melo)

  - Fix garbage output when intermixing syscalls from different threads in 'perf trace' (Arnaldo Carvalho de Melo)

  - Fix 'perf timechart' SIBGUS error on sparc64 (David Ahern)

Infrastructure changes:

  - Set JOBS based on CPU or processor, making it work on SPARC, where
    /proc/cpuinfo has "CPU", not "processor" (David Ahern)

  - Zero should not be considered "not found" in libtraceevent's eval_flag() (Steven Rostedt)
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents baa5a7bc 7c27f78a
...@@ -3615,7 +3615,7 @@ static const struct flag flags[] = { ...@@ -3615,7 +3615,7 @@ static const struct flag flags[] = {
{ "HRTIMER_RESTART", 1 }, { "HRTIMER_RESTART", 1 },
}; };
static unsigned long long eval_flag(const char *flag) static long long eval_flag(const char *flag)
{ {
int i; int i;
...@@ -3631,7 +3631,7 @@ static unsigned long long eval_flag(const char *flag) ...@@ -3631,7 +3631,7 @@ static unsigned long long eval_flag(const char *flag)
if (strcmp(flags[i].name, flag) == 0) if (strcmp(flags[i].name, flag) == 0)
return flags[i].value; return flags[i].value;
return 0; return -1LL;
} }
static void print_str_to_seq(struct trace_seq *s, const char *format, static void print_str_to_seq(struct trace_seq *s, const char *format,
...@@ -3705,7 +3705,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, ...@@ -3705,7 +3705,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
struct print_flag_sym *flag; struct print_flag_sym *flag;
struct format_field *field; struct format_field *field;
struct printk_map *printk; struct printk_map *printk;
unsigned long long val, fval; long long val, fval;
unsigned long addr; unsigned long addr;
char *str; char *str;
unsigned char *hex; unsigned char *hex;
...@@ -3764,11 +3764,11 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, ...@@ -3764,11 +3764,11 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
print = 0; print = 0;
for (flag = arg->flags.flags; flag; flag = flag->next) { for (flag = arg->flags.flags; flag; flag = flag->next) {
fval = eval_flag(flag->value); fval = eval_flag(flag->value);
if (!val && !fval) { if (!val && fval < 0) {
print_str_to_seq(s, format, len_arg, flag->str); print_str_to_seq(s, format, len_arg, flag->str);
break; break;
} }
if (fval && (val & fval) == fval) { if (fval > 0 && (val & fval) == fval) {
if (print && arg->flags.delim) if (print && arg->flags.delim)
trace_seq_puts(s, arg->flags.delim); trace_seq_puts(s, arg->flags.delim);
print_str_to_seq(s, format, len_arg, flag->str); print_str_to_seq(s, format, len_arg, flag->str);
......
...@@ -24,7 +24,7 @@ unexport MAKEFLAGS ...@@ -24,7 +24,7 @@ unexport MAKEFLAGS
# (To override it, run 'make JOBS=1' and similar.) # (To override it, run 'make JOBS=1' and similar.)
# #
ifeq ($(JOBS),) ifeq ($(JOBS),)
JOBS := $(shell grep -c ^processor /proc/cpuinfo 2>/dev/null) JOBS := $(shell egrep -c '^processor|^CPU' /proc/cpuinfo 2>/dev/null)
ifeq ($(JOBS),0) ifeq ($(JOBS),0)
JOBS := 1 JOBS := 1
endif endif
......
...@@ -161,8 +161,9 @@ static int record__open(struct record *rec) ...@@ -161,8 +161,9 @@ static int record__open(struct record *rec)
} }
} }
if (perf_evlist__apply_filters(evlist)) { if (perf_evlist__apply_filters(evlist, &pos)) {
error("failed to set filter with %d (%s)\n", errno, error("failed to set filter \"%s\" on event %s with %d (%s)\n",
pos->filter, perf_evsel__name(pos), errno,
strerror_r(errno, msg, sizeof(msg))); strerror_r(errno, msg, sizeof(msg)));
rc = -1; rc = -1;
goto out; goto out;
......
...@@ -684,8 +684,9 @@ static int __run_perf_stat(int argc, const char **argv) ...@@ -684,8 +684,9 @@ static int __run_perf_stat(int argc, const char **argv)
unit_width = l; unit_width = l;
} }
if (perf_evlist__apply_filters(evsel_list)) { if (perf_evlist__apply_filters(evsel_list, &counter)) {
error("failed to set filter with %d (%s)\n", errno, error("failed to set filter \"%s\" on event %s with %d (%s)\n",
counter->filter, perf_evsel__name(counter), errno,
strerror_r(errno, msg, sizeof(msg))); strerror_r(errno, msg, sizeof(msg)));
return -1; return -1;
} }
......
...@@ -1735,7 +1735,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel, ...@@ -1735,7 +1735,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
} }
if (!trace->summary_only) if (!trace->summary_only)
printed += trace__printf_interrupted_entry(trace, sample); trace__printf_interrupted_entry(trace, sample);
ttrace->entry_time = sample->time; ttrace->entry_time = sample->time;
msg = ttrace->entry_str; msg = ttrace->entry_str;
......
...@@ -29,7 +29,7 @@ static inline unsigned long long rdclock(void) ...@@ -29,7 +29,7 @@ static inline unsigned long long rdclock(void)
return ts.tv_sec * 1000000000ULL + ts.tv_nsec; return ts.tv_sec * 1000000000ULL + ts.tv_nsec;
} }
#define MAX_NR_CPUS 256 #define MAX_NR_CPUS 1024
extern const char *input_name; extern const char *input_name;
extern bool perf_host, perf_guest; extern bool perf_host, perf_guest;
......
...@@ -1050,7 +1050,7 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target) ...@@ -1050,7 +1050,7 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target)
return -1; return -1;
} }
int perf_evlist__apply_filters(struct perf_evlist *evlist) int perf_evlist__apply_filters(struct perf_evlist *evlist, struct perf_evsel **err_evsel)
{ {
struct perf_evsel *evsel; struct perf_evsel *evsel;
int err = 0; int err = 0;
...@@ -1062,8 +1062,10 @@ int perf_evlist__apply_filters(struct perf_evlist *evlist) ...@@ -1062,8 +1062,10 @@ int perf_evlist__apply_filters(struct perf_evlist *evlist)
continue; continue;
err = perf_evsel__set_filter(evsel, ncpus, nthreads, evsel->filter); err = perf_evsel__set_filter(evsel, ncpus, nthreads, evsel->filter);
if (err) if (err) {
*err_evsel = evsel;
break; break;
}
} }
return err; return err;
......
...@@ -152,7 +152,7 @@ static inline void perf_evlist__set_maps(struct perf_evlist *evlist, ...@@ -152,7 +152,7 @@ static inline void perf_evlist__set_maps(struct perf_evlist *evlist,
} }
int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target); int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target);
int perf_evlist__apply_filters(struct perf_evlist *evlist); int perf_evlist__apply_filters(struct perf_evlist *evlist, struct perf_evsel **err_evsel);
void __perf_evlist__set_leader(struct list_head *list); void __perf_evlist__set_leader(struct list_head *list);
void perf_evlist__set_leader(struct perf_evlist *evlist); void perf_evlist__set_leader(struct perf_evlist *evlist);
......
...@@ -1915,7 +1915,7 @@ u64 perf_evsel__intval(struct perf_evsel *evsel, struct perf_sample *sample, ...@@ -1915,7 +1915,7 @@ u64 perf_evsel__intval(struct perf_evsel *evsel, struct perf_sample *sample,
value = *(u32 *)ptr; value = *(u32 *)ptr;
break; break;
case 8: case 8:
value = *(u64 *)ptr; memcpy(&value, ptr, sizeof(u64));
break; break;
default: default:
return 0; return 0;
......
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