From: Jiri Olsa <jolsa@kernel.org>
To: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
Ingo Molnar <mingo@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
David Ahern <dsahern@gmail.com>, Andi Kleen <ak@linux.intel.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: [PATCH 10/49] perf tools: Add HEADER_DATA_INDEX feature
Date: Tue, 9 Jan 2018 16:34:43 +0100 [thread overview]
Message-ID: <20180109153522.14116-11-jolsa@kernel.org> (raw)
In-Reply-To: <20180109153522.14116-1-jolsa@kernel.org>
From: Namhyung Kim <namhyung@kernel.org>
The HEADER_DATA_INDEX feature is to record index table for sample data
so that they can be processed by multiple thread concurrently. Each
item is a struct perf_file_section which consists of an offset and size.
Link: http://lkml.kernel.org/n/tip-q5rh23fs1qlenc2s9fj0ug7u@git.kernel.org
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
tools/perf/builtin-record.c | 1 +
| 76 +++++++++++++++++++++++++++++++++++++++++++++
| 3 ++
3 files changed, 80 insertions(+)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 385aa9fba282..e52be5593b2f 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -579,6 +579,7 @@ static void record__init_features(struct record *rec)
perf_header__clear_feat(&session->header, HEADER_AUXTRACE);
perf_header__clear_feat(&session->header, HEADER_STAT);
+ perf_header__clear_feat(&session->header, HEADER_DATA_INDEX);
}
static void
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 418608a7c91a..e947a380eddb 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -33,6 +33,7 @@
#include "strbuf.h"
#include "build-id.h"
#include "data.h"
+#include "units.h"
#include <api/fs/fs.h>
#include "asm/bug.h"
#include "tool.h"
@@ -1196,6 +1197,25 @@ static int write_sample_time(struct feat_fd *ff,
sizeof(evlist->last_sample_time));
}
+static int write_data_index(struct feat_fd *ff,
+ struct perf_evlist *evlist __maybe_unused)
+{
+ struct perf_header *ph = ff->ph;
+ int ret;
+ unsigned int i;
+
+ ret = do_write(ff, &ph->nr_index, sizeof(ph->nr_index));
+ if (ret < 0)
+ return ret;
+
+ for (i = 0; i < ph->nr_index; i++) {
+ ret = do_write(ff, &ph->index[i], sizeof(*ph->index));
+ if (ret < 0)
+ return ret;
+ }
+ return 0;
+}
+
static void print_hostname(struct feat_fd *ff, FILE *fp)
{
fprintf(fp, "# hostname : %s\n", ff->ph->env.hostname);
@@ -1543,6 +1563,23 @@ static void print_sample_time(struct feat_fd *ff, FILE *fp)
fprintf(fp, "# sample duration : %10.3f ms\n", d);
}
+static void print_data_index(struct feat_fd *ff, FILE *fp)
+{
+ struct perf_header *ph = ff->ph;
+ unsigned int i;
+
+ fprintf(fp, "# contains data index (%lu) for parallel processing\n",
+ ph->nr_index);
+
+ for (i = 0; i < ph->nr_index; i++) {
+ struct perf_file_section *s = &ph->index[i];
+ char buf[20];
+
+ unit_number__scnprintf(buf, sizeof(buf), s->size);
+ fprintf(fp, "# %u: %s @ %lu\n", i, buf, s->offset);
+ }
+}
+
static int __event_process_build_id(struct build_id_event *bev,
char *filename,
struct perf_session *session)
@@ -2205,6 +2242,44 @@ static int process_sample_time(struct feat_fd *ff, void *data __maybe_unused)
return 0;
}
+static int process_data_index(struct feat_fd *ff, void *data __maybe_unused)
+{
+ struct perf_header *ph = ff->ph;
+ int fd = ff->fd;
+ ssize_t ret;
+ u64 nr_idx;
+ unsigned int i;
+ struct perf_file_section *idx;
+
+ ret = readn(fd, &nr_idx, sizeof(nr_idx));
+ if (ret != sizeof(nr_idx))
+ return -1;
+
+ if (ph->needs_swap)
+ nr_idx = bswap_64(nr_idx);
+
+ idx = calloc(nr_idx, sizeof(*idx));
+ if (idx == NULL)
+ return -1;
+
+ for (i = 0; i < nr_idx; i++) {
+ ret = readn(fd, &idx[i], sizeof(*idx));
+ if (ret != sizeof(*idx)) {
+ free(idx);
+ return -1;
+ }
+
+ if (ph->needs_swap) {
+ idx[i].offset = bswap_64(idx[i].offset);
+ idx[i].size = bswap_64(idx[i].size);
+ }
+ }
+
+ ph->index = idx;
+ ph->nr_index = nr_idx;
+ return 0;
+}
+
struct feature_ops {
int (*write)(struct feat_fd *ff, struct perf_evlist *evlist);
void (*print)(struct feat_fd *ff, FILE *fp);
@@ -2263,6 +2338,7 @@ static const struct feature_ops feat_ops[HEADER_LAST_FEATURE] = {
FEAT_OPN(STAT, stat, false),
FEAT_OPN(CACHE, cache, true),
FEAT_OPR(SAMPLE_TIME, sample_time, false),
+ FEAT_OPN(DATA_INDEX, data_index, true),
};
struct header_print_data {
--git a/tools/perf/util/header.h b/tools/perf/util/header.h
index fa8025fbe90d..cc8b651e779a 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -36,6 +36,7 @@ enum {
HEADER_STAT,
HEADER_CACHE,
HEADER_SAMPLE_TIME,
+ HEADER_DATA_INDEX,
HEADER_LAST_FEATURE,
HEADER_FEAT_BITS = 256,
};
@@ -76,6 +77,8 @@ struct perf_header {
bool needs_swap;
u64 data_offset;
u64 data_size;
+ struct perf_file_section *index;
+ u64 nr_index;
u64 feat_offset;
DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
struct perf_env env;
--
2.13.6
next prev parent reply other threads:[~2018-01-09 15:47 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-09 15:34 [RFC 00/49] perf tools: Add threads to record command Jiri Olsa
2018-01-09 15:34 ` [PATCH 01/49] perf tools: Remove perf_tool from event_op2 Jiri Olsa
2018-01-09 15:34 ` [PATCH 02/49] perf tools: Remove perf_tool from event_op3 Jiri Olsa
2018-01-09 15:34 ` [PATCH 03/49] perf tools: Pass struct perf_mmap into auxtrace_mmap__read* functions Jiri Olsa
2018-01-09 15:34 ` [PATCH 04/49] perf tools: Add struct perf_mmap arg into record__write Jiri Olsa
2018-01-09 15:34 ` [PATCH 05/49] perf tools: Use a software dummy event to track task/mmap events Jiri Olsa
2018-01-09 15:34 ` [PATCH 06/49] perf tools: Create separate mmap for dummy tracking event Jiri Olsa
2018-01-09 15:34 ` [PATCH 07/49] perf tools: Extend perf_evlist__mmap_ex() to use track mmap Jiri Olsa
2018-01-09 15:34 ` [PATCH 08/49] perf report: Skip dummy tracking event Jiri Olsa
2018-01-09 15:34 ` [PATCH 09/49] perf tools: Make copyfile_offset global Jiri Olsa
2018-01-09 15:34 ` Jiri Olsa [this message]
2018-01-09 15:34 ` [PATCH 11/49] perf tools: Handle indexed data file properly Jiri Olsa
2018-01-09 15:34 ` [PATCH 12/49] perf tools: Add perf_data__create_index function Jiri Olsa
2018-01-09 15:34 ` [PATCH 13/49] perf record: Add --index option for building index table Jiri Olsa
2018-01-09 15:34 ` [PATCH 14/49] perf tools: Introduce thread__comm(_str)_by_time() helpers Jiri Olsa
2018-01-09 15:34 ` [PATCH 15/49] perf tools: Add a test case for thread comm handling Jiri Olsa
2018-01-09 15:34 ` [PATCH 16/49] perf tools: Use thread__comm_by_time() when adding hist entries Jiri Olsa
2018-01-09 15:34 ` [PATCH 17/49] perf tools: Convert dead thread list into rbtree Jiri Olsa
2018-01-09 15:34 ` [PATCH 18/49] perf tools: Introduce machine__find*_thread_by_time() Jiri Olsa
2018-01-09 15:34 ` [PATCH 19/49] perf tools: Add thread::exited flag Jiri Olsa
2018-01-09 15:34 ` [PATCH 20/49] perf tools: Add a test case for timed thread handling Jiri Olsa
2018-01-09 15:34 ` [PATCH 21/49] perf tools: Maintain map groups list in a leader thread Jiri Olsa
2018-01-09 15:34 ` [PATCH 22/49] perf tools: Introduce thread__find_addr_location_by_time() and friends Jiri Olsa
2018-01-09 15:34 ` [PATCH 23/49] perf callchain: Use " Jiri Olsa
2018-01-09 15:34 ` [PATCH 24/49] perf tools: Add a test case for timed map groups handling Jiri Olsa
2018-01-09 15:34 ` [PATCH 25/49] perf tools: Save timestamp of a map creation Jiri Olsa
2018-01-09 15:34 ` [PATCH 26/49] perf tools: Introduce map_groups__{insert,find}_by_time() Jiri Olsa
2018-01-09 15:35 ` [PATCH 27/49] perf tools: Use map_groups__find_addr_by_time() Jiri Olsa
2018-01-09 15:35 ` [PATCH 28/49] perf tools: Add testcase for managing maps with time Jiri Olsa
2018-01-09 15:35 ` [PATCH 29/49] perf callchain: Maintain libunwind's address space in map_groups Jiri Olsa
2018-01-09 15:35 ` [PATCH 30/49] perf tools: Rename perf_evlist__munmap_filtered to perf_mmap__put_filtered Jiri Olsa
2018-01-09 15:35 ` [PATCH 31/49] tools lib fd array: Introduce fdarray__add_clone function Jiri Olsa
2018-01-09 15:35 ` [PATCH 32/49] tools lib subcmd: Add OPT_INTEGER_OPTARG|_SET options Jiri Olsa
2018-01-09 15:35 ` [PATCH 33/49] perf tools: Move __perf_session__process_events args into struct Jiri Olsa
2018-01-09 15:35 ` [PATCH 34/49] perf ui progress: Fix index progress display Jiri Olsa
2018-01-09 15:35 ` [PATCH 35/49] perf tools: Add threads debug variable Jiri Olsa
2018-01-09 15:35 ` [PATCH 36/49] perf tools: Add cpu into struct perf_mmap Jiri Olsa
2018-01-09 15:35 ` [PATCH 37/49] perf tools: Add perf_mmap__read_tail function Jiri Olsa
2018-01-09 15:35 ` [PATCH 38/49] perf record: Introduce struct record_thread Jiri Olsa
2018-01-09 15:35 ` [PATCH 39/49] perf record: Read record thread's mmaps Jiri Olsa
2018-01-09 15:35 ` [PATCH 40/49] perf record: Move waking into struct record Jiri Olsa
2018-01-09 15:35 ` [PATCH 41/49] perf record: Move samples into struct record_thread Jiri Olsa
2018-01-09 15:35 ` [PATCH 42/49] perf record: Move bytes_written " Jiri Olsa
2018-01-09 15:35 ` [PATCH 43/49] perf record: Add record_thread start/stop/process functions Jiri Olsa
2018-01-09 15:35 ` [PATCH 44/49] perf record: Wait for all threads being started Jiri Olsa
2018-01-09 15:35 ` [PATCH 45/49] perf record: Add --threads option Jiri Olsa
2018-01-09 15:35 ` [PATCH 46/49] perf record: Add --thread-stats option support Jiri Olsa
2018-01-09 15:35 ` [PATCH 47/49] perf record: Add maps to --thread-stats output Jiri Olsa
2018-01-09 15:35 ` [PATCH 48/49] perf record: Spread maps for --threads option Jiri Olsa
2018-01-09 15:35 ` [PATCH 49/49] perf record: Spread maps for --threads=X option Jiri Olsa
2018-03-07 14:10 ` [RFC 00/49] perf tools: Add threads to record command Jiri Olsa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180109153522.14116-11-jolsa@kernel.org \
--to=jolsa@kernel.org \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=dsahern@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox