From: Jiri Olsa <jolsa@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: Jiri Olsa <jolsa@redhat.com>,
Corey Ashford <cjashfor@linux.vnet.ibm.com>,
Frederic Weisbecker <fweisbec@gmail.com>,
Ingo Molnar <mingo@elte.hu>, Namhyung Kim <namhyung@kernel.org>,
Paul Mackerras <paulus@samba.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Arnaldo Carvalho de Melo <acme@redhat.com>,
Andi Kleen <ak@linux.intel.com>, David Ahern <dsahern@gmail.com>
Subject: [PATCH 16/23] perf tools: Add perf.data version 3 header write
Date: Wed, 17 Jul 2013 19:49:56 +0200 [thread overview]
Message-ID: <1374083403-14591-17-git-send-email-jolsa@redhat.com> (raw)
In-Reply-To: <1374083403-14591-1-git-send-email-jolsa@redhat.com>
Adding perf data version 3 header write code and
switch perf tool storing to version 3.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
---
tools/perf/Documentation/perf-data-file-v2.txt | 5 +-
tools/perf/builtin-inject.c | 2 +-
tools/perf/builtin-record.c | 5 +-
tools/perf/tests/session-simple.c | 4 +-
| 70 ++++++++------------------
| 6 ++-
6 files changed, 35 insertions(+), 57 deletions(-)
diff --git a/tools/perf/Documentation/perf-data-file-v2.txt b/tools/perf/Documentation/perf-data-file-v2.txt
index 3931dca..ae607ce 100644
--- a/tools/perf/Documentation/perf-data-file-v2.txt
+++ b/tools/perf/Documentation/perf-data-file-v2.txt
@@ -1,7 +1,8 @@
perf-data-file-v2(1)
====================
-Following text describes version 2 of the perf data file format,
-which is version that is currently used by perf tool.
+Following text describes version 2 of the perf data file format.
+The perf tool supports this format for reading, but for writing
+it uses version 3 format perf-data-file-v3(1).
The perf data file format is composed of several sections
describing monitored events and the data itself.
diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index 1d8de2e..8fcaf77 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -374,7 +374,7 @@ static int __cmd_inject(struct perf_inject *inject)
if (!inject->pipe_output) {
session->header.data_size = inject->bytes_written;
- perf_session__write_header(session, session->evlist, inject->output, true);
+ perf_session__write_header(session, session->evlist, inject->output);
}
perf_session__delete(session);
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index a41ac415..fcd0baf 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -277,7 +277,7 @@ static void perf_record__exit(int status, void *arg)
if (!rec->no_buildid)
process_buildids(rec);
perf_session__write_header(rec->session, rec->evlist,
- rec->output, true);
+ rec->output);
perf_session__delete(rec->session);
perf_evlist__delete(rec->evlist);
symbol__exit();
@@ -448,8 +448,7 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
if (err < 0)
goto out_delete_session;
} else {
- err = perf_session__write_header(session, evsel_list,
- output, false);
+ err = perf_session__prepare_header(output);
if (err < 0)
goto out_delete_session;
}
diff --git a/tools/perf/tests/session-simple.c b/tools/perf/tests/session-simple.c
index 3bcd7eb..3a34843 100644
--- a/tools/perf/tests/session-simple.c
+++ b/tools/perf/tests/session-simple.c
@@ -133,7 +133,7 @@ static int session_write(void)
perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
TEST_ASSERT_VAL("failed to write header",
- !perf_session__write_header(session, evlist, fd, false));
+ !perf_session__prepare_header(fd));
TEST_ASSERT_VAL("failed to store MMAP event",
!store_event(fd, get_event_MMAP(), &size));
@@ -144,7 +144,7 @@ static int session_write(void)
session->header.data_size += size;
TEST_ASSERT_VAL("failed to write header",
- !perf_session__write_header(session, evlist, fd, true));
+ !perf_session__write_header(session, evlist, fd));
perf_session__delete(session);
perf_evlist__delete(evlist);
--git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 50f0d9a..f5b7529 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -44,7 +44,7 @@ static const u64 __perf_magic2_sw = 0x50455246494c4532ULL;
static const u64 __perf_magic3 = 0x33454c4946524550ULL;
static const u64 __perf_magic3_sw = 0x50455246494c4533ULL;
-#define PERF_MAGIC __perf_magic2
+#define PERF_MAGIC __perf_magic3
struct perf_file_attr {
struct perf_event_attr attr;
@@ -2239,6 +2239,7 @@ static int perf_header__adds_write(struct perf_header *header,
perf_header__clear_feat(header, feat);
}
+ header->feat_size = lseek(fd, 0, SEEK_CUR) - sec_start;
lseek(fd, sec_start, SEEK_SET);
/*
* may write more than needed due to dropped feature, but
@@ -2270,72 +2271,46 @@ int perf_header__write_pipe(int fd)
return 0;
}
+int perf_session__prepare_header(int fd)
+{
+ off_t off = lseek(fd, PERF_FILE_HEADER__DATA_OFFSET, SEEK_SET);
+ return off == PERF_FILE_HEADER__DATA_OFFSET ? 0 : -1;
+}
+
int perf_session__write_header(struct perf_session *session,
struct perf_evlist *evlist,
- int fd, bool at_exit)
+ int fd)
{
struct perf_file_header f_header;
struct perf_file_attr f_attr;
struct perf_header *header = &session->header;
- struct perf_evsel *evsel;
- u64 attr_offset;
int err;
- lseek(fd, sizeof(f_header), SEEK_SET);
-
- list_for_each_entry(evsel, &evlist->entries, node) {
- evsel->id_offset = lseek(fd, 0, SEEK_CUR);
- err = do_write(fd, evsel->id, evsel->ids * sizeof(u64));
- if (err < 0) {
- pr_debug("failed to write perf header\n");
- return err;
- }
- }
-
- attr_offset = lseek(fd, 0, SEEK_CUR);
-
- list_for_each_entry(evsel, &evlist->entries, node) {
- f_attr = (struct perf_file_attr){
- .attr = evsel->attr,
- .ids = {
- .offset = evsel->id_offset,
- .size = evsel->ids * sizeof(u64),
- }
- };
- err = do_write(fd, &f_attr, sizeof(f_attr));
- if (err < 0) {
- pr_debug("failed to write perf header attribute\n");
- return err;
- }
- }
-
- header->data_offset = lseek(fd, 0, SEEK_CUR);
- header->feat_offset = header->data_offset + header->data_size;
+ header->feat_offset = PERF_FILE_HEADER__DATA_OFFSET +
+ header->data_size;
- if (at_exit) {
- err = perf_header__adds_write(header, evlist, fd);
- if (err < 0)
- return err;
- }
+ err = perf_header__adds_write(header, evlist, fd);
+ if (err < 0)
+ return err;
f_header = (struct perf_file_header){
.magic = PERF_MAGIC,
.size = sizeof(f_header),
.attr_size = sizeof(f_attr),
- .v2 = {
- .attrs = {
- .offset = attr_offset,
- .size = evlist->nr_entries * sizeof(f_attr),
- },
+ .v3 = {
.data = {
- .offset = header->data_offset,
+ .offset = PERF_FILE_HEADER__DATA_OFFSET,
.size = header->data_size,
},
- /* event_types is ignored, store zeros */
+ .features = {
+ .offset = header->feat_offset,
+ .size = header->feat_size,
+ },
},
};
- memcpy(&f_header.v2.adds_features, &header->adds_features, sizeof(header->adds_features));
+ memcpy(&f_header.v3.adds_features, &header->adds_features,
+ sizeof(header->adds_features));
lseek(fd, 0, SEEK_SET);
err = do_write(fd, &f_header, sizeof(f_header));
@@ -2343,7 +2318,6 @@ int perf_session__write_header(struct perf_session *session,
pr_debug("failed to write perf header\n");
return err;
}
- lseek(fd, header->data_offset + header->data_size, SEEK_SET);
return 0;
}
--git a/tools/perf/util/header.h b/tools/perf/util/header.h
index bcd3e64..4982e04 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -53,6 +53,8 @@ struct perf_file_header_v2 {
DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
};
+#define PERF_FILE_HEADER__DATA_OFFSET (sizeof(struct perf_file_header))
+
struct perf_file_header_v3 {
struct perf_file_section data;
struct perf_file_section features;
@@ -111,6 +113,7 @@ struct perf_header {
u64 data_offset;
u64 data_size;
u64 feat_offset;
+ u64 feat_size;
DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
struct perf_session_env env;
};
@@ -119,9 +122,10 @@ struct perf_evlist;
struct perf_session;
int perf_session__read_header(struct perf_session *session);
+int perf_session__prepare_header(int fd);
int perf_session__write_header(struct perf_session *session,
struct perf_evlist *evlist,
- int fd, bool at_exit);
+ int fd);
int perf_header__write_pipe(int fd);
void perf_header__set_feat(struct perf_header *header, int feat);
--
1.7.11.7
next prev parent reply other threads:[~2013-07-17 17:53 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-17 17:49 [RFC 0/23] perf tool: Add support for multiple data file storage Jiri Olsa
2013-07-17 17:49 ` [PATCH 01/23] perf tools: Use session->fd instead of passing fd as argument Jiri Olsa
2013-07-19 7:54 ` [tip:perf/core] perf session: Use session-> fd " tip-bot for Jiri Olsa
2013-07-17 17:49 ` [PATCH 02/23] perf tools: Remove data_offset seek as it's not needed Jiri Olsa
2013-07-18 7:27 ` Namhyung Kim
2013-07-18 12:46 ` Jiri Olsa
2013-07-19 7:54 ` [tip:perf/core] perf header: Remove data_offset seek as it' s " tip-bot for Jiri Olsa
2013-07-17 17:49 ` [PATCH 03/23] perf tools: Remove attr_offset from perf_header Jiri Olsa
2013-07-19 7:54 ` [tip:perf/core] perf header: " tip-bot for Jiri Olsa
2013-07-17 17:49 ` [PATCH 04/23] perf tools: Introduce feat_offset into perf_header Jiri Olsa
2013-07-19 7:54 ` [tip:perf/core] perf header: " tip-bot for Jiri Olsa
2013-07-17 17:49 ` [PATCH 05/23] perf tests: Add simple session read/write test Jiri Olsa
2013-07-18 7:46 ` Namhyung Kim
2013-07-18 12:52 ` Jiri Olsa
[not found] ` <20130717193313.GA5127@infradead.org>
2013-07-18 12:52 ` Jiri Olsa
2013-07-18 14:26 ` Jiri Olsa
2013-07-17 17:49 ` [PATCH 06/23] perf doc: Add perf data file documentation Jiri Olsa
2013-07-17 19:59 ` Arnaldo Carvalho de Melo
2013-07-18 12:40 ` Jiri Olsa
2013-07-19 15:46 ` Andi Kleen
2013-07-17 17:49 ` [PATCH 07/23] perf tools: Recognize version number for perf data file Jiri Olsa
2013-07-19 7:54 ` [tip:perf/core] perf header: " tip-bot for Jiri Olsa
2013-07-17 17:49 ` [PATCH 08/23] perf tools: Introduce perf data file version CHECK macro Jiri Olsa
[not found] ` <20130717194250.GB5127@infradead.org>
2013-07-18 12:39 ` Jiri Olsa
2013-07-17 17:49 ` [PATCH 09/23] perf tools: Introduce swap_features function Jiri Olsa
2013-07-17 17:49 ` [PATCH 10/23] perf tools: Introduce swap_header function Jiri Olsa
2013-07-19 11:33 ` Namhyung Kim
2013-07-22 13:44 ` Jiri Olsa
2013-07-17 17:49 ` [PATCH 11/23] perf tools: Separate version 2 specific perf data header bits Jiri Olsa
2013-07-17 17:49 ` [PATCH 12/23] perf tools: Using evlist as a holder for event_desc feature Jiri Olsa
2013-07-17 17:49 ` [PATCH 13/23] perf tools: Introduce perf.data version 3 format Jiri Olsa
2013-07-19 12:06 ` Namhyung Kim
2013-07-22 10:00 ` Jiri Olsa
2013-07-17 17:49 ` [PATCH 14/23] perf tools: Add perf data version 3 header swap Jiri Olsa
2013-07-17 17:49 ` [PATCH 15/23] perf tools: Add perf data version 3 header read Jiri Olsa
2013-07-19 12:11 ` Namhyung Kim
2013-07-22 10:02 ` Jiri Olsa
2013-07-17 17:49 ` Jiri Olsa [this message]
2013-07-17 17:49 ` [PATCH 17/23] perf tools: Get rid of post_processing_offset in record command Jiri Olsa
2013-07-17 17:49 ` [PATCH 18/23] perf tools: Move synthetizing into single function Jiri Olsa
2013-07-19 12:30 ` Namhyung Kim
2013-07-22 10:15 ` Jiri Olsa
2013-07-17 17:49 ` [PATCH 19/23] perf tools: Add data object to handle perf data file Jiri Olsa
2013-07-17 17:50 ` [PATCH 20/23] perf tools: Add perf_data_file__open interface to data object Jiri Olsa
2013-07-17 17:50 ` [PATCH 21/23] perf tools: Separating data file properties from session Jiri Olsa
2013-07-17 17:50 ` [PATCH 22/23] perf tools: Add multi file '-M' option for record command Jiri Olsa
2013-07-19 13:02 ` Namhyung Kim
2013-07-22 10:17 ` Jiri Olsa
2013-07-17 17:50 ` [PATCH 23/23] perf tools: Have the process properly sythesized in subsequent data files 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=1374083403-14591-17-git-send-email-jolsa@redhat.com \
--to=jolsa@redhat.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@redhat.com \
--cc=ak@linux.intel.com \
--cc=cjashfor@linux.vnet.ibm.com \
--cc=dsahern@gmail.com \
--cc=fweisbec@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=namhyung@kernel.org \
--cc=paulus@samba.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;
as well as URLs for NNTP newsgroup(s).