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

Commit a1163719 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf updates from Ingo Molnar.

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  ftrace: Make all inline tags also include notrace
  perf: Use css_tryget() to avoid propping up css refcount
  perf tools: Fix synthesizing tracepoint names from the perf.data headers
  perf stat: Fix default output file
  perf tools: Fix endianity swapping for adds_features bitmask
parents 636040b4 6921a575
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -47,9 +47,9 @@
 */
#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
    !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
# define inline		inline		__attribute__((always_inline))
# define __inline__	__inline__	__attribute__((always_inline))
# define __inline	__inline	__attribute__((always_inline))
# define inline		inline		__attribute__((always_inline)) notrace
# define __inline__	__inline__	__attribute__((always_inline)) notrace
# define __inline	__inline	__attribute__((always_inline)) notrace
#else
/* A lot of inline functions can cause havoc with function tracing */
# define inline		inline		notrace
+7 −3
Original line number Diff line number Diff line
@@ -253,9 +253,9 @@ perf_cgroup_match(struct perf_event *event)
	return !event->cgrp || event->cgrp == cpuctx->cgrp;
}

static inline void perf_get_cgroup(struct perf_event *event)
static inline bool perf_tryget_cgroup(struct perf_event *event)
{
	css_get(&event->cgrp->css);
	return css_tryget(&event->cgrp->css);
}

static inline void perf_put_cgroup(struct perf_event *event)
@@ -484,7 +484,11 @@ static inline int perf_cgroup_connect(int fd, struct perf_event *event,
	event->cgrp = cgrp;

	/* must be done before we fput() the file */
	perf_get_cgroup(event);
	if (!perf_tryget_cgroup(event)) {
		event->cgrp = NULL;
		ret = -ENOENT;
		goto out;
	}

	/*
	 * all events in a group must monitor
+7 −1
Original line number Diff line number Diff line
@@ -1179,6 +1179,12 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)
		fprintf(stderr, "cannot use both --output and --log-fd\n");
		usage_with_options(stat_usage, options);
	}

	if (output_fd < 0) {
		fprintf(stderr, "argument to --log-fd must be a > 0\n");
		usage_with_options(stat_usage, options);
	}

	if (!output) {
		struct timespec tm;
		mode = append_file ? "a" : "w";
@@ -1190,7 +1196,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)
		}
		clock_gettime(CLOCK_REALTIME, &tm);
		fprintf(output, "# started on %s\n", ctime(&tm.tv_sec));
	} else if (output_fd != 2) {
	} else if (output_fd > 0) {
		mode = append_file ? "a" : "w";
		output = fdopen(output_fd, mode);
		if (!output) {
+41 −7
Original line number Diff line number Diff line
@@ -1942,7 +1942,6 @@ int perf_file_header__read(struct perf_file_header *header,
		else
			return -1;
	} else if (ph->needs_swap) {
		unsigned int i;
		/*
		 * feature bitmap is declared as an array of unsigned longs --
		 * not good since its size can differ between the host that
@@ -1958,14 +1957,17 @@ int perf_file_header__read(struct perf_file_header *header,
		 * file), punt and fallback to the original behavior --
		 * clearing all feature bits and setting buildid.
		 */
		for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i)
			header->adds_features[i] = bswap_64(header->adds_features[i]);
		mem_bswap_64(&header->adds_features,
			    BITS_TO_U64(HEADER_FEAT_BITS));

		if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
			for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i) {
				header->adds_features[i] = bswap_64(header->adds_features[i]);
				header->adds_features[i] = bswap_32(header->adds_features[i]);
			}
			/* unswap as u64 */
			mem_bswap_64(&header->adds_features,
				    BITS_TO_U64(HEADER_FEAT_BITS));

			/* unswap as u32 */
			mem_bswap_32(&header->adds_features,
				    BITS_TO_U32(HEADER_FEAT_BITS));
		}

		if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
@@ -2091,6 +2093,35 @@ static int read_attr(int fd, struct perf_header *ph,
	return ret <= 0 ? -1 : 0;
}

static int perf_evsel__set_tracepoint_name(struct perf_evsel *evsel)
{
	struct event_format *event = trace_find_event(evsel->attr.config);
	char bf[128];

	if (event == NULL)
		return -1;

	snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name);
	evsel->name = strdup(bf);
	if (event->name == NULL)
		return -1;

	return 0;
}

static int perf_evlist__set_tracepoint_names(struct perf_evlist *evlist)
{
	struct perf_evsel *pos;

	list_for_each_entry(pos, &evlist->entries, node) {
		if (pos->attr.type == PERF_TYPE_TRACEPOINT &&
		    perf_evsel__set_tracepoint_name(pos))
			return -1;
	}

	return 0;
}

int perf_session__read_header(struct perf_session *session, int fd)
{
	struct perf_header *header = &session->header;
@@ -2172,6 +2203,9 @@ int perf_session__read_header(struct perf_session *session, int fd)

	lseek(fd, header->data_offset, SEEK_SET);

	if (perf_evlist__set_tracepoint_names(session->evlist))
		goto out_delete_evlist;

	header->frozen = 1;
	return 0;
out_errno:
+2 −0
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@
#define BITS_PER_LONG __WORDSIZE
#define BITS_PER_BYTE           8
#define BITS_TO_LONGS(nr)       DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
#define BITS_TO_U64(nr)         DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u64))
#define BITS_TO_U32(nr)         DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u32))

#define for_each_set_bit(bit, addr, size) \
	for ((bit) = find_first_bit((addr), (size));		\
Loading