Commit 277d6f1d authored by Ingo Molnar's avatar Ingo Molnar

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

Merge tag 'perf-core-for-mingo-4.11-20170213' 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:

New features:

 - Introduce the 'delta-abs' 'perf diff' compute method, that orders the
   histogram entries by the absolute value of the percentage delta for a
   function in two perf.data files, i.e. the functions that changed the
   most (increase or decrease in samples) comes first (Namhyung Kim)

User visible changes:

 - Improve message about tweaking the kernel.perf_event_paranoid setting,
   telling how to make the change permanent by editing /etc/sysctl.conf
   (Arnaldo Carvalho de Melo)

Infrastructure changes:

 - Introduce linux/compiler-gcc.h as a counterpart to the kernel's,
   initially containing the definition of __fallthrough, more to
   come (__maybe_unused, etc) (Arnaldo Carvalho de Melo)

 - Fixes for problems uncovered by building tools/perf with clang, such
   as always true tests of arrays against NULL and variables that sometimes
   were used without being initialized (Arnaldo Carvalho de Melo, Steven Rostedt)

 - Before loading a new ELF, clear global variables set by the
   samples/bpf loader (Mickaël Salaün)

 - Ignore already processed ELF sections in the samples/bpf
   loader (Mickaël Salaün)

 - Fix compile error in the scripting code with some perl5
   versions (Wang YanQing)
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents 210f400d a734fb5d
...@@ -277,6 +277,11 @@ int load_bpf_file(char *path) ...@@ -277,6 +277,11 @@ int load_bpf_file(char *path)
Elf_Data *data, *data_prog, *symbols = NULL; Elf_Data *data, *data_prog, *symbols = NULL;
char *shname, *shname_prog; char *shname, *shname_prog;
/* reset global variables */
kern_version = 0;
memset(license, 0, sizeof(license));
memset(processed_sec, 0, sizeof(processed_sec));
if (elf_version(EV_CURRENT) == EV_NONE) if (elf_version(EV_CURRENT) == EV_NONE)
return 1; return 1;
...@@ -328,6 +333,8 @@ int load_bpf_file(char *path) ...@@ -328,6 +333,8 @@ int load_bpf_file(char *path)
/* load programs that need map fixup (relocations) */ /* load programs that need map fixup (relocations) */
for (i = 1; i < ehdr.e_shnum; i++) { for (i = 1; i < ehdr.e_shnum; i++) {
if (processed_sec[i])
continue;
if (get_sec(elf, i, &ehdr, &shname, &shdr, &data)) if (get_sec(elf, i, &ehdr, &shname, &shdr, &data))
continue; continue;
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/version.h> #include <linux/version.h>
#include <uapi/linux/bpf.h> #include <uapi/linux/bpf.h>
#include <uapi/linux/seccomp.h> #include <uapi/linux/seccomp.h>
#include <uapi/linux/unistd.h>
#include "bpf_helpers.h" #include "bpf_helpers.h"
#define PROG(F) SEC("kprobe/"__stringify(F)) int bpf_func_##F #define PROG(F) SEC("kprobe/"__stringify(F)) int bpf_func_##F
......
#ifndef _TOOLS_LINUX_COMPILER_H_
#error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead."
#endif
/*
* Common definitions for all gcc versions go here.
*/
#define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
#if GCC_VERSION >= 70000 && !defined(__CHECKER__)
# define __fallthrough __attribute__ ((fallthrough))
#endif
#ifndef _TOOLS_LINUX_COMPILER_H_ #ifndef _TOOLS_LINUX_COMPILER_H_
#define _TOOLS_LINUX_COMPILER_H_ #define _TOOLS_LINUX_COMPILER_H_
#ifdef __GNUC__
#include <linux/compiler-gcc.h>
#endif
/* Optimization barrier */ /* Optimization barrier */
/* The "volatile" is due to gcc bugs */ /* The "volatile" is due to gcc bugs */
#define barrier() __asm__ __volatile__("": : :"memory") #define barrier() __asm__ __volatile__("": : :"memory")
...@@ -128,11 +132,7 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s ...@@ -128,11 +132,7 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
#ifndef __fallthrough #ifndef __fallthrough
# if defined(__GNUC__) && __GNUC__ >= 7
# define __fallthrough __attribute__ ((fallthrough))
# else
# define __fallthrough # define __fallthrough
# endif
#endif #endif
#endif /* _TOOLS_LINUX_COMPILER_H */ #endif /* _TOOLS_LINUX_COMPILER_H */
...@@ -315,6 +315,7 @@ static unsigned int old_update_pointers(struct kbuffer *kbuf) ...@@ -315,6 +315,7 @@ static unsigned int old_update_pointers(struct kbuffer *kbuf)
extend += delta; extend += delta;
delta = extend; delta = extend;
ptr += 4; ptr += 4;
length = 0;
break; break;
case OLD_RINGBUF_TYPE_TIME_STAMP: case OLD_RINGBUF_TYPE_TIME_STAMP:
......
...@@ -130,7 +130,7 @@ static int function_handler(struct trace_seq *s, struct pevent_record *record, ...@@ -130,7 +130,7 @@ static int function_handler(struct trace_seq *s, struct pevent_record *record,
unsigned long long pfunction; unsigned long long pfunction;
const char *func; const char *func;
const char *parent; const char *parent;
int index; int index = 0;
if (pevent_get_field_val(s, event, "ip", record, &function, 1)) if (pevent_get_field_val(s, event, "ip", record, &function, 1))
return trace_seq_putc(s, '!'); return trace_seq_putc(s, '!');
......
...@@ -498,6 +498,18 @@ record.*:: ...@@ -498,6 +498,18 @@ record.*::
But if this option is 'no-cache', it will not update the build-id cache. But if this option is 'no-cache', it will not update the build-id cache.
'skip' skips post-processing and does not update the cache. 'skip' skips post-processing and does not update the cache.
diff.*::
diff.order::
This option sets the number of columns to sort the result.
The default is 0, which means sorting by baseline.
Setting it to 1 will sort the result by delta (or other
compute method selected).
diff.compute::
This options sets the method for computing the diff result.
Possible values are 'delta', 'delta-abs', 'ratio' and
'wdiff'. Default is 'delta'.
SEE ALSO SEE ALSO
-------- --------
linkperf:perf[1] linkperf:perf[1]
...@@ -86,8 +86,9 @@ OPTIONS ...@@ -86,8 +86,9 @@ OPTIONS
-c:: -c::
--compute:: --compute::
Differential computation selection - delta,ratio,wdiff (default is delta). Differential computation selection - delta, ratio, wdiff, delta-abs
See COMPARISON METHODS section for more info. (default is delta-abs). Default can be changed using diff.compute
config option. See COMPARISON METHODS section for more info.
-p:: -p::
--period:: --period::
...@@ -99,7 +100,11 @@ OPTIONS ...@@ -99,7 +100,11 @@ OPTIONS
-o:: -o::
--order:: --order::
Specify compute sorting column number. Specify compute sorting column number. 0 means sorting by baseline
overhead and 1 (default) means sorting by computed value of column 1
(data from the first file other base baseline). Values more than 1
can be used only if enough data files are provided.
The default value can be set using the diff.order config option.
--percentage:: --percentage::
Determine how to display the overhead percentage of filtered entries. Determine how to display the overhead percentage of filtered entries.
...@@ -181,6 +186,10 @@ with: ...@@ -181,6 +186,10 @@ with:
relative to how entries are filtered. Use --percentage=absolute to relative to how entries are filtered. Use --percentage=absolute to
prevent such fluctuation. prevent such fluctuation.
delta-abs
~~~~~~~~~
Same as 'delta` method, but sort the result with the absolute values.
ratio ratio
~~~~~ ~~~~~
If specified the 'Ratio' column is displayed with value 'r' computed as: If specified the 'Ratio' column is displayed with value 'r' computed as:
......
...@@ -61,6 +61,7 @@ tools/include/asm-generic/bitops.h ...@@ -61,6 +61,7 @@ tools/include/asm-generic/bitops.h
tools/include/linux/atomic.h tools/include/linux/atomic.h
tools/include/linux/bitops.h tools/include/linux/bitops.h
tools/include/linux/compiler.h tools/include/linux/compiler.h
tools/include/linux/compiler-gcc.h
tools/include/linux/coresight-pmu.h tools/include/linux/coresight-pmu.h
tools/include/linux/filter.h tools/include/linux/filter.h
tools/include/linux/hash.h tools/include/linux/hash.h
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "util/symbol.h" #include "util/symbol.h"
#include "util/util.h" #include "util/util.h"
#include "util/data.h" #include "util/data.h"
#include "util/config.h"
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
...@@ -30,6 +31,7 @@ enum { ...@@ -30,6 +31,7 @@ enum {
PERF_HPP_DIFF__RATIO, PERF_HPP_DIFF__RATIO,
PERF_HPP_DIFF__WEIGHTED_DIFF, PERF_HPP_DIFF__WEIGHTED_DIFF,
PERF_HPP_DIFF__FORMULA, PERF_HPP_DIFF__FORMULA,
PERF_HPP_DIFF__DELTA_ABS,
PERF_HPP_DIFF__MAX_INDEX PERF_HPP_DIFF__MAX_INDEX
}; };
...@@ -64,7 +66,7 @@ static bool force; ...@@ -64,7 +66,7 @@ static bool force;
static bool show_period; static bool show_period;
static bool show_formula; static bool show_formula;
static bool show_baseline_only; static bool show_baseline_only;
static unsigned int sort_compute; static unsigned int sort_compute = 1;
static s64 compute_wdiff_w1; static s64 compute_wdiff_w1;
static s64 compute_wdiff_w2; static s64 compute_wdiff_w2;
...@@ -73,19 +75,22 @@ enum { ...@@ -73,19 +75,22 @@ enum {
COMPUTE_DELTA, COMPUTE_DELTA,
COMPUTE_RATIO, COMPUTE_RATIO,
COMPUTE_WEIGHTED_DIFF, COMPUTE_WEIGHTED_DIFF,
COMPUTE_DELTA_ABS,
COMPUTE_MAX, COMPUTE_MAX,
}; };
const char *compute_names[COMPUTE_MAX] = { const char *compute_names[COMPUTE_MAX] = {
[COMPUTE_DELTA] = "delta", [COMPUTE_DELTA] = "delta",
[COMPUTE_DELTA_ABS] = "delta-abs",
[COMPUTE_RATIO] = "ratio", [COMPUTE_RATIO] = "ratio",
[COMPUTE_WEIGHTED_DIFF] = "wdiff", [COMPUTE_WEIGHTED_DIFF] = "wdiff",
}; };
static int compute; static int compute = COMPUTE_DELTA_ABS;
static int compute_2_hpp[COMPUTE_MAX] = { static int compute_2_hpp[COMPUTE_MAX] = {
[COMPUTE_DELTA] = PERF_HPP_DIFF__DELTA, [COMPUTE_DELTA] = PERF_HPP_DIFF__DELTA,
[COMPUTE_DELTA_ABS] = PERF_HPP_DIFF__DELTA_ABS,
[COMPUTE_RATIO] = PERF_HPP_DIFF__RATIO, [COMPUTE_RATIO] = PERF_HPP_DIFF__RATIO,
[COMPUTE_WEIGHTED_DIFF] = PERF_HPP_DIFF__WEIGHTED_DIFF, [COMPUTE_WEIGHTED_DIFF] = PERF_HPP_DIFF__WEIGHTED_DIFF,
}; };
...@@ -111,6 +116,10 @@ static struct header_column { ...@@ -111,6 +116,10 @@ static struct header_column {
.name = "Delta", .name = "Delta",
.width = 7, .width = 7,
}, },
[PERF_HPP_DIFF__DELTA_ABS] = {
.name = "Delta Abs",
.width = 7,
},
[PERF_HPP_DIFF__RATIO] = { [PERF_HPP_DIFF__RATIO] = {
.name = "Ratio", .name = "Ratio",
.width = 14, .width = 14,
...@@ -298,6 +307,7 @@ static int formula_fprintf(struct hist_entry *he, struct hist_entry *pair, ...@@ -298,6 +307,7 @@ static int formula_fprintf(struct hist_entry *he, struct hist_entry *pair,
{ {
switch (compute) { switch (compute) {
case COMPUTE_DELTA: case COMPUTE_DELTA:
case COMPUTE_DELTA_ABS:
return formula_delta(he, pair, buf, size); return formula_delta(he, pair, buf, size);
case COMPUTE_RATIO: case COMPUTE_RATIO:
return formula_ratio(he, pair, buf, size); return formula_ratio(he, pair, buf, size);
...@@ -461,6 +471,7 @@ static void hists__precompute(struct hists *hists) ...@@ -461,6 +471,7 @@ static void hists__precompute(struct hists *hists)
switch (compute) { switch (compute) {
case COMPUTE_DELTA: case COMPUTE_DELTA:
case COMPUTE_DELTA_ABS:
compute_delta(he, pair); compute_delta(he, pair);
break; break;
case COMPUTE_RATIO: case COMPUTE_RATIO:
...@@ -498,6 +509,13 @@ __hist_entry__cmp_compute(struct hist_entry *left, struct hist_entry *right, ...@@ -498,6 +509,13 @@ __hist_entry__cmp_compute(struct hist_entry *left, struct hist_entry *right,
return cmp_doubles(l, r); return cmp_doubles(l, r);
} }
case COMPUTE_DELTA_ABS:
{
double l = fabs(left->diff.period_ratio_delta);
double r = fabs(right->diff.period_ratio_delta);
return cmp_doubles(l, r);
}
case COMPUTE_RATIO: case COMPUTE_RATIO:
{ {
double l = left->diff.period_ratio; double l = left->diff.period_ratio;
...@@ -564,7 +582,7 @@ hist_entry__cmp_compute_idx(struct hist_entry *left, struct hist_entry *right, ...@@ -564,7 +582,7 @@ hist_entry__cmp_compute_idx(struct hist_entry *left, struct hist_entry *right,
if (!p_left || !p_right) if (!p_left || !p_right)
return p_left ? -1 : 1; return p_left ? -1 : 1;
if (c != COMPUTE_DELTA) { if (c != COMPUTE_DELTA && c != COMPUTE_DELTA_ABS) {
/* /*
* The delta can be computed without the baseline, but * The delta can be computed without the baseline, but
* others are not. Put those entries which have no * others are not. Put those entries which have no
...@@ -606,6 +624,15 @@ hist_entry__cmp_delta(struct perf_hpp_fmt *fmt, ...@@ -606,6 +624,15 @@ hist_entry__cmp_delta(struct perf_hpp_fmt *fmt,
return hist_entry__cmp_compute(right, left, COMPUTE_DELTA, d->idx); return hist_entry__cmp_compute(right, left, COMPUTE_DELTA, d->idx);
} }
static int64_t
hist_entry__cmp_delta_abs(struct perf_hpp_fmt *fmt,
struct hist_entry *left, struct hist_entry *right)
{
struct data__file *d = fmt_to_data_file(fmt);
return hist_entry__cmp_compute(right, left, COMPUTE_DELTA_ABS, d->idx);
}
static int64_t static int64_t
hist_entry__cmp_ratio(struct perf_hpp_fmt *fmt, hist_entry__cmp_ratio(struct perf_hpp_fmt *fmt,
struct hist_entry *left, struct hist_entry *right) struct hist_entry *left, struct hist_entry *right)
...@@ -632,6 +659,14 @@ hist_entry__cmp_delta_idx(struct perf_hpp_fmt *fmt __maybe_unused, ...@@ -632,6 +659,14 @@ hist_entry__cmp_delta_idx(struct perf_hpp_fmt *fmt __maybe_unused,
sort_compute); sort_compute);
} }
static int64_t
hist_entry__cmp_delta_abs_idx(struct perf_hpp_fmt *fmt __maybe_unused,
struct hist_entry *left, struct hist_entry *right)
{
return hist_entry__cmp_compute_idx(right, left, COMPUTE_DELTA_ABS,
sort_compute);
}
static int64_t static int64_t
hist_entry__cmp_ratio_idx(struct perf_hpp_fmt *fmt __maybe_unused, hist_entry__cmp_ratio_idx(struct perf_hpp_fmt *fmt __maybe_unused,
struct hist_entry *left, struct hist_entry *right) struct hist_entry *left, struct hist_entry *right)
...@@ -775,7 +810,7 @@ static const struct option options[] = { ...@@ -775,7 +810,7 @@ static const struct option options[] = {
OPT_BOOLEAN('b', "baseline-only", &show_baseline_only, OPT_BOOLEAN('b', "baseline-only", &show_baseline_only,
"Show only items with match in baseline"), "Show only items with match in baseline"),
OPT_CALLBACK('c', "compute", &compute, OPT_CALLBACK('c', "compute", &compute,
"delta,ratio,wdiff:w1,w2 (default delta)", "delta,delta-abs,ratio,wdiff:w1,w2 (default delta-abs)",
"Entries differential computation selection", "Entries differential computation selection",
setup_compute), setup_compute),
OPT_BOOLEAN('p', "period", &show_period, OPT_BOOLEAN('p', "period", &show_period,
...@@ -945,6 +980,7 @@ hpp__entry_pair(struct hist_entry *he, struct hist_entry *pair, ...@@ -945,6 +980,7 @@ hpp__entry_pair(struct hist_entry *he, struct hist_entry *pair,
switch (idx) { switch (idx) {
case PERF_HPP_DIFF__DELTA: case PERF_HPP_DIFF__DELTA:
case PERF_HPP_DIFF__DELTA_ABS:
if (pair->diff.computed) if (pair->diff.computed)
diff = pair->diff.period_ratio_delta; diff = pair->diff.period_ratio_delta;
else else
...@@ -1118,6 +1154,10 @@ static void data__hpp_register(struct data__file *d, int idx) ...@@ -1118,6 +1154,10 @@ static void data__hpp_register(struct data__file *d, int idx)
fmt->color = hpp__color_wdiff; fmt->color = hpp__color_wdiff;
fmt->sort = hist_entry__cmp_wdiff; fmt->sort = hist_entry__cmp_wdiff;
break; break;
case PERF_HPP_DIFF__DELTA_ABS:
fmt->color = hpp__color_delta;
fmt->sort = hist_entry__cmp_delta_abs;
break;
default: default:
fmt->sort = hist_entry__cmp_nop; fmt->sort = hist_entry__cmp_nop;
break; break;
...@@ -1195,6 +1235,9 @@ static int ui_init(void) ...@@ -1195,6 +1235,9 @@ static int ui_init(void)
case COMPUTE_WEIGHTED_DIFF: case COMPUTE_WEIGHTED_DIFF:
fmt->sort = hist_entry__cmp_wdiff_idx; fmt->sort = hist_entry__cmp_wdiff_idx;
break; break;
case COMPUTE_DELTA_ABS:
fmt->sort = hist_entry__cmp_delta_abs_idx;
break;
default: default:
BUG_ON(1); BUG_ON(1);
} }
...@@ -1249,6 +1292,31 @@ static int data_init(int argc, const char **argv) ...@@ -1249,6 +1292,31 @@ static int data_init(int argc, const char **argv)
return 0; return 0;
} }
static int diff__config(const char *var, const char *value,
void *cb __maybe_unused)
{
if (!strcmp(var, "diff.order")) {
sort_compute = perf_config_int(var, value);
return 0;
}
if (!strcmp(var, "diff.compute")) {
if (!strcmp(value, "delta")) {
compute = COMPUTE_DELTA;
} else if (!strcmp(value, "delta-abs")) {
compute = COMPUTE_DELTA_ABS;
} else if (!strcmp(value, "ratio")) {
compute = COMPUTE_RATIO;
} else if (!strcmp(value, "wdiff")) {
compute = COMPUTE_WEIGHTED_DIFF;
} else {
pr_err("Invalid compute method: %s\n", value);
return -1;
}
}
return 0;
}
int cmd_diff(int argc, const char **argv, const char *prefix __maybe_unused) int cmd_diff(int argc, const char **argv, const char *prefix __maybe_unused)
{ {
int ret = hists__init(); int ret = hists__init();
...@@ -1256,6 +1324,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -1256,6 +1324,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix __maybe_unused)
if (ret < 0) if (ret < 0)
return ret; return ret;
perf_config(diff__config, NULL);
argc = parse_options(argc, argv, options, diff_usage, 0); argc = parse_options(argc, argv, options, diff_usage, 0);
if (symbol__init(NULL) < 0) if (symbol__init(NULL) < 0)
......
...@@ -1065,7 +1065,7 @@ static void __print_page_alloc_result(struct perf_session *session, int n_lines) ...@@ -1065,7 +1065,7 @@ static void __print_page_alloc_result(struct perf_session *session, int n_lines)
data = rb_entry(next, struct page_stat, node); data = rb_entry(next, struct page_stat, node);
sym = machine__find_kernel_function(machine, data->callsite, &map); sym = machine__find_kernel_function(machine, data->callsite, &map);
if (sym && sym->name) if (sym)
caller = sym->name; caller = sym->name;
else else
scnprintf(buf, sizeof(buf), "%"PRIx64, data->callsite); scnprintf(buf, sizeof(buf), "%"PRIx64, data->callsite);
...@@ -1107,7 +1107,7 @@ static void __print_page_caller_result(struct perf_session *session, int n_lines ...@@ -1107,7 +1107,7 @@ static void __print_page_caller_result(struct perf_session *session, int n_lines
data = rb_entry(next, struct page_stat, node); data = rb_entry(next, struct page_stat, node);
sym = machine__find_kernel_function(machine, data->callsite, &map); sym = machine__find_kernel_function(machine, data->callsite, &map);
if (sym && sym->name) if (sym)
caller = sym->name; caller = sym->name;
else else
scnprintf(buf, sizeof(buf), "%"PRIx64, data->callsite); scnprintf(buf, sizeof(buf), "%"PRIx64, data->callsite);
......
...@@ -418,7 +418,7 @@ static int record__mmap(struct record *rec) ...@@ -418,7 +418,7 @@ static int record__mmap(struct record *rec)
static int record__open(struct record *rec) static int record__open(struct record *rec)
{ {
char msg[512]; char msg[BUFSIZ];
struct perf_evsel *pos; struct perf_evsel *pos;
struct perf_evlist *evlist = rec->evlist; struct perf_evlist *evlist = rec->evlist;
struct perf_session *session = rec->session; struct perf_session *session = rec->session;
......
...@@ -2067,7 +2067,7 @@ static void save_task_callchain(struct perf_sched *sched, ...@@ -2067,7 +2067,7 @@ static void save_task_callchain(struct perf_sched *sched,
break; break;
sym = node->sym; sym = node->sym;
if (sym && sym->name) { if (sym) {
if (!strcmp(sym->name, "schedule") || if (!strcmp(sym->name, "schedule") ||
!strcmp(sym->name, "__schedule") || !strcmp(sym->name, "__schedule") ||
!strcmp(sym->name, "preempt_schedule")) !strcmp(sym->name, "preempt_schedule"))
......
...@@ -533,7 +533,7 @@ static int store_counter_ids(struct perf_evsel *counter) ...@@ -533,7 +533,7 @@ static int store_counter_ids(struct perf_evsel *counter)
static int __run_perf_stat(int argc, const char **argv) static int __run_perf_stat(int argc, const char **argv)
{ {
int interval = stat_config.interval; int interval = stat_config.interval;
char msg[512]; char msg[BUFSIZ];
unsigned long long t0, t1; unsigned long long t0, t1;
struct perf_evsel *counter; struct perf_evsel *counter;
struct timespec ts; struct timespec ts;
......
...@@ -859,7 +859,7 @@ static void perf_top__mmap_read(struct perf_top *top) ...@@ -859,7 +859,7 @@ static void perf_top__mmap_read(struct perf_top *top)
static int perf_top__start_counters(struct perf_top *top) static int perf_top__start_counters(struct perf_top *top)
{ {
char msg[512]; char msg[BUFSIZ];
struct perf_evsel *counter; struct perf_evsel *counter;
struct perf_evlist *evlist = top->evlist; struct perf_evlist *evlist = top->evlist;
struct record_opts *opts = &top->record_opts; struct record_opts *opts = &top->record_opts;
......
...@@ -66,7 +66,7 @@ int test__PERF_RECORD(int subtest __maybe_unused) ...@@ -66,7 +66,7 @@ int test__PERF_RECORD(int subtest __maybe_unused)
if (evlist == NULL) /* Fallback for kernels lacking PERF_COUNT_SW_DUMMY */ if (evlist == NULL) /* Fallback for kernels lacking PERF_COUNT_SW_DUMMY */
evlist = perf_evlist__new_default(); evlist = perf_evlist__new_default();
if (evlist == NULL || argv == NULL) { if (evlist == NULL) {
pr_debug("Not enough memory to create evlist\n"); pr_debug("Not enough memory to create evlist\n");
goto out; goto out;
} }
......
...@@ -2469,7 +2469,9 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target, ...@@ -2469,7 +2469,9 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,
" -1: Allow use of (almost) all events by all users\n" " -1: Allow use of (almost) all events by all users\n"
">= 0: Disallow raw tracepoint access by users without CAP_IOC_LOCK\n" ">= 0: Disallow raw tracepoint access by users without CAP_IOC_LOCK\n"
">= 1: Disallow CPU event access by users without CAP_SYS_ADMIN\n" ">= 1: Disallow CPU event access by users without CAP_SYS_ADMIN\n"
">= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN", ">= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN\n\n"
"To make this setting permanent, edit /etc/sysctl.conf too, e.g.:\n\n"
" kernel.perf_event_paranoid = -1\n" ,
target->system_wide ? "system-wide " : "", target->system_wide ? "system-wide " : "",
perf_event_paranoid()); perf_event_paranoid());
case ENOENT: case ENOENT:
......
...@@ -168,7 +168,6 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, ...@@ -168,7 +168,6 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment,
if (symbol_conf.bt_stop_list && if (symbol_conf.bt_stop_list &&
node->sym && node->sym &&
node->sym->name &&
strlist__has_entry(symbol_conf.bt_stop_list, strlist__has_entry(symbol_conf.bt_stop_list,
node->sym->name)) { node->sym->name)) {
break; break;
......
...@@ -1565,7 +1565,7 @@ int machine__process_event(struct machine *machine, union perf_event *event, ...@@ -1565,7 +1565,7 @@ int machine__process_event(struct machine *machine, union perf_event *event,
static bool symbol__match_regex(struct symbol *sym, regex_t *regex) static bool symbol__match_regex(struct symbol *sym, regex_t *regex)
{ {
if (sym->name && !regexec(regex, sym->name, 0, NULL, 0)) if (!regexec(regex, sym->name, 0, NULL, 0))
return 1; return 1;
return 0; return 0;
} }
......
...@@ -387,10 +387,10 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) ...@@ -387,10 +387,10 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp)
{ {
const char *dsoname = "[unknown]"; const char *dsoname = "[unknown]";
if (map && map->dso && (map->dso->name || map->dso->long_name)) { if (map && map->dso) {
if (symbol_conf.show_kernel_path && map->dso->long_name) if (symbol_conf.show_kernel_path && map->dso->long_name)
dsoname = map->dso->long_name; dsoname = map->dso->long_name;
else if (map->dso->name) else
dsoname = map->dso->name; dsoname = map->dso->name;
} }
......
libperf-$(CONFIG_LIBPERL) += trace-event-perl.o libperf-$(CONFIG_LIBPERL) += trace-event-perl.o
libperf-$(CONFIG_LIBPYTHON) += trace-event-python.o libperf-$(CONFIG_LIBPYTHON) += trace-event-python.o
CFLAGS_trace-event-perl.o += $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow -Wno-undef -Wno-switch-default CFLAGS_trace-event-perl.o += $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow -Wno-nested-externs -Wno-undef -Wno-switch-default
CFLAGS_trace-event-python.o += $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow CFLAGS_trace-event-python.o += $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow
...@@ -309,10 +309,10 @@ static SV *perl_process_callchain(struct perf_sample *sample, ...@@ -309,10 +309,10 @@ static SV *perl_process_callchain(struct perf_sample *sample,
if (node->map) { if (node->map) {
struct map *map = node->map; struct map *map = node->map;
const char *dsoname = "[unknown]"; const char *dsoname = "[unknown]";
if (map && map->dso && (map->dso->name || map->dso->long_name)) { if (map && map->dso) {
if (symbol_conf.show_kernel_path && map->dso->long_name) if (symbol_conf.show_kernel_path && map->dso->long_name)
dsoname = map->dso->long_name; dsoname = map->dso->long_name;
else if (map->dso->name) else
dsoname = map->dso->name; dsoname = map->dso->name;
} }
if (!hv_stores(elem, "dso", newSVpv(dsoname,0))) { if (!hv_stores(elem, "dso", newSVpv(dsoname,0))) {
......
...@@ -21,7 +21,7 @@ size_t __symbol__fprintf_symname_offs(const struct symbol *sym, ...@@ -21,7 +21,7 @@ size_t __symbol__fprintf_symname_offs(const struct symbol *sym,
unsigned long offset; unsigned long offset;
size_t length; size_t length;
if (sym && sym->name) { if (sym) {
length = fprintf(fp, "%s", sym->name); length = fprintf(fp, "%s", sym->name);
if (al && print_offsets) { if (al && print_offsets) {
if (al->addr < sym->end) if (al->addr < sym->end)
......
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