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

Commit 1ed39bac authored by Ingo Molnar's avatar Ingo Molnar
Browse files

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 precise number of samples in at the end of a 'record' session, if
    processing build ids, since we will then traverse the whole perf.data file
    and see all the PERF_RECORD_SAMPLE records, otherwise stop showing the
    previous off-base heuristicly counted number of "samples"  (Namhyung Kim).

  - Support to read compressed module from build-id cache (Namhyung Kim)

 Infrastructure changes:

  - Cache eh/debug frame offset for dwarf unwind (Namhyung Kim)

  - Set header version correctly in all cases (Namhyung Kim)

  - Set attr.task bit for a tracking event, to be consistent (Namhyung Kim)
    perf tools: Use perf_data_file__fd() consistently
    perf symbols: Convert lseek + read to pread

  - Don't rely on malloc working for sz 0, fixing another problem when
    using uClibc (Vineet Gupta)

  - Provide stub for missing pthread_attr_setaffinity_np for libcs where this
    is not available, such as uClibc (Vineet Gupta)

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents b3890e47 c52686f9
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -68,4 +68,17 @@ futex_cmp_requeue(u_int32_t *uaddr, u_int32_t val, u_int32_t *uaddr2, int nr_wak
		 val, opflags);
}

#ifndef HAVE_PTHREAD_ATTR_SETAFFINITY_NP
#include <pthread.h>
static inline int pthread_attr_setaffinity_np(pthread_attr_t *attr,
					      size_t cpusetsize,
					      cpu_set_t *cpuset)
{
	attr = attr;
	cpusetsize = cpusetsize;
	cpuset = cpuset;
	return 0;
}
#endif

#endif /* _FUTEX_H */
+3 −2
Original line number Diff line number Diff line
@@ -343,6 +343,7 @@ static int __cmd_inject(struct perf_inject *inject)
	int ret = -EINVAL;
	struct perf_session *session = inject->session;
	struct perf_data_file *file_out = &inject->output;
	int fd = perf_data_file__fd(file_out);

	signal(SIGINT, sig_handler);

@@ -376,7 +377,7 @@ static int __cmd_inject(struct perf_inject *inject)
	}

	if (!file_out->is_pipe)
		lseek(file_out->fd, session->header.data_offset, SEEK_SET);
		lseek(fd, session->header.data_offset, SEEK_SET);

	ret = perf_session__process_events(session, &inject->tool);

@@ -385,7 +386,7 @@ static int __cmd_inject(struct perf_inject *inject)
			perf_header__set_feat(&session->header,
					      HEADER_BUILD_ID);
		session->header.data_size = inject->bytes_written;
		perf_session__write_header(session, session->evlist, file_out->fd, true);
		perf_session__write_header(session, session->evlist, fd, true);
	}

	return ret;
+48 −22
Original line number Diff line number Diff line
@@ -190,16 +190,30 @@ static int record__open(struct record *rec)
	return rc;
}

static int process_sample_event(struct perf_tool *tool,
				union perf_event *event,
				struct perf_sample *sample,
				struct perf_evsel *evsel,
				struct machine *machine)
{
	struct record *rec = container_of(tool, struct record, tool);

	rec->samples++;

	return build_id__mark_dso_hit(tool, event, sample, evsel, machine);
}

static int process_buildids(struct record *rec)
{
	struct perf_data_file *file  = &rec->file;
	struct perf_session *session = rec->session;
	u64 start = session->header.data_offset;

	u64 size = lseek(file->fd, 0, SEEK_CUR);
	u64 size = lseek(perf_data_file__fd(file), 0, SEEK_CUR);
	if (size == 0)
		return 0;

	file->size = size;

	/*
	 * During this process, it'll load kernel map and replace the
	 * dso->long_name to a real pathname it found.  In this case
@@ -211,9 +225,7 @@ static int process_buildids(struct record *rec)
	 */
	symbol_conf.ignore_vmlinux_buildid = true;

	return __perf_session__process_events(session, start,
					      size - start,
					      size, &build_id__mark_dso_hit_ops);
	return perf_session__process_events(session, &rec->tool);
}

static void perf_event__synthesize_guest_os(struct machine *machine, void *data)
@@ -322,6 +334,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
	struct perf_data_file *file = &rec->file;
	struct perf_session *session;
	bool disabled = false, draining = false;
	int fd;

	rec->progname = argv[0];

@@ -336,6 +349,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
		return -1;
	}

	fd = perf_data_file__fd(file);
	rec->session = session;

	record__init_features(rec);
