Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d905768c authored by Ingo Molnar's avatar Ingo Molnar
Browse files

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

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

 - 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents d4cf1949 ebccba3f
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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]
+17 −0
Original line number Diff line number Diff line
@@ -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
};

@@ -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
};

+8 −3
Original line number Diff line number Diff line
@@ -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);
@@ -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()
	};

@@ -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;
+73 −32
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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;
	}

@@ -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;
}
@@ -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];
@@ -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);
@@ -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;
			}
@@ -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;
@@ -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;
}

+1 −1
Original line number Diff line number Diff line
@@ -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
Loading