Skip to content

Commit

Permalink
Merge tag 'perf-core-for-mingo-20160628' of git://git.kernel.org/pub/…
Browse files Browse the repository at this point in the history
…scm/linux/kernel/git/acme/linux into perf/core

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

New features:

 - Generate comm, fork and exit events when converting perf.data files to CTF (Wang Nan)

Infrastructure changes:

 - Add libbabeltrace to build-test (Wang Nan)

 - 'perf record' prep work to support multiple evlists (Wang Nan)

 - Remove unused hist_entry__annotate function (Ravi Bangoria)

 - Add more toolchain triplets (Ravi Bangoria)

 - Update message for slang devel packages on Ubuntu (Neeraj Badlani)

 - Generalize handling of 'ret' instructions in the annotate TUI (Naveen N. Rao)

 - Use proper dso name for is_regular_file, fixing device file handling (Jiri Olsa)

Build Fixes:

 - Add missing config.h include, fixing the build with libbabeltrace (Jiri Olsa)

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Ingo Molnar committed Jun 29, 2016
2 parents d4cf194 + ebccba3 commit d905768
Show file tree
Hide file tree
Showing 13 changed files with 331 additions and 59 deletions.
4 changes: 4 additions & 0 deletions tools/perf/Documentation/perf-data.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ OPTIONS for 'convert'
--verbose::
Be more verbose (show counter open errors, etc).

--all::
Convert all events, including non-sample events (comm, fork, ...), to output.
Default is off, only convert samples.

SEE ALSO
--------
linkperf:perf[1]
Expand Down
17 changes: 17 additions & 0 deletions tools/perf/arch/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,34 +9,44 @@ const char *const arm_triplets[] = {
"arm-unknown-linux-",
"arm-unknown-linux-gnu-",
"arm-unknown-linux-gnueabi-",
"arm-linux-gnu-",
"arm-linux-gnueabihf-",
"arm-none-eabi-",
NULL
};

const char *const arm64_triplets[] = {
"aarch64-linux-android-",
"aarch64-linux-gnu-",
NULL
};

const char *const powerpc_triplets[] = {
"powerpc-unknown-linux-gnu-",
"powerpc64-unknown-linux-gnu-",
"powerpc64-linux-gnu-",
"powerpc64le-linux-gnu-",
NULL
};

const char *const s390_triplets[] = {
"s390-ibm-linux-",
"s390x-linux-gnu-",
NULL
};

const char *const sh_triplets[] = {
"sh-unknown-linux-gnu-",
"sh64-unknown-linux-gnu-",
"sh-linux-gnu-",
"sh64-linux-gnu-",
NULL
};

const char *const sparc_triplets[] = {
"sparc-unknown-linux-gnu-",
"sparc64-unknown-linux-gnu-",
"sparc64-linux-gnu-",
NULL
};

Expand All @@ -49,12 +59,19 @@ const char *const x86_triplets[] = {
"i386-pc-linux-gnu-",
"i686-linux-android-",
"i686-android-linux-",
"x86_64-linux-gnu-",
"i586-linux-gnu-",
NULL
};

const char *const mips_triplets[] = {
"mips-unknown-linux-gnu-",
"mipsel-linux-android-",
"mips-linux-gnu-",
"mips64-linux-gnu-",
"mips64el-linux-gnuabi64-",
"mips64-linux-gnuabi64-",
"mipsel-linux-gnu-",
NULL
};

Expand Down
11 changes: 8 additions & 3 deletions tools/perf/builtin-data.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "perf.h"
#include "debug.h"
#include <subcmd/parse-options.h>
#include "data-convert.h"
#include "data-convert-bt.h"