@@ -360,12 +374,11 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
		perf_header__clear_feat(&session->header, HEADER_GROUP_DESC);

	if (file->is_pipe) {
		err = perf_header__write_pipe(file->fd);
		err = perf_header__write_pipe(fd);
		if (err < 0)
			goto out_child;
	} else {
		err = perf_session__write_header(session, rec->evlist,
						 file->fd, false);
		err = perf_session__write_header(session, rec->evlist, fd, false);
		if (err < 0)
			goto out_child;
	}
@@ -397,7 +410,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
			 * return this more properly and also
			 * propagate errors that now are calling die()
			 */
			err = perf_event__synthesize_tracing_data(tool, file->fd, rec->evlist,
			err = perf_event__synthesize_tracing_data(tool,	fd, rec->evlist,
								  process_synthesized_event);
			if (err <= 0) {
				pr_err("Couldn't record tracing data.\n");
@@ -504,19 +517,9 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
		goto out_child;
	}

	if (!quiet) {
	if (!quiet)
		fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking);

		/*
		 * Approximate RIP event size: 24 bytes.
		 */
		fprintf(stderr,
			"[ perf record: Captured and wrote %.3f MB %s (~%" PRIu64 " samples) ]\n",
			(double)rec->bytes_written / 1024.0 / 1024.0,
			file->path,
			rec->bytes_written / 24);
	}

out_child:
	if (forks) {
		int exit_status;
@@ -535,13 +538,29 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
	} else
		status = err;

	/* this will be recalculated during process_buildids() */
	rec->samples = 0;

	if (!err && !file->is_pipe) {
		rec->session->header.data_size += rec->bytes_written;

		if (!rec->no_buildid)
			process_buildids(rec);
		perf_session__write_header(rec->session, rec->evlist,
					   file->fd, true);
		perf_session__write_header(rec->session, rec->evlist, fd, true);
	}

	if (!err && !quiet) {
		char samples[128];

		if (rec->samples)
			scnprintf(samples, sizeof(samples),
				  " (%" PRIu64 " samples)", rec->samples);
		else
			samples[0] = '\0';

		fprintf(stderr,	"[ perf record: Captured and wrote %.3f MB %s%s ]\n",
			perf_data_file__size(file) / 1024.0 / 1024.0,
			file->path, samples);
	}

out_delete_session:
@@ -720,6 +739,13 @@ static struct record record = {
			.default_per_cpu = true,
		},
	},
	.tool = {
		.sample		= process_sample_event,
		.fork		= perf_event__process_fork,
		.comm		= perf_event__process_comm,
		.mmap		= perf_event__process_mmap,
		.mmap2		= perf_event__process_mmap2,
	},
};

#define CALLCHAIN_HELP "setup and enables call-graph (stack chain/backtrace) recording: "
+6 −0
Original line number Diff line number Diff line
@@ -198,6 +198,7 @@ CORE_FEATURE_TESTS = \
	libpython-version		\
	libslang			\
	libunwind			\
	pthread-attr-setaffinity-np	\
	stackprotector-all		\
	timerfd				\
	libdw-dwarf-unwind		\
@@ -226,6 +227,7 @@ VF_FEATURE_TESTS = \
	libelf-getphdrnum		\
	libelf-mmap			\
	libpython-version		\
	pthread-attr-setaffinity-np	\
	stackprotector-all		\
	timerfd				\
	libunwind-debug-frame		\
@@ -301,6 +303,10 @@ ifeq ($(feature-sync-compare-and-swap), 1)
  CFLAGS += -DHAVE_SYNC_COMPARE_AND_SWAP_SUPPORT
endif

ifeq ($(feature-pthread-attr-setaffinity-np), 1)
  CFLAGS += -DHAVE_PTHREAD_ATTR_SETAFFINITY_NP
endif

ifndef NO_BIONIC
  $(call feature_check,bionic)
  ifeq ($(feature-bionic), 1)
+4 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ FILES= \
	test-libslang.bin		\
	test-libunwind.bin		\
	test-libunwind-debug-frame.bin	\
	test-pthread-attr-setaffinity-np.bin	\
	test-stackprotector-all.bin	\
	test-timerfd.bin		\
	test-libdw-dwarf-unwind.bin	\
@@ -47,6 +48,9 @@ test-all.bin:
test-hello.bin:
	$(BUILD)

test-pthread-attr-setaffinity-np.bin:
	$(BUILD) -Werror -lpthread

test-stackprotector-all.bin:
	$(BUILD) -Werror -fstack-protector-all

Loading