typedef int (*data_cmd_fn_t)(int argc, const char **argv, const char *prefix);
Expand Down Expand Up @@ -53,14 +54,18 @@ static int cmd_data_convert(int argc, const char **argv,
const char *prefix __maybe_unused)
{
const char *to_ctf = NULL;
bool force = false;
struct perf_data_convert_opts opts = {
.force = false,
.all = false,
};
const struct option options[] = {
OPT_INCR('v', "verbose", &verbose, "be more verbose"),
OPT_STRING('i', "input", &input_name, "file", "input file name"),
#ifdef HAVE_LIBBABELTRACE_SUPPORT
OPT_STRING(0, "to-ctf", &to_ctf, NULL, "Convert to CTF format"),
#endif
OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
OPT_BOOLEAN('f', "force", &opts.force, "don't complain, do it"),
OPT_BOOLEAN(0, "all", &opts.all, "Convert all events"),
OPT_END()
};

Expand All @@ -78,7 +83,7 @@ static int cmd_data_convert(int argc, const char **argv,

if (to_ctf) {
#ifdef HAVE_LIBBABELTRACE_SUPPORT
return bt_convert__perf2ctf(input_name, to_ctf, force);
return bt_convert__perf2ctf(input_name, to_ctf, &opts);
#else
pr_err("The libbabeltrace support is not compiled in.\n");
return -1;
Expand Down
105 changes: 73 additions & 32 deletions tools/perf/builtin-record.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,9 @@ rb_find_range(struct perf_evlist *evlist,
return backward_rb_find_range(data, mask, head, start, end);
}

static int record__mmap_read(struct record *rec, int idx)
static int record__mmap_read(struct record *rec, struct perf_evlist *evlist, int idx)
{
struct perf_mmap *md = &rec->evlist->mmap[idx];
struct perf_mmap *md = &evlist->mmap[idx];
u64 head = perf_mmap__read_head(md);
u64 old = md->prev;
u64 end = head, start = old;
Expand All @@ -143,7 +143,7 @@ static int record__mmap_read(struct record *rec, int idx)
void *buf;
int rc = 0;

if (rb_find_range(rec->evlist, data, md->mask, head,
if (rb_find_range(evlist, data, md->mask, head,
old, &start, &end))
return -1;

Expand All @@ -157,7 +157,7 @@ static int record__mmap_read(struct record *rec, int idx)
WARN_ONCE(1, "failed to keep up with mmap data. (warn only once)\n");

md->prev = head;
perf_evlist__mmap_consume(rec->evlist, idx);
perf_evlist__mmap_consume(evlist, idx);
return 0;
}

Expand All @@ -182,7 +182,7 @@ static int record__mmap_read(struct record *rec, int idx)
}

md->prev = head;
perf_evlist__mmap_consume(rec->evlist, idx);
perf_evlist__mmap_consume(evlist, idx);
out:
return rc;
}
Expand Down Expand Up @@ -342,6 +342,40 @@ int auxtrace_record__snapshot_start(struct auxtrace_record *itr __maybe_unused)

#endif

static int record__mmap_evlist(struct record *rec,
struct perf_evlist *evlist)
{
struct record_opts *opts = &rec->opts;
char msg[512];

if (perf_evlist__mmap_ex(evlist, opts->mmap_pages, false,
opts->auxtrace_mmap_pages,
opts->auxtrace_snapshot_mode) < 0) {
if (errno == EPERM) {
pr_err("Permission error mapping pages.\n"
"Consider increasing "
"/proc/sys/kernel/perf_event_mlock_kb,\n"
"or try again with a smaller value of -m/--mmap_pages.\n"
"(current value: %u,%u)\n",
opts->mmap_pages, opts->auxtrace_mmap_pages);
return -errno;
} else {
pr_err("failed to mmap with %d (%s)\n", errno,
strerror_r(errno, msg, sizeof(msg)));
if (errno)
return -errno;
else
return -EINVAL;
}
}
return 0;
}

static int record__mmap(struct record *rec)
{
return record__mmap_evlist(rec, rec->evlist);
}

static int record__open(struct record *rec)
{
char msg[512];
Expand Down Expand Up @@ -378,27 +412,9 @@ static int record__open(struct record *rec)
goto out;
}

if (perf_evlist__mmap_ex(evlist, opts->mmap_pages, false,
opts->auxtrace_mmap_pages,
opts->auxtrace_snapshot_mode) < 0) {
if (errno == EPERM) {
pr_err("Permission error mapping pages.\n"
"Consider increasing "
"/proc/sys/kernel/perf_event_mlock_kb,\n"
"or try again with a smaller value of -m/--mmap_pages.\n"
"(current value: %u,%u)\n",
opts->mmap_pages, opts->auxtrace_mmap_pages);
rc = -errno;
} else {
pr_err("failed to mmap with %d (%s)\n", errno,
strerror_r(errno, msg, sizeof(msg)));
if (errno)
rc = -errno;
else
rc = -EINVAL;
}
rc = record__mmap(rec);
if (rc)
goto out;
}

session->evlist = evlist;
perf_session__set_id_hdr_size(session);
Expand Down Expand Up @@ -482,17 +498,20 @@ static struct perf_event_header finished_round_event = {
.type = PERF_RECORD_FINISHED_ROUND,
};

static int record__mmap_read_all(struct record *rec)
static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evlist)
{
u64 bytes_written = rec->bytes_written;
int i;
int rc = 0;

for (i = 0; i < rec->evlist->nr_mmaps; i++) {
struct auxtrace_mmap *mm = &rec->evlist->mmap[i].auxtrace_mmap;
if (!evlist)
return 0;

if (rec->evlist->mmap[i].base) {
if (record__mmap_read(rec, i) != 0) {
for (i = 0; i < evlist->nr_mmaps; i++) {
struct auxtrace_mmap *mm = &evlist->mmap[i].auxtrace_mmap;

if (evlist->mmap[i].base) {
if (record__mmap_read(rec, evlist, i) != 0) {
rc = -1;
goto out;
}
Expand All @@ -516,6 +535,17 @@ static int record__mmap_read_all(struct record *rec)
return rc;
}

static int record__mmap_read_all(struct record *rec)
{
int err;

err = record__mmap_read_evlist(rec, rec->evlist);
if (err)
return err;

return err;
}

static void record__init_features(struct record *rec)
{
struct perf_session *session = rec->session;
Expand Down Expand Up @@ -656,10 +686,21 @@ perf_event__synth_time_conv(const struct perf_event_mmap_page *pc __maybe_unused
return 0;
}

static const struct perf_event_mmap_page *
perf_evlist__pick_pc(struct perf_evlist *evlist)
{
if (evlist && evlist->mmap && evlist->mmap[0].base)
return evlist->mmap[0].base;
return NULL;
}

static const struct perf_event_mmap_page *record__pick_pc(struct record *rec)
{
if (rec->evlist && rec->evlist->mmap && rec->evlist->mmap[0].base)
return rec->evlist->mmap[0].base;
const struct perf_event_mmap_page *pc;

pc = perf_evlist__pick_pc(rec->evlist);
if (pc)
return pc;
return NULL;
}

Expand Down
2 changes: 1 addition & 1 deletion tools/perf/config/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,7 @@ endif

ifndef NO_SLANG
ifneq ($(feature-libslang), 1)
msg := $(warning slang not found, disables TUI support. Please install slang-devel or libslang-dev);
msg := $(warning slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev);
NO_SLANG := 1
else
# Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h
Expand Down
2 changes: 2 additions & 0 deletions tools/perf/tests/make
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ make_no_libbionic := NO_LIBBIONIC=1
make_no_auxtrace := NO_AUXTRACE=1
make_no_libbpf := NO_LIBBPF=1
make_no_libcrypto := NO_LIBCRYPTO=1
make_with_babeltrace:= LIBBABELTRACE=1
make_tags := tags
make_cscope := cscope
make_help := help
Expand Down Expand Up @@ -136,6 +137,7 @@ run += make_no_libaudit
run += make_no_libbionic
run += make_no_auxtrace
run += make_no_libbpf
run += make_with_babeltrace
run += make_help
run += make_doc
run += make_perf_o
Expand Down
20 changes: 9 additions & 11 deletions tools/perf/ui/browsers/annotate.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,16 +223,14 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
} else if (ins__is_call(dl->ins)) {
ui_browser__write_graph(browser, SLSMG_RARROW_CHAR);
SLsmg_write_char(' ');
} else if (ins__is_ret(dl->ins)) {
ui_browser__write_graph(browser, SLSMG_LARROW_CHAR);
SLsmg_write_char(' ');
} else {
ui_browser__write_nstring(browser, " ", 2);
}
} else {
if (strcmp(dl->name, "retq")) {
ui_browser__write_nstring(browser, " ", 2);
} else {
ui_browser__write_graph(browser, SLSMG_LARROW_CHAR);
SLsmg_write_char(' ');
}
ui_browser__write_nstring(browser, " ", 2);
}

disasm_line__scnprintf(dl, bf, sizeof(bf), !annotate_browser__opts.use_offset);
Expand Down Expand Up @@ -843,14 +841,14 @@ static int annotate_browser__run(struct annotate_browser *browser,
ui_helpline__puts("Huh? No selection. Report to linux-kernel@vger.kernel.org");
else if (browser->selection->offset == -1)
ui_helpline__puts("Actions are only available for assembly lines.");
else if (!browser->selection->ins) {
if (strcmp(browser->selection->name, "retq"))
goto show_sup_ins;
else if (!browser->selection->ins)
goto show_sup_ins;
else if (ins__is_ret(browser->selection->ins))
goto out;
} else if (!(annotate_browser__jump(browser) ||
else if (!(annotate_browser__jump(browser) ||
annotate_browser__callq(browser, evsel, hbt))) {
show_sup_ins:
ui_helpline__puts("Actions are only available for 'callq', 'retq' & jump instructions.");
ui_helpline__puts("Actions are only available for function call/return & jump/branch instructions.");
}
continue;
case 't':
Expand Down
15 changes: 10 additions & 5 deletions tools/perf/util/annotate.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,15 @@ static struct ins_ops nop_ops = {
.scnprintf = nop__scnprintf,
};

static struct ins_ops ret_ops = {
.scnprintf = ins__raw_scnprintf,
};

bool ins__is_ret(const struct ins *ins)
{
return ins->ops == &ret_ops;
}

static struct ins instructions[] = {
{ .name = "add", .ops = &mov_ops, },
{ .name = "addl", .ops = &mov_ops, },
Expand Down Expand Up @@ -444,6 +453,7 @@ static struct ins instructions[] = {
{ .name = "xadd", .ops = &mov_ops, },
{ .name = "xbeginl", .ops = &jump_ops, },
{ .name = "xbeginq", .ops = &jump_ops, },
{ .name = "retq", .ops = &ret_ops, },
};

static int ins__key_cmp(const void *name, const void *insp)
Expand Down Expand Up @@ -1676,11 +1686,6 @@ int symbol__tty_annotate(struct symbol *sym, struct map *map,
return 0;
}

int hist_entry__annotate(struct hist_entry *he, size_t privsize)
{
return symbol__annotate(he->ms.sym, he->ms.map, privsize);
}

bool ui__has_annotation(void)
{
return use_browser == 1 && perf_hpp_list.sym;
Expand Down
Loading

0 comments on commit d905768

Please sign in to comment.